如何在交叉路口将OS​​M道路分割为单个路段?


10

我想使用OpenStreetMap数据创建一个用于pgRouting的道路网络。我从GeoFabrik将shapefile加载到Postgres表中(启用了PostGIS)。但是,我遇到的一个问题是道路并不总是在十字路口处终止,因此我决定在每个十字路口或十字路口将其全部拆分。

要找出所有地方的道路交叉或相交我用下面的interesections SQL(类似于以前的问题):

CREATE TABLE split_points as
SELECT DISTINCT    
   ST_GeometryN(ST_Intersection(a.geom, b.geom),1) as geom      
FROM
   roads as a,
   roads as b
WHERE
    ST_Touches(a.geom, b.geom)
OR
    ST_Crosses(a.geom, b.geom)    
    AND a.gid != b.gid
GROUP BY
   ST_Intersection(a.geom, b.geom);

我现在想利用这些点来分路。我使用以下方法:

CREATE TABLE split_roads as
SELECT     
    ST_GeomFromEWKB((ST_Dump(ST_Split(g.geom, blade.geom))).geom) As geom,
    generate_series(1,ST_NumGeometries((ST_Split(g.geom, blade.geom)))) as gid
FROM    
    split_points as blade,
    roads as g
WHERE
    ST_Intersects(g.geom, blade.geom);

这种分割方法的问题在于,除了所有分割件之外,还保留了完整的道路长度。为了删除其中包含的这些未拆分的道路几何图形,我使用了该ST_Equals()函数来识别它们并删除它们:

DELETE FROM split_roads USING roads
WHERE ST_Equals(split_roads.geom, roads.geom)

但是,此方法不会删除所有原始的未拆分几何(尽管它确实删除了其中的一些)。是否有更好的删除方法(或整体删除方法),以便表中只有拆分的几何图形?


根据文档,ST_Split不返回未拆分的原始几何。在SELECT语句的第一行中最后一个右括号中附加的“ .geom”是什么?可能就像删除它一样简单。
Scro 2012年

@Scro .geom您指的是什么?找不到它!
djq 2012年

从技术上讲,我猜这将是SELECT语句的第二行。另外,我指的是“ split_roads”表的创建。这是以')))。geom)as geom'结尾的行。
Scro 2012年

嗯,这样做时会出现错误。ERROR: function st_geomfromewkb(geometry_dump) does not exist LINE 4: ST_GeomFromEWKB((ST_Dump(ST_Split(g.geom, blade.geom))))... ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts.
djq 2012年

整个行看起来像这样吗:ST_GeomFromEWKB((ST_Dump(ST_Split(g.geom,blade.geom)))))as geom,
Scro 2012年

Answers:


6

不是真正解决您的问题的方法,但是请尝试osm2po ...它会创建完美的SQL代码以进行pgrouting中的路由:http ://osm2po.de/


谢谢你的建议。我已经尝试过了,osm2pgrouting但是它需要的内存比我的服务器还多,并且它终止时没有完成。
djq 2012年

2
@djq osm2po可以处理比osm2pgrouting大得多的文件。它甚至可以加载planet.osm
黑暗

啊,我本来以为osm2po是错字。是否可以直接在ubuntu中安装它?
djq 2012年

这是一个已编译的JAR文件(java)。只需按照网站上的说明运行即可。
GIS学生

11

简单的答案:不要。你不应该那样做。

从OSM道路Shapefile中,无法区分交叉口和高架/地下通道。如果分割所有看似交叉的道路,则将创建实际上不存在的交叉路口。

如果您不想使用现有的工具,例如osm2pgrouting(网络足够小)或osm2po,则需要动手处理原始OSM文件。


1
没错。这也是某些人在处理navteq和teleatlas数据时犯的另一个错误。地下通道/天桥是一个痛苦的现实。
拉吉·亚瑟(Ragi Yaser Burhum)2012年

1
同意。欢迎使用GIS,那里的数据总是或多或少是坏的
simplexio 2012年

3

关于使用pgRouting的一般问题:我认为@ Uffer,@ GisStudent和其他正在展示如何使用“ OSC&etc.”的人,它们是正确的。遵循“最佳做法”和“标准”的线索...

关于您的问题:“将道路分割成交叉路口的各个路段”或“如何删除所有原始的未分割几何图形”。如果您在这里逐步显示结果,我们可以为您提供帮助。

第一步:拓扑分析

 CREATE TABLE split_points_topo as
  SELECT     
    a.gid as gid_a, b.gid  as gid_b, ST_Relation(a.geom, b.geom) as DE9IM_code
  FROM
    roads as a,
    roads as b
  WHERE a.gid != b.gid AND a.geom && b.geom;

 SELECT DISTINCT st_geometryType(geom) FROM roads;
 SELECT DISTINCT DE9IM_code FROM split_points_topo;
 -- list here the results o these two queries!  ... after we can continue.


1

一种算法上解决问题的方法是将每条道路的起点和终点添加到“路口”集合中,以便可以确定每个路段都在两个路口之间。

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.