有关PostGIS多边形几何的帮助-非闭合环


10

我已经摘录了Erik Westra(亚马逊链接)撰写的一本超级邪恶的书“ Python Geospatial Development” ,并且正在研究中。目前,它正在教我将GSHHS海岸线数据从shapefile加载到PostGIS数据库中,以准备构建地理空间Web应用程序。

我的问题是:当我尝试将GSHHS数据导入PostGIS时,由于海岸线多边形不被视为“有效”而被拒绝。具体来说,我收到一条错误消息,将某些(而非全部)海岸线多边形描述为“非封闭环”。

我知道此错误试图告诉我多边形的第一个点和最后一个点不相同。但是,这根本不是事实。我已经检查了许多多边形的WKT表示形式,它们是正确的。它们肯定以相同的坐标开始和结束。

使用OGR库从shapefile中提取多边形,并将每个多边形要素导出到WKT。我尝试通过Shapely重构多边形,并尝试使用WKB,但无济于事。我已经能够在同一数据加载到PostGIS的作为MULTIPOLYGON表,使用shp2pgsql装载机。

我想知道那里是否有人:
(a)也许使用同一本书,陷入同样的​​问题,并且对我有答案?
(b)遇到类似问题,并找到解决方案?
(c)否,是否有一些“最佳实践”建议,以确保在装入PostGIS之前确保有效的几何图形?

更新:一位同事建议,“非闭合环”问题可能只是另一个问题的征兆。我的PostGIS / PostgreSQL配置可能有大小限制(关于插入事务,接收到的数据包,文本字符串等)。

由于我将很长的WKT多边形用作输入,因此PostGIS可能为时过早,无法允许每个多边形完成切割。我明天将对其进行测试,但听起来确实有可能。我插入的国家边界只是接受一些记录,而不接受其他记录。从内存来看,可接受的几何形状适用于像安提瓜这样的小岛国(因此可能具有较短的WKT表示形式)。

因此,这最终可能更多是PostGIS数据库管理线程,而不是无效的几何线程。


您可以提供样本shp文件吗?
Mario Miler

不用担心。我正在使用的GSHHS海岸线数据是从此处下载的96mb数据。我正在使用的世界边界数据是thematicmapping.org
timmy 2011年

Answers:


6

我查看了您的数据和书籍示例,问题在于书籍中处理的数据中存在三个无效的多边形:

GSHHS_l_L1.shp

ID = 92瓦

POLYGON ((-180.0 71.514793999999995,-179.69008299999999 71.577888999999999,-178.648889 71.577416999999997,-178.40644399999999 71.549916999999994,-177.406306 71.244167000000004,-177.877444 71.022889000000006,-179.500111 70.863749999999996,-179.93011100000001 70.979583000000005,-180.0 70.962072000000006))

编号= 486-W

POLYGON ((-180.0 -16.799126,-179.84419399999999 -16.691278,-179.80041700000001 -16.789193999999998,-179.850472 -16.878361000000002,-180.0 -16.959561))

GSHHS_l_L2.shp

编号= 7333-W

POLYGON ((-180.0 65.393473,-179.76583299999999 65.428332999999995,-179.95416700000001 65.385555999999994,-179.90972199999999 65.316389,-180.0 65.321635))

因为这是一个示例,所以最简单的方法是从数据集中删除这些多边形,或者仅在代码中添加一个if语句

if geometry.IsValid():
       cursor.execute("INSERT INTO gshhs (level, geom) VALUES (%s, ST_GeomFromText(%s, 4326))", (level, wkt))

感谢Mario,看来我已经超越了我自己,而不是正确地验证了我所有的输入多边形。您的答案是正确的-使用OGR测试时,这些多边形显示为无效。有趣的是,在QGis中看起来还不错,但是ArcMap显示它们缺少完整的环。这三个多边形都落在日期线上,我想shapefile几何没有计算沿日期线的多边形边缘。您的解决方案是一种检测无效多边形的好方法。我会将帖子标记为已回答。
蒂米2011年

如果你觉得慈善,你有没有在过程中的下一步,这是什么好的解决办法纠正无效的多边形?我尝试使用OGR的.CloseRing()函数,但无济于事。我认为它只是忽略了函数调用。
timmy 2011年

我试图将“缓冲技巧”(workshops.opengeo.org/postgis-intro/validity.html)匀称地使用在ogr上,但没有成功。匀称不会读取无效的多边形,而ogr不会执行缓冲区操作,目前我不知道为什么。如果我迷失了答案,我会通知您。也许其他人在这个问题上取得了更大的成功。抱歉。
Mario Miler

我想现在可以进行多边形验证了。我想我以错误的方式使用了OGR的.CloseRings()函数。我称它为多边形的一种方法(即poly.CloseRings())。取而代之的是,我必须从多边形中提取“线性环”,然后在其上运行它(即lr = poly.GetGeometryRef(0); lr.CloseRings())。结果已成功插入PostGIS,并且我可以不用担心而在QGis中使用3个问题多边形。检查每个多边形的有效性只需要一点计算量。
蒂米,2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.