为何该Shapely POLYGON Z多边形无效?
Shapely中POLYGON Z多边形无效的原因分析
问题场景
使用Shapely的loads方法加载POLYGON Z类型的WKT字符串创建多边形,调用is_valid方法后发现该多边形无效。相关代码如下:
from shapely.wkt import loads polygon = loads("POLYGON Z ((11.2704142515539 8.935877943566396 -16.74699224693797, 9.552838743503662 9.966533722939751 -16.77349242463657, 7.038910673892143 11.41232301137523 -16.7241410803892, 5.216749880203796 12.46026879775946 -16.68836982474948, 8.001220401932684 17.16509576267924 -16.77314058305908, 13.96493422834735 13.65121729926299 -16.69268953378357, 11.2704142515539 8.935877943566396 -16.74699224693797), (9.548433717869264 9.955660336966762 -16.73313716982752, 12.17899487645576 14.57302531902789 -16.73313714768369, 9.676190207235408 15.98563829772018 -16.7331371381166, 7.056180834251874 11.41237681923199 -16.733137145912, 9.64504281597692 15.6700635337078 -16.73313699214635, 11.91573358793374 14.30274366995717 -16.73313697544633, 9.548433717869264 9.955660336966762 -16.73313716982752))") print(polygon.is_valid)
多边形可视化效果:
无效原因分析
Shapely判断多边形有效性遵循OGC简单要素规范,针对这个POLYGON Z多边形,核心问题是内环存在自相交。
从可视化图和WKT的内环点序列可以看出,内环的多条线段出现交叉:比如内环中从(9.676190207235408 15.98563829772018 -16.7331371381166)到(7.056180834251874 11.41237681923199 -16.733137145912)的线段,与从(9.64504281597692 15.6700635337078 -16.73313699214635)到(11.91573358793374 14.30274366995717 -16.73313697544633)的线段存在交叉,导致内环自相交,违反了多边形的有效性规则。
你可以通过explain_validity方法直接获取具体的无效原因,修改后的代码如下:
from shapely.wkt import loads from shapely.validation import explain_validity polygon = loads("POLYGON Z ((11.2704142515539 8.935877943566396 -16.74699224693797, 9.552838743503662 9.966533722939751 -16.77349242463657, 7.038910673892143 11.41232301137523 -16.7241410803892, 5.216749880203796 12.46026879775946 -16.68836982474948, 8.001220401932684 17.16509576267924 -16.77314058305908, 13.96493422834735 13.65121729926299 -16.69268953378357, 11.2704142515539 8.935877943566396 -16.74699224693797), (9.548433717869264 9.955660336966762 -16.73313716982752, 12.17899487645576 14.57302531902789 -16.73313714768369, 9.676190207235408 15.98563829772018 -16.7331371381166, 7.056180834251874 11.41237681923199 -16.733137145912, 9.64504281597692 15.6700635337078 -16.73313699214635, 11.91573358793374 14.30274366995717 -16.73313697544633, 9.548433717869264 9.955660336966762 -16.73313716982752))") print(polygon.is_valid) print(explain_validity(polygon))
运行后会输出具体的无效位置和原因,例如提示内环在某个坐标点处自相交。
内容的提问来源于stack exchange,提问作者nickponline
相关产品推荐
相关产品推荐

