def loadDataSource(self, sourceConfig): source = ogr.Open( sourceConfig['input_file'] ) layer = source.GetLayer(0) layer.SetAttributeFilter( sourceConfig['where'].encode('ascii') ) self.viewportRect = False transformation = osr.CoordinateTransformation( layer.GetSpatialRef(), self.spatialRef ) if self.viewport: layer.SetSpatialFilterRect( *self.viewport ) point1 = transformation.TransformPoint(self.viewport[0], self.viewport[1]) point2 = transformation.TransformPoint(self.viewport[2], self.viewport[3]) self.viewportRect = shapely.geometry.box(point1[0], point1[1], point2[0], point2[1]) layer.ResetReading() codes = {} if self.emulate_longitude0: meridian = -180 + self.longitude0 p1 = transformation.TransformPoint(-180, 89) p2 = transformation.TransformPoint(meridian, -89) left = shapely.geometry.box(p1[0], p1[1], p2[0], p2[1]) p3 = transformation.TransformPoint(meridian, 89) p4 = transformation.TransformPoint(180, -89) right = shapely.geometry.box(p3[0], p3[1], p4[0], p4[1]) # load features nextCode = 0 for feature in layer: geometry = feature.GetGeometryRef() geometryType = geometry.GetGeometryType() if geometryType == ogr.wkbPolygon or geometryType == ogr.wkbMultiPolygon: geometry.TransformTo( self.spatialRef ) shapelyGeometry = shapely.wkb.loads( geometry.ExportToWkb() ) if not shapelyGeometry.is_valid: shapelyGeometry = shapelyGeometry.buffer(0, 1) if self.emulate_longitude0: leftPart = shapely.affinity.translate(shapelyGeometry.intersection(left), p4[0] - p3[0]) rightPart = shapely.affinity.translate(shapelyGeometry.intersection(right), p1[0] - p2[0]) shapelyGeometry = leftPart.buffer(0.1, 1).union(rightPart.buffer(0.1, 1)).buffer(-0.1, 1) if not shapelyGeometry.is_valid: shapelyGeometry = shapelyGeometry.buffer(0, 1) shapelyGeometry = self.applyFilters(shapelyGeometry) if shapelyGeometry: name = feature.GetFieldAsString(str(sourceConfig.get('name_field'))).decode(sourceConfig.get('input_file_encoding')) code = feature.GetFieldAsString(str(sourceConfig.get('code_field'))).decode(sourceConfig.get('input_file_encoding')) if code in codes: code = '_' + str(nextCode) nextCode += 1 codes[code] = name self.features[code] = {"geometry": shapelyGeometry, "name": name, "code": code} else: raise Exception, "Wrong geometry type: "+geometryType
def loadData(self): source = ogr.Open( self.inputFile ) layer = source.GetLayer(0) layer.SetAttributeFilter( self.where ) if self.viewport: layer.SetSpatialFilterRect( *self.viewport ) transformation = osr.CoordinateTransformation( layer.GetSpatialRef(), self.spatialRef ) point1 = transformation.TransformPoint(self.viewport[0], self.viewport[1]) point2 = transformation.TransformPoint(self.viewport[2], self.viewport[3]) self.viewportRect = shapely.geometry.box(point1[0], point1[1], point2[0], point2[1]) else: self.viewportRect = False layer.ResetReading() # load codes from external tsv file if present or geodata file otherwise self.codes = {} if self.codes_file: for line in codecs.open(self.codes_file, 'r', "utf-8"): row = map(lambda s: s.strip(), line.split('\t')) self.codes[row[1]] = row[0] else: nextCode = 0 for feature in layer: code = feature.GetFieldAsString(self.country_code_index) if code == '-99': code = '_'+str(nextCode) nextCode += 1 name = feature.GetFieldAsString(self.country_name_index).decode(self.inputFileEncoding) self.codes[name] = code layer.ResetReading() # load features for feature in layer: geometry = feature.GetGeometryRef() geometryType = geometry.GetGeometryType() if geometryType == ogr.wkbPolygon or geometryType == ogr.wkbMultiPolygon: geometry.TransformTo( self.spatialRef ) shapelyGeometry = shapely.wkb.loads( geometry.ExportToWkb() ) if not shapelyGeometry.is_valid: #buffer to fix selfcrosses shapelyGeometry = shapelyGeometry.buffer(0, 1) shapelyGeometry = self.applyFilters(shapelyGeometry) if shapelyGeometry: name = feature.GetFieldAsString(self.country_name_index).decode(self.inputFileEncoding) code = self.codes[name] self.features[code] = {"geometry": shapelyGeometry, "name": name, "code": code} else: raise Exception, "Wrong geomtry type: "+geometryType
geom_type=in_defn.GetGeomType(), srs=in_layer.GetSpatialRef()) in_field_count = in_defn.GetFieldCount() for fld_index in range(in_field_count): src_fd = in_defn.GetFieldDefn(fld_index) fd = ogr.FieldDefn(src_fd.GetName(), src_fd.GetType()) fd.SetWidth(src_fd.GetWidth()) fd.SetPrecision(src_fd.GetPrecision()) shp_layer.CreateField(fd) # Load geometries geometries = [] for feature in in_layer: geometry = feature.GetGeometryRef() geometryType = geometry.GetGeometryType() if geometryType == ogr.wkbPolygon or geometryType == ogr.wkbMultiPolygon: shapelyGeometry = shapely.wkb.loads(geometry.ExportToWkb()) #if not shapelyGeometry.is_valid: #buffer to fix selfcrosses #shapelyGeometry = shapelyGeometry.buffer(0) if shapelyGeometry: geometries.append(shapelyGeometry) in_layer.ResetReading() start = int(round(time.time() * 1000)) # Simplification points = [] connections = {} counter = 0
srs = in_layer.GetSpatialRef() ) fd = ogr.FieldDefn( 'code', 4 ) fd.SetWidth( 5 ) shp_layer.CreateField( fd ) fd = ogr.FieldDefn( 'name', 4 ) fd.SetWidth( 254 ) shp_layer.CreateField( fd ) for region in regions: in_layer.SetAttributeFilter( region['where'] ) geometries = [] for feature in in_layer: geometry = feature.GetGeometryRef() if geometry.GetGeometryType() == ogr.wkbPolygon or geometry.GetGeometryType() == ogr.wkbMultiPolygon: geometry = shapely.wkb.loads( geometry.ExportToWkb() ) geometry = geometry.buffer(0.000000001, 1) geometries.append( geometry ) region['geometry'] = shapely.ops.cascaded_union( geometries ) region['geometry'] = region['geometry'].buffer(-0.000000001, 1) in_layer.ResetReading() for region in regions: out_feat = ogr.Feature( feature_def = shp_layer.GetLayerDefn() ) out_feat.SetField(0, region['code']) out_feat.SetField(1, region['name']) out_feat.SetGeometryDirectly( ogr.CreateGeometryFromWkb( shapely.wkb.dumps( region['geometry']