OSM yollarını kavşaklarda ayrı segmentlere nasıl ayırabilirim?


11

OpenStreetMap verilerini kullanarak pgRouting ile kullanmak için bir yol ağı oluşturmak istiyorum. Geogabrik'ten Postgres tablosuna (PostGIS etkinken) bir şekil dosyası yükledim. Ancak, yaşadığım bir sorun, yolların her zaman kavşaklarda bitmemesiydi, bu yüzden hepsini her kavşakta veya kavşakta ayırmaya karar verdim.

Yolların kesiştiği veya kesiştiği tüm kesişmeleri tanımlamak için aşağıdakileri kullandım SQL( önceki soruya benzer ):

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);

Şimdi bu noktaları kullanarak yolları bölmek istiyorum. Aşağıdaki yaklaşımı kullandım:

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);

Bu bölünmüş yaklaşımın sorunu, tüm bölünmüş parçalara ek olarak tam yol uzunluğunun kalmasıdır. İçerilen bu bölünmemiş yol geometrilerini kaldırmak ST_Equals()için onları tanımlamak ve silmek için işlevi kullandım :

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

Bununla birlikte, bu yaklaşım tüm orijinal bölünmemiş geometrileri kaldırmaz (bazılarını kaldırmasına rağmen). Bir tabloda yalnızca bölünmüş geometrilere sahip olmam için silme (veya genel) için daha iyi bir yaklaşım var mı?


Belgelere göre, ST_Split orijinal, bölünmemiş geometriyi döndürmez. SELECT ifadenizin ilk satırındaki son kapanış parantezinde takılan bu ekstra '.geom' nedir? Bunu kaldırmak kadar basit olabilir.
Scro

@Scro kimi kast .geomediyorsun? Tespit edemiyorum!
djq

Teknik olarak, bu SELECT deyiminin ikinci satırı olurdu sanırım. Ayrıca "split_roads" tablo oluşturma atıfta bulunuyorum. '))). Geom) geom' ile biten çizgidir.
Scro

hmm, bunu yaptığımda bir hata alıyorum. 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

Tüm çizgi şöyle mi görünüyordu: ST_GeomFromEWKB ((ST_Dump (ST_Split (g.geom, blade.geom)))))
Geom olarak

Yanıtlar:


6

Sorununuza gerçek bir çözüm değil, ama osm2po'yu deneyin ... pgrouting yönlendirmesi için mükemmel SQL kodu oluşturur: http://osm2po.de/


Önerin için teşekkürler. Denedim osm2pgroutingama sunucumdan daha fazla bellek gerektirir ve bitmeden sona erer.
djq

2
@djq osm2po, osm2pgrouting uygulamasından çok daha büyük dosyaları işleyebilir. Planet.osm'u bile yükleyebilir
underdark

ah, başlangıçta osm2pobir yazım hatası olduğunu düşündüm . Ubuntu'ya kurmanın basit bir yolu var mı?
djq

Hazır derlenmiş bir JAR dosyasıdır (java). Sadece web sitesinde açıklandığı gibi çalıştırın.
CBS Öğrenci

12

Basit cevap: Yapma. Bunu bu şekilde yapmamalısın.

OSM yol Shapefiles'ından, kavşaklar ve üst / alt geçitler arasında ayrım yapmak imkansızdır. Görünüşte kesişen tüm yolları böldüğünüzde gerçekte var olmayan kavşaklar yaratacaksınız .

Osm2pgrouting (ağın yeterince küçük olduğu) veya osm2po gibi mevcut araçları kullanmak istemiyorsanız, ellerinizi orijinal OSM dosyasıyla kirletmeniz gerekir.


1
Aynen öyle . Bu aynı zamanda bazı kişilerin navteq ve teleatlas verilerini işlerken yaptıkları başka bir hatadır. Altgeçit / Üstgeçit bir acıdır, ancak bir gerçektir.
Ragi Yaser Burhum

1
Katılıyorum. Verilerin her zaman aşağı yukarı kötü olduğu CBS'ye hoş geldiniz
simplexio

3

PgRouting kullanarak genel sorununuz hakkında: Bence @Uffer, @GisStudent ve "OSC vb." Nasıl kullanılacağını gösteren diğerleri, onlar haklı. "En iyi uygulamalar" ve "standartlar" ın ipuçlarını takip edin ...

Sorunuz hakkında: "yolları kesişme noktalarında tek tek segmentlere ayırın" veya "tüm orijinal bölünmemiş geometrilerin nasıl kaldırılacağı". Sonuçlarınızı burada adım adım gösterirseniz yardımcı olabilirim ...

İlk adım: topoloji analizi

 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.

2

Başka bir "sorununuza gerçek bir çözüm değil", ancak OSM dönüştürücümüz OSM'den SHP'ye dönüşürken kesişme noktalarında ayrılıyor. Bu şekilde daha verimlidir, çünkü geometrik hesaplamalar yapmak yerine düğümlerin kimliğini karşılaştırabilir.


1

Bunu algoritmik olarak çözmenin bir yolu, her bir yolun başlangıç ​​ve bitiş noktalarını "kavşaklar" kümesine eklemek olacaktır, böylece her parçanın iki kavşak arasında olduğundan emin olabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.