def load_data(self): self.source = ogr.Open( self.config['file_name'], update = 0 ) self.layer = self.source.GetLayer(0) if 'filter' in self.config and self.config['filter'] is not None: self.layer.SetAttributeFilter( self.config['filter'].encode('ascii') ) self.layer_dfn = self.layer.GetLayerDefn() self.fields = [] field_count = self.layer_dfn.GetFieldCount() for field_index in range(field_count): field = self.layer_dfn.GetFieldDefn( field_index ) self.fields.append({ 'name': field.GetName(), 'type': field.GetType(), 'width': field.GetWidth(), 'precision': field.GetPrecision() }) self.geometries = [] for feature in self.layer: geometry = feature.GetGeometryRef() geometry.TransformTo( self.spatialRef ) geometry = shapely.wkb.loads( geometry.ExportToWkb() ) if not geometry.is_valid: geometry = geometry.buffer(0) properties = {} for field in self.fields: properties[field['name']] = feature.GetFieldAsString(field['name']).decode('utf-8') self.geometries.append( Geometry(geometry, properties) ) self.layer.ResetReading() self.create_grammar()
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