Bir noktayı çevreleyen tüm satırları al


12

QGIS kullanıyorum ve bir noktam ve yol ağım var. Belirli bir noktayı kapsayan yol adlarını otomatik olarak çıkarmam gerekiyor. resim açıklamasını buraya girin En yakın komşu analizi ve tampon bölgeleri işi yapamaz, çünkü çoğu durumda nokta, ölçülen mesafe olarak, komşu yollara değil, komşu yollara daha yakındır. Sadece kapalı yolların nasıl çıkarılabileceğine dair herhangi bir fikir var mı?


6
Belki de, kapalı alanı (bir dizi çizgiden oluşan), çokgen duvarlarını oluşturan yolların nitelikleri ile bir çokgene dönüştürün - o zaman üst üste binen konumu kullanarak basit bir seçim yapabilirsiniz. Bu örnekte, "145699" noktası "roada_roadb_roadc_roadd" çokgeninin içine düşüyor.
Harita Erkek

Yanıtlar:


3

Test verilerim hakkında:

  1. OSM Yol Verileri gibi, her bir yol geometrisi bir kavşakta sona erer.
  2. Her yolun kendine özgü bir kimliği vardır.

ÇÖZÜM I

İki varsayım varsa:

  1. Yollar mahalleler inşa ediyor.

  2. Bir metrik sistemde çalışıyorsunuz.

Fikir, noktanın X ve Y koordinatlarını arttırmak / azaltmaktır. Bir metrik sistem içinde çalışıyorsanız, noktanızın 1 m doğusunda yer alabilir, yeni bir nokta oluşturabilir ve orijinal nokta ile bir çizgi oluşturabilirsiniz. Hat bir yol kesişene kadar Doğu'ya doğru ilerliyorsunuz. Batı'da bir kavşak aramak için orijinal X koordinatından 1 m çıkarmalısınız. Aynı şey Y koordinatı için de geçerlidir. Kuzey / Doğu / Güney / Batı'da yol yoksa, sayaç 1000 (m) 'de durur. 1000 m'den daha uzun bir mesafede bir yol olabileceğini bildiğinizde bu değeri değiştirmeniz gerekir.

Görevi aşağıdaki kodla çözebilirsiniz:

Düzenlenen

for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
    if lyr.name() == "point":
        startpoint = lyr

for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
    if lyr.name() == "roads":
        roads = lyr

startpoint_iter = startpoint.getFeatures()
for feature in startpoint_iter:
    geom = feature.geometry()
    if geom.type() == QGis.Point:
        xy = geom.asPoint()
        x,y = xy[0], xy[1]

line_start = QgsPoint(x,y)      

def reached(direction, count_m):
    road_reached = None
    road = None
    count=1
    while road_reached < 1 and count <=count_m:
        count += 1
        if direction == 'N':
            line_end = QgsPoint(x, y+count)
        if direction == 'E':
            line_end = QgsPoint(x+count,y)
        if direction == 'S':
            line_end = QgsPoint(x,y-count)
        if direction == 'W':
            line_end = QgsPoint(x-count,y)
        line = QgsGeometry.fromPolyline([line_start,line_end])
        for f in roads.getFeatures():
            if line.intersects(f.geometry()):
                road_reached = 1
                road = f['name']
                print road

reached('N', 1000)
reached('E', 1000)
reached('S', 1000)
reached('W', 1000)

Doğudaki e yolunun noktanın yakın bir yolu olarak kabul edilmediğini gösteren başka bir örnek.

resim açıklamasını buraya girin

İşlev ve çıkış nasıl çağırılır:

>>>>reached('N', 1000)
road a
>>>>reached('E', 1000)
road b
>>>>reached('S', 1000)
road c
>>>>reached('W', 1000)
road d

Noktayı çevreleyen 4'ten fazla yol varsa, daha fazla yöne bakmanız gerekir (hem X hem de Y'yi değiştirin). Veya çizginizin azimutunu değiştirebilirsiniz, yani 0-360 ° aralığında bir derece döndürebilirsiniz.

ÇÖZÜM II

Yorumdan esinlenerek Polygonizeönce yollarınızı da yapabilirsiniz . Bu nedenle adı QGIS bir aracı kullanabilirsiniz: Processing > Toolbox > QGIS geoalgorithms > Vector geometry tools > Polygonize. Geçici katmanı yeniden adlandırın polygon. Tamamen yollarla çevrili nokta için yol adlarına sahip olmak istediğinizi varsayarsak. Aksi takdirde ÇÖZÜM I kullanmanız gerekir . Bu sadece tüm yollar bağlıysa (koparılmışsa)!

resim açıklamasını buraya girin

İlk önce nokta çokgenle kesişmelidir. Şimdi fikir, her ikisinin de, ANDkapalı bir çizginin başlangıç bitiş noktasının çokgenle kesişmesi gerektiğidir.

for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
    if lyr.name() == "point":
        startpoint = lyr

for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
    if lyr.name() == "polygon":
        poly = lyr

for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
    if lyr.name() == "roads":
        roads = lyr

for h in startpoint.getFeatures():
    for g in poly.getFeatures():
        if h.geometry().intersects(g.geometry()):
            poly_geom = g.geometry()
            for f in roads.getFeatures():
                geom = f.geometry().asPolyline()
                start_point = QgsGeometry.fromPoint(QgsPoint(geom[0]))
                end_point = QgsGeometry.fromPoint(QgsPoint(geom[-1]))
                if poly_geom.intersects(start_point) and poly_geom.intersects(end_point):
                    print f['name']

Çıktı:

road c
road b
road e
road f
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.