2016-04-14 25 views
1

我在玩OpenStreetMaps数据。由渗透装载到Postgres 9.4中,使用Postgis 2.2。,为ways表构建线串几何。如何构建无效线串的区域(或防止错误)

我想要制作来自某些relations的多边形(在OSM中,关系是一组方式(linestrings) - 一些标记为外部,一些作为内部,并非每一种方式都必须关闭 - 多种方式可以表示外部环) 。但是,OSM数据并不完美 - 存在形成严重的关系,内部“孔”与外环相交。例如:http://www.openstreetmap.org/relation/6095901#map=17/48.93209/19.14858

我想这个查询

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 

,其结果是错误:

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 

那么,什么是我选择这里?理想情况下,我想以某种方式“修复此问题” - 也许忽略有问题的“漏洞”,或者将它们“夹”到外环边界等。

如果不行,至少我想查询“跳过” NULL几何)的像这样的无效关系,而不是死于第一个错误,没有结果。

编辑:最初的示例案例在OSM数据中得到修复。这里是一个新的例子:关系ID 5636774是自相交多面体

+0

对于无效几何,可以使用ST_MakeValid(geom)函数。 –

回答

0

我相信你可以通过使用ST_Union而不是ST_Collect来避免这些错误。它速度较慢,但​​会摆脱重叠部分。有关于它的文档中的笔记ST_Collect:

http://postgis.net/docs/ST_Collect.html

这里是我做过什么来测试你的第二个例子:

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

我试过ST_Union,它不是很好 - 多边形内的任何“孔”都以这种方式丢失 - 外壳内部的所有区域都被填充。这也发生在有效的多边形中,所以这会产生比少数有问题的无效多边形更多的无效数据 – rouen

相关问题