import argparse from collections import OrderedDict import fiona import shapely.geometry from fiona.crs import CRS from fiona.transform import transform_geom from shapely.wkt import dumps # data from https://www.naturalearthdata.com/downloads/50m-cultural-vectors/ ZIP_FILE = '/home/philipp/daten/GeoData/naturalearth/v5.1/ne_50m_admin_0_countries.zip' LAYER_NAME = 'ne_50m_admin_0_countries' def load_country(country_name: str): with fiona.open(f'zip://{ZIP_FILE}', layer=LAYER_NAME) as src: for feature in src: properties = feature['properties'] if properties['NAME'] == country_name: return feature['geometry'], src.crs def simplify_inner(country, crs): metric_crs = CRS.from_epsg(32632) # Western Austria (UTM32) country = transform_geom(crs, metric_crs, country) country = shapely.geometry.shape(country) country = country.buffer(-5000) country = country.simplify(tolerance=5000) country = shapely.geometry.mapping(country) country = transform_geom(metric_crs, crs, country) return country def save_country(country, crs, name, shapefile): schema = { 'geometry': 'Polygon', 'properties': OrderedDict([('name', 'str')]) } with fiona.open(shapefile, 'w', crs=crs, schema=schema, driver='Shapefile') as c: feature = { 'geometry': country, 'properties': OrderedDict([('name', name)]), } c.write(feature) def print_wkt(country): country = shapely.geometry.shape(country) print(dumps(country, rounding_precision=3)) def main(country_name: str, shapefile: str | None): country, crs = load_country(country_name) simplified_country = simplify_inner(country, crs) if shapefile: save_country(simplified_country, crs, country_name, shapefile) print_wkt(simplified_country) if __name__ == '__main__': parser = argparse.ArgumentParser(description='Creates a simplified version of a country') parser.add_argument('--country', default='Austria', help='Country to simplify (e.g. Switzerland)') parser.add_argument('--shapefile', help='Write result to shape file with this name') args = parser.parse_args() main(args.country, args.shapefile)