首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从无效的行字符串生成区域(或防止错误)

如何从无效的行字符串生成区域(或防止错误)
EN

Stack Overflow用户
提问于 2016-04-14 13:40:53
回答 1查看 626关注 0票数 1

我在玩OpenStreetMaps数据。使用Postgis2.2加载到Postgres9.4中,其中包含为ways表构建的线条字符串几何图形。

我想要从某些relations (在OSM中,关系是一组方法(线串)--一些标记为外部,有些标记为内部,并不是每一条路都必须关闭-多个方法在一起可以表示外环)。但是OSM的数据并不完美例如:http://www.openstreetmap.org/relation/6095901#map=17/48.93209/19.14858

我正在尝试这个查询

代码语言:javascript
复制
SELECT ST_BuildArea(ST_Collect(w.linestring)) AS geom
FROM relations r
JOIN relation_members rm ON r.id = rm.relation_id AND rm.member_type = 'W'
JOIN ways w ON w.id = rm.member_id
WHERE r.id = 6095901 -- in reality here is broad condition on relation
GROUP BY r.id

其结果是错误:

代码语言:javascript
复制
ERROR:  LWGEOM_GEOS_buildArea: TopologyException: Input geom 1 is invalid: Self-intersection at or near point 19.149718131981164 48.934732947538478 at 19.149718131981164 48.934732947538478

我在这里有什么选择?理想情况下,我想“解决这个问题”--也许会忽略有问题的“洞”,或者把它们“夹”到外环边界等等。

如果不可能,至少我希望查询“跳过”(返回空几何学)来查找这种无效的关系,并且不会因为第一个错误而死而没有结果。

编辑:原始示例在OSM数据中被修复。下面是一个新示例: relation 5636774是自相交的多多边形。

EN

回答 1

Stack Overflow用户

发布于 2016-06-02 00:09:49

我相信您可以通过使用ST_Union而不是ST_Collect来避免这些错误。它的速度较慢,但它将消除重叠的部分。在ST_Collect的文档中有关于它的说明:

Collect.html

下面是我在测试第二个示例时所做的工作:

代码语言:javascript
复制
create table ways ( id integer, linestring  geometry(Linestring, 4326) );
insert into ways values (1, ST_GeomFromText('LINESTRING(52.3474437 35.3635293,52.347219 35.3636168,52.3472848 35.36407,52.3475095 35.3639826,52.3474437 35.3635293 )', 4326));
insert into ways values (1, ST_GeomFromText('LINESTRING(52.3473579 35.3642849,52.347274 35.3636982,52.3468764 35.3638506,52.3468949 35.3639796, 52.3472102 35.3638587, 52.3472757 35.3643164, 52.3473579 35.3642849)', 4326));
insert into ways values (1, ST_GeomFromText('LINESTRING(52.3468455 35.3636261, 52.34673 35.3636689, 52.3468697 35.3646806, 52.3474622 35.3644612, 52.3474339 35.3642567, 52.3473579 35.3642848, 52.3472762 35.3643151, 52.346957 35.3644333,  52.3468945 35.3639806,  52.3468765 35.3638507, 52.3468455 35.3636261)', 4326));
select ST_BuildArea(ST_Collect(linestring)) from ways;
select ST_BuildArea(ST_Union(linestring)) from ways;

我也考虑过使用ST_IsValid,但事实证明,即使在这种糟糕的形状下,ST_IsValid(ST_Collect(linestring))也是正确的,所以我想这对您没有任何帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36624943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档