def _create_dst_features(self, dst, trg, **kwargs): """ Create needed OGR.Features in dst OGR.Layer Parameters ---------- dst : OGR.Layer destination layer trg : OGR.Geometry target polygon """ # TODO: kwargs necessary? # claim and reset source ogr layer layer = self.src.ds.GetLayerByName('src') layer.ResetReading() # if given, we apply a buffer value to the target polygon filter trg_index = trg.GetField('index') trg = trg.GetGeometryRef() trg = trg.Buffer(self._buffer) layer.SetSpatialFilter(trg) # iterate over layer features for ogr_src in layer: geom = ogr_src.GetGeometryRef() # calculate intersection, if not fully contained if not trg.Contains(geom): geom = trg.Intersection(geom) # checking GeometryCollection, convert to only Polygons, # Multipolygons if geom.GetGeometryType() in [7]: geocol = georef.ogr_geocol_to_numpy(geom) geom = georef.numpy_to_ogr(geocol, 'MultiPolygon') # only geometries containing points if geom.IsEmpty(): continue if geom.GetGeometryType() in [3, 6, 12]: idx = ogr_src.GetField('index') georef.ogr_add_geometry(dst, geom, [idx, trg_index])
def test_geocol_to_numpy(self): # Create a geometry collection geomcol = ogr.Geometry(ogr.wkbGeometryCollection) # Create polygon ring = ogr.Geometry(ogr.wkbLinearRing) ring.AddPoint(1179091.1646903288, 712782.8838459781) ring.AddPoint(1161053.0218226474, 667456.2684348812) ring.AddPoint(1214704.933941905, 641092.8288590391) ring.AddPoint(1228580.428455506, 682719.3123998424) ring.AddPoint(1218405.0658121984, 721108.1805541387) ring.AddPoint(1179091.1646903288, 712782.8838459781) poly = ogr.Geometry(ogr.wkbPolygon) poly.AddGeometry(ring) geomcol.AddGeometry(poly) # Add a point point = ogr.Geometry(ogr.wkbPoint) point.AddPoint(-122.23, 47.09) geomcol.AddGeometry(point) # Add a line line = ogr.Geometry(ogr.wkbLineString) line.AddPoint(-122.60, 47.14) line.AddPoint(-122.48, 47.23) geomcol.AddGeometry(line) arr = georef.ogr_geocol_to_numpy(geomcol)[..., 0:2] res = np.array( [ [1179091.1646903288, 712782.8838459781], [1161053.0218226474, 667456.2684348812], [1214704.933941905, 641092.8288590391], [1228580.428455506, 682719.3123998424], [1218405.0658121984, 721108.1805541387], [1179091.1646903288, 712782.8838459781], ] ) np.testing.assert_allclose(arr, res)
def test_geocol_to_numpy(self): # Create a geometry collection geomcol = ogr.Geometry(ogr.wkbGeometryCollection) # Create polygon ring = ogr.Geometry(ogr.wkbLinearRing) ring.AddPoint(1179091.1646903288, 712782.8838459781) ring.AddPoint(1161053.0218226474, 667456.2684348812) ring.AddPoint(1214704.933941905, 641092.8288590391) ring.AddPoint(1228580.428455506, 682719.3123998424) ring.AddPoint(1218405.0658121984, 721108.1805541387) ring.AddPoint(1179091.1646903288, 712782.8838459781) poly = ogr.Geometry(ogr.wkbPolygon) poly.AddGeometry(ring) geomcol.AddGeometry(poly) # Add a point point = ogr.Geometry(ogr.wkbPoint) point.AddPoint(-122.23, 47.09) geomcol.AddGeometry(point) # Add a line line = ogr.Geometry(ogr.wkbLineString) line.AddPoint(-122.60, 47.14) line.AddPoint(-122.48, 47.23) geomcol.AddGeometry(line) arr = georef.ogr_geocol_to_numpy(geomcol)[..., 0:2] res = np.array([[1179091.1646903288, 712782.8838459781], [1161053.0218226474, 667456.2684348812], [1214704.933941905, 641092.8288590391], [1228580.428455506, 682719.3123998424], [1218405.0658121984, 721108.1805541387], [1179091.1646903288, 712782.8838459781]]) np.testing.assert_allclose(arr, res)