Arcpy kullanarak x komşu sayısı için tabloya yakın üret


9

Uzak mesafeleri yakalamaya çalıştığım 3 olası senaryo var:

  1. 2 veya daha fazla komşu istasyonu bulunan bir kavşak metro istasyonu. Yani, söz konusu istasyon 2 veya daha fazla ana güzergahı birbirine bağlar ve 2 veya daha fazla komşu istasyona sahiptir.
  2. Sadece 1 komşu istasyona sahip bir terminal metro istasyonu. Bu, hattın sonundaki istasyon.
  3. Her iki yaklaşımdan biri tam olarak 2 komşu istasyona sahip bir hat içi metro istasyonu.

Biri "komşu istasyonlar arasındaki ortalama mesafe" olarak adlandırabileceğiniz bir değeri hesaplamaya çalışıyorum

arcpy.GenerateNearTable_analysis()Tüm özellikleri arasındaki yakın özelliğine uzaklığı ve uzaklığı: iki seçenek işleyebilir.

Herkes bu senaryoları çözmek için akıllı bir yöntemi var mı? Her istasyonun "StationType" alanının altındaki özellik tablosunda "Interchange", "Terminal" veya "Inline" olarak belirtildiğini unutmayın.

Katma:

İşte @ whuber'ın yorumlardaki önerisine dayanan bazı psuedo kodu. Bunu henüz anlamaya zamanım yok, bu yüzden eğer herhangi biri bir bıçak almak isterse bir onay işareti ile ödüllendirileceksiniz! ;)

NetworkX kütüphanesine bir göz attım ve istediğim gibi çalışıyor.

Grafik verildiğinde:

A —― B ―― C ―― D
     |
     E

düğümlerin ve bağlantıların yanı sıra:

Nodes = ["A", "B", "C", "D", "E"]
Links = [("A", "B"), ("B", "C"), ("C", "D"), ("B", "E")]

def myFunction(node):
    identify the links that node belongs to
    count the number of links
    calculate the total link lengths
    divide the total link lengths by the number of links
    return someValue

Sanırım ArcGIS 10.1 kullanıyorum ve arcpy.da modülünü seviyorum (hızı için). Umarım bunu kullanabiliriz.
Michael Markieta

3
FWIW bu sadece standart bir çözümle birlikte grafik-teorik bir sorundur: her bir tepe noktasının komşu grafiğini ararsınız. Ağı, DCEL (veya ağ düzlemsel değilse, genelleme) gibi standart bir formatta temsil ettiğiniz anda hemen kullanılabilir . Bu, bazı hazır Python çözümlerinin mevcut olabileceğini düşündürmektedir.
whuber

Yanıtlar:


5

@Whuber'ın önerdiği gibi sorununuzu en iyi şekilde bir Bitişiklik Matrisinde temsil edeceğine inanıyorum . Yani, sizin için işi yapmak için bir pakete güvenmek yerine, arkasındaki teoriyi anlamak için zamanınız ve eğiliminiz varsa.

Belirli bir G grafiği için, {v 1 , v 2 , ..., v n } köşelerine sahip, burada n , köşe sayısıdır, M i, j boyutunda bir matris oluşturmanız gerekir , burada i = n ve j = n. Daha sonra her köşe, i. Satırda j . Sütunundaki bitişik verilere bulunan yolların sayısı ile temsil edilir .

Aşağıdaki örnek:

resim açıklamasını buraya girin

Nispeten basit verilerinizi temsil etmenin bu hafif karmaşık şekli göz önüne alındığında, köşelerinizi herhangi bir mantıksal düzeni temsil etmeyen, keyfi bir şekilde numaralandırmanız gerekecektir.

NOT: Hiçbir istasyonun kendi kendine dönmediğini varsayarsak, bir k. Satırın hiçbir zaman k . Sütununda 0 dışında bir değer olmaz . Aşağıdaki tüm tanımlar bunun doğru olduğunu varsayar.

NOT: Aynı istasyon arasında eşzamanlı hat olmadığı varsayılarak, aşağıdaki tüm örnekler bir hücre değerinin sadece 1 veya 0 olacağını varsayar. Yukarıdaki örnekte ayrıca çift yönlü harekete izin verildiği varsayılmaktadır.

İstasyon kategorilerini belirleme kuralları:

1. Terminal

Bir terminal , 0 değeri olmayan ve değeri 1 olan tek bir sütuna sahip bir k. Satırla tanımlanır . Yukarıdaki örnek 1'deki 1, 2 ve 3 köşelerine bakın.

2. Kavşak

Bir kavşak , 1 değerini içeren ikiden fazla sütuna sahip bir k. Sıra ile tanımlanacaktır. Yukarıdaki örnek 1'deki köşe 4'e, alternatif olarak yukarıdaki örnek 3'teki tüm köşelere bakınız.

3. Satır İçi

Satır içi bir istasyon, değerin 1 olduğu bir k. Satırda tam olarak 2 sütun bulunarak belirtilir. Yukarıdaki örnek 2'deki tüm verilere bakın. ({V 1 , v 3 } öğesinin {v 2 , v 4 } ile kesiştiği gerçeğini göz ardı edin .)


Sen kimsin ve nereden geldin! Bu uzun zamandır aldığım en iyi cevaplardan biriydi. Teşekkürler @Geoist.
Michael Markieta

@MichaelMarkieta Komik hikaye, ben sadece senin görmüşse değil 2 saat önce bu öğrendik.
nagytech

1

Shapely'yi kullanmayı deneyebilirsiniz . Eğer kavisli noktalarınızı düzgün noktalara dönüştürürseniz, münferit noktalar arasındaki mesafeyi hesaplayabilirsiniz.

import arcpy
import shapely

arc_point1 = arcpy.Point(1,1)
arc_point2 = arcpy.Point(5,5)

shp_point1 = shapely.geometry.Point(arc_point1.X, arc_point1.Y)
shp_point2 = shapely.geometry.Point(arc_point2.X, arc_point2.Y)

distance = shp_point1.distance(shp_point2)
print "distance:", distance

Shapely'nin sadece Kartezyen bir düzlemdeki özellikler için kullanılabileceğinden bahsetmeliyim, bu nedenle verileriniz coğrafi koordinatlardaysa bu yöntem işe yaramaz.
Cyrus

Bu cevap, sorunun nasıl anlaşılacağı konusunda bir belirsizlik göstermektedir. Mesafelerin bilindiğini belirten soruyu okudum ; onların hesaplanması sorun gibi görünmüyor. OP'nin aradığı şey, bir ağ boyunca köşelerin değişken sayıda hemen komşularını tanımlamak , mesafelerini almak ve bunların istatistiksel bir özetini (ortalama gibi) hesaplamak için bir algoritma olduğuna inanıyorum .
whuber

@whuber Hata! Anlaştık, soruyu biraz aceleyle cevapladım.
Cyrus

@whuber izliyor.
hhart

Bu benim için işe yaramaz, ama teşekkürler!
Michael Markieta
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.