def import_waterbodies(wb_import_settings): """ Create geoobjects and waterbodies. """ owmsources = wb_import_settings['owm_sources'] # Reset geo object groups geogroups = {} category = Category.objects.get(slug='krw-waterlichamen') for s in wb_import_settings['owm_sources']: # Determine geoobject group name geo_object_group_name = ('measure::waterbody::%s' % os.path.basename(s['file'])) # Remove geoobject group by name if it exists try: print 'Finding existing geoobject group named %s' % ( geo_object_group_name, ) geo_object_group = GeoObjectGroup.objects.get( name=geo_object_group_name) print 'Deleting existing geoobject group named %s' % ( geo_object_group_name, ) geo_object_group.delete() except GeoObjectGroup.DoesNotExist: pass # Create new geoobject group with that name geo_object_group = GeoObjectGroup( name=geo_object_group_name, slug=slugify(os.path.basename(s['file']).split('.')[-2]), created_by=s['user'], ) geo_object_group.save() # Add this geoobject group to lizard_area category of waterbodies category.geo_object_groups.add(geo_object_group) # Keep a dict of geo_object_groups for later assignment geogroups[s['data_administrator'].name] = geo_object_group # Make a mapping of owmidents to sets of owaidents # There are multiple owaidents per owmident owa_idents = {} for rec in _records(wb_import_settings['link_file']): owm = rec['owmident'] owa = rec['owaident'] if owm not in owa_idents: owa_idents[owm] = [] owa_idents[owm].append(owa) # Loop geofile, create geometry object for each geometry owa_geometry = {} spatialreference_wgs84 = SpatialReference(WGS84) spatialreference_rd = SpatialReference(RD) coordtransform = CoordTransform( spatialreference_rd, spatialreference_wgs84, ) for f in wb_import_settings['geometry_files']: for rec in _records(f): geometry = GEOSGeometry( rec['wkb_geometry'], #srid=28992, ) geometry.transform(coordtransform) owa_geometry[rec['owaident']] = geometry # Go through the owm files, to get or create the corresponding areas for s in owmsources: for rec in _records(s['file']): owm_ident = rec['owmident'].strip() # Get or create area try: area = Area.objects.get(ident=owm_ident) except Area.DoesNotExist: owa_geometries = [owa_geometry[owa_ident] for owa_ident in owa_idents[owm_ident]] area = Area( # Fields from GeoObject ident=owm_ident, geometry=_combine(owa_geometries), geo_object_group=geogroups[s['data_administrator'].name], # Fields from Area area_class=Area.AREA_CLASS_KRW_WATERLICHAAM, data_administrator=s['data_administrator'], parent=None, # Fields from Communique name=rec['owmnaam'].strip(), code=None, description='', ) # Set data_set on area in any case, existing or imported here. area.data_set = s['data_set'] area.save() # Create WaterBody krw_status = KRWStatus.objects.get(code=rec['owmstat'].strip()) krw_watertype = KRWWatertype.objects.get( code=rec['owmtype'].strip() ) waterbody, waterbody_created = _get_or_create( model=WaterBody, get_kwargs={'area_ident': area.ident}, extra_kwargs={ 'area': area, 'krw_status': krw_status, 'krw_watertype': krw_watertype, }, )