Source code for ants.cli.ancil_create_shapefile
#!/usr/bin/env python
# (C) Crown Copyright, Met Office. All rights reserved.
#
# This file is part of ANTS and is released under the BSD 3-Clause license.
# See LICENSE.txt in the root of the repository for full licensing details.
"""
Shapefile creation application
******************************
Creates and saves a shapefile from a list of pairs of longitude, latitude
points defining a single polygon in a specified polygon file.
"""
import argparse
import json
import numpy as np
from osgeo import ogr
from shapely.geometry import Polygon
def _load_polygon_from_json(json_file):
"""
Load a json file containing a list of pairs of longitude, latitude points
to create a polygon from.
Parameters
----------
json_file : str
Path to json file
Returns
-------
: :class:`~shapely.geometry.Polygon`
"""
with open(json_file, "r") as polygon_json:
polygon = json.load(polygon_json)
polygon = np.array(polygon)
polygon = Polygon(polygon)
return polygon
[docs]
def main(json_file, output):
"""
Loads in a provided json file that defines pairs of longitude, latitude
points to create a polygon from. That polygon is then used to create a
shape file that is saved to the specified output location.
Parameters
----------
json_file : str
Path to json file
output : str
Location to store generated shape file
"""
# Load a json and make a polygon
polygon = _load_polygon_from_json(json_file)
# Now convert it to a shapefile with OGR
driver = ogr.GetDriverByName("Esri Shapefile")
datasource = driver.CreateDataSource(output)
layer = datasource.CreateLayer("", None, ogr.wkbPolygon)
# Add one attribute
layer.CreateField(ogr.FieldDefn("id", ogr.OFTInteger))
defn = layer.GetLayerDefn()
# Create a new feature (attribute and geometry)
feature = ogr.Feature(defn)
feature.SetField("id", 123)
# Make a geometry, from Shapely object
geometry = ogr.CreateGeometryFromWkb(polygon.wkb)
feature.SetGeometry(geometry)
layer.CreateFeature(feature)
feature = geometry = None # destroy these
# Save and close everything
datasource = layer = feature = geometry = None
def _get_parser():
parser = argparse.ArgumentParser()
parser.add_argument(
"json_file", help="Path to json file defining polygon to generate."
)
parser.add_argument("output", help="File to save shape file to.")
return parser
[docs]
def cli_interface():
parser = _get_parser()
args = parser.parse_args()
main(args.json_file, args.output)
if __name__ == "__main__":
cli_interface()