Bir haritadaki yol kavşaklarını tespit etmenin etkili bir yolu nedir?


14

Projem için herhangi bir kaynaktan harita alabilirim ve yaptığım C ++ algoritması için, algoritmanın yol kavşaklarının (ikiden fazla yol segmentinin buluştuğu düğümler) nerede olduğunu bilmek zorunludur. Ayrıca, elde ettiğim haritaların çoğunda, aşılan ve aşılan yollar var (yollar: düzgün bağlanmamış). Sorunu düzeltmenin bir yolu, Autocad kullanarak yol ağını 'temizlemektir'. Sorularım:

  1. Haritamı, yol kavşakları hakkında bilgi içeren bir GML formatında almanın etkili bir yolu var mı (bunu yapabilen herhangi bir yazılım?)? (belirli bir düğümün bir kavşak olduğunu söyleyen bir GML etiketine sahip olabilirsiniz)
  2. Yol ağını 'temizlemenin' başka bir yolu var mı?

İş arkadaşları FME'yi önerdi, ancak bu komut dosyaları yazmayı içeriyor ve komut dosyasının tüm haritalara hitap edecek kadar esnek olup olmayacağından emin değiliz. Kavşakları tespit etmenin diğer tek yolu kaba kuvvet kullanmak ve hangi yol segmentlerinin ortak düğümlere sahip olduğunu bulmaktır. ArcGIS yardımcı olur mu? (kullanmadım, ama duydum) Eminim daha iyi bir yol olmalı ...


2
Kendiliğinden kesişen yollar bulması gerekiyor mu? Dejenere geometrileri nasıl ele almalıdır (tüm köşelerin çakıştığı, böylece sıfır uzunluğa sahip olan polinler). Kesişimin sadece bir nokta değil, doğrusal bir segment olduğu çakışan çizgileri nasıl ele almalı?
Kirk Kuykendall

@Kirk: Bahsettiğiniz durumlarda biraz şok oldum. CBS'de yeniyim ve bu tür olasılıkların var olduğunu bile bilmiyordum. 1.Kendi kesişimi birden fazla segment gerektirir. Bir köprü olmadıkça, bu kavşakları kavşak olarak görürüm. 2. Dejenere geometrinin ne olduğunu hayal bile edemiyorum, bu yüzden neye cevap vereceğimi bilmiyorum. 3. Çakışan çizgiler iki ayrı yol olarak ele alınmalıdır çünkü gerçek hayatta da böyle olacağını varsayıyorum.
Nav

Yanıtlar:


9

Yolları Shapefile gibi uzamsal bir formda varsa, bunları PostGIS'e yükleyebilir ve bir SQL sorgusu kullananları otomatik olarak bulmasını sağlayabilirsiniz. Daha önce bunu yaptım - SQL deyimi coğrafi olarak kesişen her yol bulmak ve her geçiş için bir düğüm noktası oluşturmak için tasarlanmıştır.

Bunu daha sonra temizlemeye çalışacağım, ancak burada alabileceğiniz temel akış ...

for line in road_layer_lines:
    ilines = get_intersecting_objects(line)
    for iline in ilines:
        road_junctions.extend(get_intersection(line, iline))

ST_ * fonksiyonları, PostGIS içinde bu çalışmayı sağlayan şeydir

  • ST_Envelope : Belirli bir geometrinin sınırlayıcı kutusunu tutar - bu, algoritmayı hızlandırmak için kullanılır. Hızlı ancak daha az hassas bir geçişte coğrafi bir aramayı sınırlayıcı kutularla daraltabilir ve sonuçları gerçek geometrilerle tarayabilirsiniz.
  • ST_Intersects : İki geometrinin kesişip kesişmediğini belirler
  • ST_Intersection : İki geometrinin kesişimini döndürür

Aşağıdakiler sadece snippet'lerdir çünkü bitirmek için zamanım yok, belki birileri buraya geri dönmeden önce düzenleyebilir ...

SELECT id, the_geom FROM road_lines
SELECT roads.id FROM road_lines roads WHERE ST_Intersects(roads.the_geom, my_geom)
SELECT ST_Intersection(roads.the_geom, my_geom) FROM road_lines roads WHERE roads.id = my_id

Sadece paylaşmak: Karşılaştığım başka bir veritabanı bu - < oracle.com/technetwork/database/berkeleydb/overview/index.html >. Görünüşe göre sorgular çok hızlıdır, çünkü sorgular uygulamaya gömülebilecek kütüphaneler olarak mevcuttur.
Nav

1
@ dmsnell- Belki bu görevi yerine getirmek için kullanılan SQL sorgusu türüne bir örnek verebilir misiniz?
RyanKDalton

11

Tamponları kullanarak çoklu çizgileri inanılmaz yollarla analiz edebilirsiniz. Bu genellikle verimsizdir - tamponlar birçok ek köşe oluşturur - ancak (a) birçok CBS'de (vektör veya raster tabanlı) bulunan bir tekniktir ve (b) bazen elde edilmesi zor olan bilgileri üretebilir.

Bu durumda, yolu az miktarda tamponlamak ve daha sonra aynı miktarın negatifi ile tamponlamak, tüm virajlarda ve tüm kavşaklarda küçük "adalar" bırakır . Bunun geometrik olarak kanıtlanması kolaydır.

650 m genişliğindeki bir haritada 10 m'lik bir çoklu çizgi tamponu (gri) ve -10 m'lik tampon (açık kırmızı) örneği:

Şekil 1

Şimdi orijinal poliline katmanını bu ada çokgenleriyle kesiştirin, segmentleri ada tanımlayıcıyla birleştirin ve parçaları sayın:

şekil 2

Açık sarı segmentler yüksek sayımlı parçaları, koyu mavi segmentler ise düşük sayımlı parçaları belirtir. Bu şekilde (a) tüm kıvrımları ve kavşakları (kendi kavşakları dahil) ve yakın kavşakları bulduk ( iki parçanın tam olarak buluşmadığı uç sola bakın) ve (b) kıvrımları kavşaklardan ayırdık. İki veya daha fazla bağlı segment içeren adaları seçerek neredeyse kavşakları bulabiliriz: kıvrımlar sadece bağlı segmentleri içerir.

Tamponlama simetrisinden dolayı, kesişme adalarının sentroidleri kesişme noktalarıdır.

Bu analiz tarzının güzel bir yönü, altta yatan polyline'ın nasıl temsil edildiğini umursamamasıdır: tek bir özellik olabilir, her çizgi segmenti için bir özellik olabilir veya aradaki herhangi bir şey olabilir.


6

Evet, bunu FME ile yapabilirsiniz. Temizleme, kavşaklar ve topolojiyle uğraşan birçok "transformatör" vardır; Bu durumda TopologyBuilder trafosunu denerdim .

Herhangi bir komut dosyasının tamamı grafik bir ortamda yapılır, bu nedenle yapılması çok kolaydır.

Www.safe.com adresinden her zaman deneme sürümünü edinebilirsiniz

(Açıklama: Mark Ireland, diğer adı FME Evangelist, Safe Software Inc.)


Bunu ikinciyim. FME, hem AutoCAD'den GML'ye dönüşüm hem de topolojik temizleme için bu özel sorun için mükemmeldir. Uygulamasında şaşırtıcı derecede evrensel olabilir.
blord-castillo


-1

Ücretsiz deneme ile alabileceğiniz Arcgis ağ analisti bunu 10 saniyeden daha kısa sürede ve sadece birkaç tıklamayla yapar.


-1

İşlem ağ analisti ile ArcGIS'de yapılabilir.

ArcGIS'te başka bir yol daha var: aşağıdaki adımlardan geçebilirsiniz: "Arctoolbox" → "Veri yönetimi araçları" → "özellikler" → "noktalara nokta özellikleri" ve orada ihtiyacınız olanı yapabilirsiniz.

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.