diff --git a/core/management/commands/addgeo.py b/core/management/commands/addgeo.py index 53d587a..50cf6af 100644 --- a/core/management/commands/addgeo.py +++ b/core/management/commands/addgeo.py @@ -26,12 +26,31 @@ class Command(BaseCommand): Region.objects.all().delete() Country.objects.all().delete() - # load GADM data data source + # load GADM data ds = DataSource('datasets/gadm36_ESP.gpkg') + logging.info('GeoPackage data:') + for layer in ds: + logging.info(f"Layer {layer.name}:\n\t- Layers: {len(layer)}\n\t- Type: {layer.geom_type.name}\n\t- Features: {layer.num_feat}") # create country for spain - country_ds = ds[0] - country = Country.objects.create(name='España') + # country = Country.objects.create(name='España') + # country instances + logging.info("loading country instances") + country_counter = 0 + for feature in ds[0]: + # calculate geometry data + geom = GEOSGeometry(str(feature.geom)) + polygon_list = [] + for polygon in geom: + polygon_list.append(polygon) + geom_geos = MultiPolygon(polygon_list) + # create instance + name = feature.get('NAME_0') + if name == 'Spain': + SPAIN = Country.objects.create(name='España',geo=geom_geos) + Country.objects.create(name=name,geo=geom_geos) + country_counter += 1 + logging.info(f"Country instance created for: {name}") locations_file = 'datasets/locations.json' locations = json.loads(open(locations_file).read()) @@ -40,7 +59,6 @@ class Command(BaseCommand): geo_file='datasets/gadm36_ESP.json' # geo boundary data for regions geo_data = json.loads(open(geo_file).read()) - logging.info("Starting Region creation") print("Starting Region creation") region_counter = 0 @@ -48,28 +66,24 @@ class Command(BaseCommand): if location['model'] == 'locations.region': logging.info(f"Creating Region instance {location['fields']['name']}...") new_region = None - name = location['fields']['name'] # Bypass for lack of geo data on ceuta and melilla if name in ('Ceuta', 'Melilla'): - new_region = Region.objects.create(name=name, country=country, id=location['pk']) + new_region = Region.objects.create(name=name, country=SPAIN, id=location['pk']) logging.info(f"Region {name} created (without GADM data)") else: - for feature in geo_data['features']: - if feature['properties']['NAME_1'] == name: + for feature in ds[1]: + if feature.get('NAME_1') == name: logging.debug(f"Region {name} found in GADM data") # calculate geometry data - geom = GEOSGeometry(str(feature['geometry'])) - if feature['geometry']['type'] == "MultiPolygon": - poly_list = [] - for poly in geom: - poly_list.append(poly) - else: - poly_list = geom - geom_geos = MultiPolygon(poly_list) + geom = GEOSGeometry(str(feature.geom)) + polygon_list = [] + for polygon in geom: + polygon_list.append(polygon) + geom_geos = MultiPolygon(polygon_list) # create instance new_region = Region.objects.create( - name=name, country=country, geo=geom_geos, id=location['pk'] + name=name, country=SPAIN, geo=geom_geos, id=location['pk'] ) logging.info(f"Region {name} created") region_counter += 1 @@ -85,10 +99,27 @@ class Command(BaseCommand): if location['model'] == 'locations.province': logging.info(f"Creating Province instance {location['fields']['name']}...") name = location['fields']['name'] - # get parent region - parent_region = Region.objects.get(id=location['fields']['region']) - Province.objects.create(name=name, region=parent_region, id=location['pk']) - province_counter += 1 + new_province = None + for feature in ds[2]: + import ipdb; ipdb.set_trace() + if feature.get('NAME_1') == name: + logging.debug(f"Province {name} found in GADM data") + # calculate geometry data + geom = GEOSGeometry(str(feature.geom)) + polygon_list = [] + for polygon in geom: + polygon_list.append(polygon) + geom_geos = MultiPolygon(polygon_list) + # create instance + parent_region = Region.objects.get(id=location['fields']['region']) + new_province = Province.objects.create( + name=name, region=parent_region, geo=geom_geos, id=location['pk'] + ) + logging.info(f"Province {name} created") + region_counter += 1 + break + if new_province is None: + logging.warning(f"No province named {name} found in GADM data") # CITIES print("Starting City creation") diff --git a/core/management/commands/loadgisdata.py b/core/management/commands/loadgisdata.py new file mode 100644 index 0000000..8a2caa5 --- /dev/null +++ b/core/management/commands/loadgisdata.py @@ -0,0 +1,118 @@ +import logging +import json + +from django.core.management.base import BaseCommand +from django.conf import settings + +from django.contrib.gis.geos import GeometryCollection, GEOSGeometry +from django.contrib.gis.geos import MultiPolygon +from django.contrib.gis.gdal import DataSource + + +from geo.models import Country, Region, Province, City + + +class Command(BaseCommand): + + help = 'Load GIS data into database' + + def handle(self, *args, **kwargs): + + print(self.help) + + + ds = DataSource('datasets/gadm36_ESP.gpkg') + + for layer in ds: + print(f"Layer {layer.name}:\n \ + \t- Layers: {len(layer)}\n \ + \t- Type: {layer.geom_type.name}\n\ + \t- Features: {layer.num_feat}") + + # country instances + logging.info("loading country instances") + country_counter = 0 + for feature in ds[0]: + geom = GEOSGeometry(str(feature['geometry'])) + if feature['geometry']['type'] == "MultiPolygon": + poly_list = [] + for poly in geom: + poly_list.append(poly) + print(poly_list) + else: + poly_list = geom + + geom_geos = MultiPolygon(poly_list) + + name = feature['properties']['NAME_1'] + if name == 'España': + SPAIN = Country.objects.create(name=name,poly=geom_geos) + Country.objects.create(name=name,poly=geom_geos) + country_counter += 1 + logging.info(f"Country instance created for: {name}") + + # region instances + logging.info("loading region instances") + region_counter = 0 + for feature in ds[1]: + geom = GEOSGeometry(str(feature['geometry'])) + if feature['geometry']['type'] == "MultiPolygon": + poly_list = [] + for poly in geom: + poly_list.append(poly) + print(poly_list) + else: + poly_list = geom + + geom_geos = MultiPolygon(poly_list) + + name = feature['properties']['NAME_1'] + Region.objects.create(name=name,poly=geom_geos, country=SPAIN) + region_counter += 1 + logging.info(f"Region instance created for: {name}") + + # province instances + logging.info("loading province instances") + province_counter = 0 + for feature in ds[2]: + geom = GEOSGeometry(str(feature['geometry'])) + if feature['geometry']['type'] == "MultiPolygon": + poly_list = [] + for poly in geom: + poly_list.append(poly) + print(poly_list) + else: + poly_list = geom + + geom_geos = MultiPolygon(poly_list) + + name = feature['properties']['NAME_1'] + parent_region = Region.objects.get(id=location['fields']['region']) + Province.objects.create(name=name,poly=geom_geos, country=SPAIN) + province_counter += 1 + logging.info(f"Province instance created for: {name}") + + # city instances + logging.info("loading city instances") + city_counter = 0 + for feature in ds[4]: + geom = GEOSGeometry(str(feature['geometry'])) + if feature['geometry']['type'] == "MultiPolygon": + poly_list = [] + for poly in geom: + poly_list.append(poly) + print(poly_list) + else: + poly_list = geom + + geom_geos = MultiPolygon(poly_list) + + name = feature['properties']['NAME_1'] + City.objects.create(name=name,poly=geom_geos, country=SPAIN) + city_counter += 1 + logging.debug(f"City instance created for: {name}") + + logging.info(f"Country instances created: {country_counter}") + logging.info(f"Region instances created: {region_counter}") + logging.info(f"Province instances created: {[province_counter]}") + logging.info(f"City instances created: {city_counter}")