Exemple #1
0
  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
Exemple #2
0
  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
Exemple #3
0
                               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
Exemple #4
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']