mirror of
https://github.com/qgis/QGIS.git
synced 2025-10-04 00:04:03 -04:00
Improve performance of as_shapely
By utilizing QgsGeometry.asWkb() this is ~8.45 times faster than the previous implementation.
This commit is contained in:
parent
1aba57c8ce
commit
bb6ec91291
@ -634,28 +634,12 @@ except ModuleNotFoundError:
|
|||||||
try:
|
try:
|
||||||
import shapely as _shapely
|
import shapely as _shapely
|
||||||
|
|
||||||
|
def _geometry_as_shapely(self) -> _shapely.geometry.base.BaseGeometry:
|
||||||
|
wkb_qbytearray = self.asWkb() # Get the geometry in WKB format (QByteArray)
|
||||||
|
wkb_bytes = bytes(wkb_qbytearray)
|
||||||
|
shapely_geom = _shapely.from_wkb(wkb_bytes)
|
||||||
|
|
||||||
def _geometry_as_shapely(self) -> _shapely.Geometry:
|
return shapely_geom
|
||||||
numpy_coords = _qgsgeometry_as_numpy(self)
|
|
||||||
|
|
||||||
if self.isMultipart():
|
|
||||||
if self.type() == QgsWkbTypes.PointGeometry:
|
|
||||||
return _shapely.multipoint([point(coord) for coord in numpy_coords])
|
|
||||||
elif self.type() == QgsWkbTypes.LineGeometry:
|
|
||||||
return _shapely.multilinestring([linestring(coords) for coords in numpy_coords])
|
|
||||||
elif self.type() == QgsWkbTypes.PolygonGeometry:
|
|
||||||
exterior_ring = numpy_coords[0]
|
|
||||||
interior_rings = numpy_coords[1:]
|
|
||||||
return _shapely.multipolygon([polygon(exterior_ring, interior_rings if interior_rings else None) for rings in numpy_coords])
|
|
||||||
else:
|
|
||||||
if self.type() == QgsWkbTypes.PointGeometry:
|
|
||||||
return _shapely.points(numpy_coords)
|
|
||||||
elif self.type() == QgsWkbTypes.LineGeometry:
|
|
||||||
return _shapely.linestrings(numpy_coords)
|
|
||||||
elif self.type() == QgsWkbTypes.PolygonGeometry:
|
|
||||||
exterior_ring = numpy_coords[0]
|
|
||||||
interior_rings = numpy_coords[1:]
|
|
||||||
return _shapely.polygons(exterior_ring, interior_rings if interior_rings else None)
|
|
||||||
|
|
||||||
QgsGeometry.as_shapely = _geometry_as_shapely
|
QgsGeometry.as_shapely = _geometry_as_shapely
|
||||||
|
|
||||||
|
@ -644,28 +644,12 @@ except ModuleNotFoundError:
|
|||||||
try:
|
try:
|
||||||
import shapely as _shapely
|
import shapely as _shapely
|
||||||
|
|
||||||
|
def _geometry_as_shapely(self) -> _shapely.geometry.base.BaseGeometry:
|
||||||
|
wkb_qbytearray = self.asWkb() # Get the geometry in WKB format (QByteArray)
|
||||||
|
wkb_bytes = bytes(wkb_qbytearray)
|
||||||
|
shapely_geom = _shapely.from_wkb(wkb_bytes)
|
||||||
|
|
||||||
def _geometry_as_shapely(self) -> _shapely.Geometry:
|
return shapely_geom
|
||||||
numpy_coords = _qgsgeometry_as_numpy(self)
|
|
||||||
|
|
||||||
if self.isMultipart():
|
|
||||||
if self.type() == QgsWkbTypes.PointGeometry:
|
|
||||||
return _shapely.multipoint([point(coord) for coord in numpy_coords])
|
|
||||||
elif self.type() == QgsWkbTypes.LineGeometry:
|
|
||||||
return _shapely.multilinestring([linestring(coords) for coords in numpy_coords])
|
|
||||||
elif self.type() == QgsWkbTypes.PolygonGeometry:
|
|
||||||
exterior_ring = numpy_coords[0]
|
|
||||||
interior_rings = numpy_coords[1:]
|
|
||||||
return _shapely.multipolygon([polygon(exterior_ring, interior_rings if interior_rings else None) for rings in numpy_coords])
|
|
||||||
else:
|
|
||||||
if self.type() == QgsWkbTypes.PointGeometry:
|
|
||||||
return _shapely.points(numpy_coords)
|
|
||||||
elif self.type() == QgsWkbTypes.LineGeometry:
|
|
||||||
return _shapely.linestrings(numpy_coords)
|
|
||||||
elif self.type() == QgsWkbTypes.PolygonGeometry:
|
|
||||||
exterior_ring = numpy_coords[0]
|
|
||||||
interior_rings = numpy_coords[1:]
|
|
||||||
return _shapely.polygons(exterior_ring, interior_rings if interior_rings else None)
|
|
||||||
|
|
||||||
QgsGeometry.as_shapely = _geometry_as_shapely
|
QgsGeometry.as_shapely = _geometry_as_shapely
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user