Added pyrate as a direct dependency.
This commit is contained in:
64
pyrate/scripts/create_chart_db_from_geojson.py
Normal file
64
pyrate/scripts/create_chart_db_from_geojson.py
Normal file
@ -0,0 +1,64 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
"""Create a database from a given GeoJSON input file. Intended to quickly create test databases.
|
||||
|
||||
It assumes the same structure as the one generated by `geojson.io <https://geojson.io/>`__ and only supports
|
||||
polygons.
|
||||
"""
|
||||
|
||||
# Standard library
|
||||
from argparse import ArgumentDefaultsHelpFormatter
|
||||
from argparse import ArgumentParser
|
||||
import json
|
||||
|
||||
# Database and charts
|
||||
from typing import Generator
|
||||
|
||||
# Math
|
||||
from numpy import array
|
||||
|
||||
# Pyrate
|
||||
from pyrate.common.charts import SpatialiteDatabase
|
||||
from pyrate.plan.geometry import LocationType
|
||||
from pyrate.plan.geometry import PolarPolygon
|
||||
|
||||
|
||||
def read_geojson(
|
||||
path: str, location_type: LocationType = LocationType.LAND
|
||||
) -> Generator[PolarPolygon, None, None]:
|
||||
"""Reads a GeoJSON file (only supports specific constructs, see module documentation).
|
||||
|
||||
Args:
|
||||
path: the input file
|
||||
location_type: the location type of all chart objects
|
||||
"""
|
||||
|
||||
with open(path, "r", encoding="utf-8") as input_file:
|
||||
json_data = json.load(input_file)
|
||||
|
||||
assert json_data["type"] == "FeatureCollection"
|
||||
for feature in json_data["features"]:
|
||||
assert feature["type"] == "Feature"
|
||||
geometry = feature["geometry"]
|
||||
assert geometry["type"] == "Polygon"
|
||||
coordinates = geometry["coordinates"]
|
||||
assert len(coordinates) == 1, "the polygon may have exactly one exterior and zero interior rings"
|
||||
exterior = coordinates[0]
|
||||
yield PolarPolygon.from_numpy(array(exterior), location_type=location_type)
|
||||
|
||||
|
||||
def _main() -> None:
|
||||
"""The main function."""
|
||||
parser = ArgumentParser(description=__doc__, formatter_class=ArgumentDefaultsHelpFormatter)
|
||||
parser.add_argument(
|
||||
"path_to_geojson", type=str, help='The input file, usually ends with ".json", UTF-8 encoding'
|
||||
)
|
||||
parser.add_argument("path_to_db", type=str, help='The output file, usually ends with ".sqlite"')
|
||||
args = parser.parse_args()
|
||||
|
||||
with SpatialiteDatabase(args.path_to_db) as database:
|
||||
database.write_geometries(read_geojson(args.path_to_geojson), update=True)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
_main()
|
Reference in New Issue
Block a user