def _process_muni(self, syncher, feat): muni_id = str(feat.get('nationalCode')) t = feat.get('text') m = re.match(r'\(2:([\w\s:-]+),([\w\s:-]+)\)', t) name_fi = m.groups()[0] name_sv = m.groups()[1] self.logger.debug(name_fi) munidiv = syncher.get(muni_id) if not munidiv: munidiv = AdministrativeDivision(origin_id=muni_id) munidiv.set_current_language('fi') munidiv.name = name_fi munidiv.set_current_language('sv') munidiv.name = name_sv munidiv.ocd_id = ocd.make_id(country='fi', kunta=name_fi) munidiv.type = self.muni_type munidiv.save() syncher.mark(munidiv) try: geom_obj = munidiv.geometry except AdministrativeDivisionGeometry.DoesNotExist: geom_obj = AdministrativeDivisionGeometry(division=munidiv) geom = feat.geom geom.transform(PROJECTION_SRID) # Store only the land boundaries # geom = geom.geos.intersection(self.land_area) geom = geom.geos if geom.geom_type == 'Polygon': geom = MultiPolygon(geom) geom_obj.boundary = geom geom_obj.save() try: muni = Municipality.objects.get(division=munidiv) except Municipality.DoesNotExist: muni = Municipality(division=munidiv) muni.set_current_language('fi') muni.name = name_fi muni.set_current_language('sv') muni.name = name_sv muni.id = munidiv.ocd_id.split('/')[-1].split(':')[-1] muni.save()
def _process_muni(self, syncher, feat): muni_id = str(feat.get('nationalCode')) t = feat.get('text') m = re.match(r'\(2:([\w\s:-]+),([\w\s:-]+)\)', t) name_fi = m.groups()[0] name_sv = m.groups()[1] print(name_fi) munidiv = syncher.get(muni_id) if not munidiv: munidiv = AdministrativeDivision(origin_id=muni_id) munidiv.name_fi = name_fi munidiv.name_sv = name_sv munidiv.ocd_id = ocd.make_id(country='fi', kunta=name_fi) munidiv.type = self.muni_type munidiv.save() syncher.mark(munidiv) try: geom_obj = munidiv.geometry except AdministrativeDivisionGeometry.DoesNotExist: geom_obj = AdministrativeDivisionGeometry(division=munidiv) geom = feat.geom geom.transform(PROJECTION_SRID) # Store only the land boundaries #geom = geom.geos.intersection(self.land_area) geom = geom.geos if geom.geom_type == 'Polygon': geom = MultiPolygon(geom) geom_obj.boundary = geom geom_obj.save() try: muni = Municipality.objects.get(division=munidiv) except Municipality.DoesNotExist: muni = Municipality(division=munidiv) muni.name_fi = name_fi muni.name_sv = name_sv muni.id = munidiv.ocd_id.split('/')[-1].split(':')[-1] muni.save()
def _import_division(self, muni, div, type_obj, syncher, parent_dict, feat): # Geometry geom = feat.geom if not geom.srid: geom.srid = GK23_SRID if geom.srid != PROJECTION_SRID: ct = CoordTransform(SpatialReference(geom.srid), SpatialReference(PROJECTION_SRID)) geom.transform(ct) geom = geom.geos if geom.geom_type == 'Polygon': geom = MultiPolygon(geom, srid=geom.srid) # Attributes attr_dict = {} lang_dict = {} for attr, field in div['fields'].items(): if isinstance(field, dict): # Languages d = {} for lang, field_name in field.items(): val = feat[field_name].as_string() # If the name is in all caps, fix capitalization. if not re.search('[a-z]', val): val = val.title() d[lang] = val.strip() lang_dict[attr] = d else: val = feat[field].as_string() attr_dict[attr] = val.strip() origin_id = attr_dict['origin_id'] del attr_dict['origin_id'] if 'parent' in div: if 'parent_id' in attr_dict: parent = parent_dict[attr_dict['parent_id']] del attr_dict['parent_id'] else: # If no parent id is available, we determine the parent # heuristically by choosing the one that we overlap with # the most. parents = [] for parent in parent_dict.values(): diff_area = poly_diff(geom, parent.geometry.boundary) if diff_area < 300: parents.append(parent) if not parents: raise Exception("No parent found for %s" % origin_id) elif len(parents) > 1: raise Exception("Too many parents for %s" % origin_id) parent = parents[0] elif 'parent_ocd_id' in div: try: parent = AdministrativeDivision.objects.get( ocd_id=div['parent_ocd_id']) except AdministrativeDivision.DoesNotExist: parent = None else: parent = muni.division if 'parent' in div and parent: full_id = "%s-%s" % (parent.origin_id, origin_id) else: full_id = origin_id obj = syncher.get(full_id) if not obj: obj = AdministrativeDivision(origin_id=origin_id, type=type_obj) validity_time_period = div.get('validity') if validity_time_period: obj.start = validity_time_period.get('start') obj.end = validity_time_period.get('end') if obj.start: obj.start = datetime.strptime(obj.start, '%Y-%m-%d').date() if obj.end: obj.end = datetime.strptime(obj.end, '%Y-%m-%d').date() if div.get('no_parent_division', False): muni = None obj.parent = parent obj.municipality = muni for attr in attr_dict.keys(): setattr(obj, attr, attr_dict[attr]) for attr in lang_dict.keys(): for lang, val in lang_dict[attr].items(): key = "%s_%s" % (attr, lang) setattr(obj, key, val) if 'ocd_id' in div: assert (parent and parent.ocd_id) or 'parent_ocd_id' in div if parent: if div.get('parent_in_ocd_id', False): args = {'parent': parent.ocd_id} else: args = {'parent': muni.division.ocd_id} else: args = {'parent': div['parent_ocd_id']} val = attr_dict['ocd_id'] args[div['ocd_id']] = val obj.ocd_id = ocd.make_id(**args) self.logger.debug("%s" % obj.ocd_id) obj.save() syncher.mark(obj) try: geom_obj = obj.geometry except AdministrativeDivisionGeometry.DoesNotExist: geom_obj = AdministrativeDivisionGeometry(division=obj) geom_obj.boundary = geom geom_obj.save()
def _import_division(self, muni, div, type_obj, syncher, parent_dict, feat): attr_dict = {} lang_dict = {} for attr, field in div['fields'].items(): if isinstance(field, dict): # Languages d = {} for lang, field_name in field.items(): val = feat[field_name].as_string() # If the name is in all caps, fix capitalization. if not re.search('[a-z]', val): val = val.title() d[lang] = val lang_dict[attr] = d else: val = feat[field].as_string() attr_dict[attr] = val origin_id = attr_dict['origin_id'] del attr_dict['origin_id'] if 'parent_id' in attr_dict: full_id = "%s-%s" % (attr_dict['parent_id'], origin_id) else: full_id = origin_id obj = syncher.get(full_id) if not obj: obj = AdministrativeDivision(origin_id=origin_id, type=type_obj) if 'parent' in div: parent = parent_dict[attr_dict['parent_id']] del attr_dict['parent_id'] elif 'parent_ocd_id' in div: try: parent = AdministrativeDivision.objects.get(ocd_id=div['parent_ocd_id']) except AdministrativeDivision.DoesNotExist: parent = None else: parent = muni.division obj.parent = parent obj.municipality = muni for attr in attr_dict.keys(): setattr(obj, attr, attr_dict[attr]) for attr in lang_dict.keys(): for lang, val in lang_dict[attr].items(): key = "%s_%s" % (attr, lang) setattr(obj, key, val) if 'ocd_id' in div: assert (parent and parent.ocd_id) or 'parent_ocd_id' in div if parent: if div.get('parent_in_ocd_id', False): args = {'parent': parent.ocd_id} else: args = {'parent': muni.division.ocd_id} else: args = {'parent': div['parent_ocd_id']} val = attr_dict['ocd_id'] args[div['ocd_id']] = val obj.ocd_id = ocd.make_id(**args) print("\t%s" % obj.ocd_id) obj.save() syncher.mark(obj) try: geom_obj = obj.geometry except AdministrativeDivisionGeometry.DoesNotExist: geom_obj = AdministrativeDivisionGeometry(division=obj) geom = feat.geom if not geom.srid: geom.srid = GK25_SRID if geom.srid != PROJECTION_SRID: ct = CoordTransform(SpatialReference(geom.srid), SpatialReference(PROJECTION_SRID)) geom.transform(ct) #geom = geom.geos.intersection(parent.geometry.boundary) geom = geom.geos if geom.geom_type == 'Polygon': geom = MultiPolygon(geom) geom_obj.boundary = geom geom_obj.save()
def _import_division(self, muni, div, type_obj, syncher, parent_dict, feat): # # Geometry # geom = feat.geom if not geom.srid: geom.srid = GK25_SRID if geom.srid != PROJECTION_SRID: ct = CoordTransform(SpatialReference(geom.srid), SpatialReference(PROJECTION_SRID)) geom.transform(ct) # geom = geom.geos.intersection(parent.geometry.boundary) geom = geom.geos if geom.geom_type == 'Polygon': geom = MultiPolygon(geom, srid=geom.srid) # # Attributes # attr_dict = {} lang_dict = {} for attr, field in div['fields'].items(): if isinstance(field, dict): # Languages d = {} for lang, field_name in field.items(): val = feat[field_name].as_string() # If the name is in all caps, fix capitalization. if not re.search('[a-z]', val): val = val.title() d[lang] = val.strip() lang_dict[attr] = d else: val = feat[field].as_string() attr_dict[attr] = val.strip() origin_id = attr_dict['origin_id'] del attr_dict['origin_id'] if 'parent' in div: if 'parent_id' in attr_dict: parent = parent_dict[attr_dict['parent_id']] del attr_dict['parent_id'] else: # If no parent id is available, we determine the parent # heuristically by choosing the one that we overlap with. parents = [] for parent in parent_dict.values(): parent_geom = parent.geometry.boundary if not geom.intersects(parent_geom): continue area = (geom - parent.geometry.boundary).area if area > 1e-6: continue parents.append(parent) parents = sorted(parents) if not parents: raise Exception("No parent found for %s" % origin_id) elif len(parents) > 1: raise Exception("Too many parents for %s" % origin_id) parent = parents[0] elif 'parent_ocd_id' in div: try: parent = AdministrativeDivision.objects.get(ocd_id=div['parent_ocd_id']) except AdministrativeDivision.DoesNotExist: parent = None else: parent = muni.division if 'parent' in div and parent: full_id = "%s-%s" % (parent.origin_id, origin_id) else: full_id = origin_id obj = syncher.get(full_id) if not obj: obj = AdministrativeDivision(origin_id=origin_id, type=type_obj) validity_time_period = div.get('validity') if validity_time_period: obj.start = validity_time_period.get('start') obj.end = validity_time_period.get('end') if obj.start: obj.start = datetime.strptime(obj.start, '%Y-%m-%d').date() if obj.end: obj.end = datetime.strptime(obj.end, '%Y-%m-%d').date() if div.get('no_parent_division', False): muni = None obj.parent = parent obj.municipality = muni for attr in attr_dict.keys(): setattr(obj, attr, attr_dict[attr]) for attr in lang_dict.keys(): for lang, val in lang_dict[attr].items(): obj.set_current_language(lang) setattr(obj, attr, val) if 'ocd_id' in div: assert (parent and parent.ocd_id) or 'parent_ocd_id' in div if parent: if div.get('parent_in_ocd_id', False): args = {'parent': parent.ocd_id} else: args = {'parent': muni.division.ocd_id} else: args = {'parent': div['parent_ocd_id']} val = attr_dict['ocd_id'] args[div['ocd_id']] = val obj.ocd_id = ocd.make_id(**args) self.logger.debug("%s" % obj.ocd_id) obj.save() syncher.mark(obj) try: geom_obj = obj.geometry except AdministrativeDivisionGeometry.DoesNotExist: geom_obj = AdministrativeDivisionGeometry(division=obj) geom_obj.boundary = geom geom_obj.save()