我需要使用python合并shapefile的多边形。
https://i.stack.imgur.com/qY6gD.png
多边形内部有一些自交,我的python代码总是导致错误。
import geopandas as gpd
from shapely.geometry import Polygon
from shapely.validation import make_valid
from shapely.ops import cascaded_union
from shapely.validation import explain_validity
pz32 = gpd.read_file("B://_Shp_robocze//test//test.shp")
shp = gpd.geoseries.GeoSeries([geom for geom in pz32.unary_union.geoms])
shp.geometry = shp.apply(lambda row: make_valid(row.geometry) if not row.geometry.is_valid else row.geometry, axis=1)
print(shp)
控制台打印错误
TopologyException: side location conflict at 389425.99965310335 578312.21068473824. This can occur if the input geometry is invalid.
Traceback (most recent call last):
File "C:\...\PycharmProjects\pythonProject\main.py", line 8, in <module>
shp = gpd.geoseries.GeoSeries([geom for geom in pz32.unary_union.geoms])
File "C:\...\PycharmProjects\pythonProject\venv\lib\site-packages\geopandas\base.py", line 800, in unary_union
return self.geometry.values.unary_union()
File "C:\...\PycharmProjects\pythonProject\venv\lib\site-packages\geopandas\array.py", line 650, in unary_union
return vectorized.unary_union(self.data)
File "C:\...\PycharmProjects\pythonProject\venv\lib\site-packages\geopandas\_vectorized.py", line 1034, in unary_union
return shapely.ops.unary_union(data)
File "C:\...\PycharmProjects\pythonProject\venv\lib\site-packages\shapely\ops.py", line 161, in unary_union
return geom_factory(lgeos.methods['unary_union'](collection))
File "C:\...\PycharmProjects\pythonProject\venv\lib\site-packages\shapely\geometry\base.py", line 73, in geom_factory
raise ValueError("No Shapely geometry can be created from null value")
ValueError: No Shapely geometry can be created from null value
如何使这个几何有效?
发布于 2022-11-29 02:39:36
此错误消息指示存在空值:
No Shapely geometry can be created from null value
您必须在几何列中有一个None
或NaN
。这不同于(可能还包括)任何与自我交汇处有关的问题。
您可以搜索空,例如使用下面的内容来诊断正在发生的事情:
pz32[pz32.isnull()]
或者干脆放下行:
pz32 = pz32[pz32.notnull()]
Shapely不能只从零开始创建一个几何图形,所以它要求您决定如何处理空值。虽然geopandas可以处理空值,但通过接受GeometryArray,可以强制将整个unary_union
转换为单个shapely对象。
https://stackoverflow.com/questions/74600665
复制相似问题