Hasilkan tabel dekat untuk x jumlah tetangga menggunakan arcpy

9

Ada 3 kemungkinan scenerio yang saya coba tangkap dalam jarak dekat untuk:

  1. Stasiun kereta bawah tanah interchange, yang memiliki 2 stasiun tetangga atau lebih. Artinya, stasiun yang dimaksud menghubungkan 2 atau lebih rute utama dan memiliki 2 atau lebih stasiun tetangga.
  2. Stasiun kereta bawah tanah terminal, yang hanya memiliki 1 stasiun tetangga. Ini adalah stasiun di ujung jalur.
  3. Stasiun kereta bawah tanah inline, yang memiliki tepat 2 stasiun tetangga, salah satunya.

Saya mencoba menghitung nilai yang mungkin disebut "jarak rata-rata antara stasiun tetangga"

The arcpy.GenerateNearTable_analysis()dapat menangani dua pilihan: Jarak fitur terdekat, dan Jarak antara semua fitur.

Adakah yang punya metode pintar untuk menyelesaikan skenario ini? Perhatikan bahwa setiap stasiun ditetapkan sebagai "Interchange", "Terminal" atau "Inline" di tabel atribut di bawah bidang "StationType".

Ditambahkan:

Berikut adalah beberapa kode psuedo berdasarkan saran @ whuber di komentar. Saya belum punya waktu untuk memikirkannya, jadi jika ada yang ingin menusuknya, Anda akan diberi tanda centang! ;)

Saya telah melihat perpustakaan NetworkX dan tampaknya berfungsi seperti yang saya inginkan.

Diberikan grafik:

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

serta simpul dan tautan:

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
Michael Markieta
sumber
Saya kira saya juga bisa menyebutkan bahwa saya menggunakan ArcGIS 10.1 dan saya suka modul arcpy.da (untuk kecepatannya). Saya harap kita bisa menggunakan ini.
Michael Markieta
3
FWIW ini murni masalah grafik-teori dengan solusi standar: Anda mencari grafik lingkungan masing-masing titik. Ini tersedia segera setelah Anda mewakili jaringan dalam format standar, seperti DCEL (atau generalisasi jika jaringan dalam non-planar). Ini menunjukkan bahwa beberapa solusi Python out-of-the-box mungkin tersedia.
whuber

Jawaban:

5

Saya percaya masalah Anda, sebagai @whuber, disarankan akan diwakili dalam Matriks Adjacency . Artinya, jika Anda punya waktu dan kecenderungan untuk memahami teori di baliknya, daripada mengandalkan paket untuk melakukan pekerjaan untuk Anda.

Untuk grafik G yang diberikan, dengan simpul {v 1 , v 2 , ..., v n } dengan n adalah jumlah simpul, Anda perlu membuat matriks ukuran M i, j di mana i = n dan j = n. Setiap dhuwur kemudian diwakili dalam baris ke- i dengan jumlah lintasan yang ditemukan ke verticies yang berdekatan di kolom j .

Contoh di bawah ini:

masukkan deskripsi gambar di sini

Dengan bentuk yang agak rumit ini untuk merepresentasikan data Anda yang relatif sederhana, Anda perlu memberi nomor pada simpul Anda secara sewenang-wenang, tidak mewakili urutan logis apa pun.

CATATAN: Dengan asumsi tidak ada stasiun loop pada dirinya sendiri, baris ke- k tidak akan pernah memiliki nilai selain 0 pada kolom ke- k . Semua definisi di bawah menganggap ini benar

CATATAN: Dengan asumsi tidak ada garis konkuren antara stasiun yang sama, semua contoh di bawah ini mengasumsikan bahwa nilai sel hanya akan menjadi 1 atau 0. Contoh di atas juga mengasumsikan perjalanan dua arah diizinkan.

Aturan untuk mengidentifikasi kategori stasiun:

1. Terminal

Terminal akan diidentifikasi oleh baris k yang memiliki kolom tunggal yang tidak memiliki nilai 0, dan nilai mana adalah 1. Lihat simpul 1, 2, dan 3 pada contoh 1 di atas.

2. Persimpangan

Persimpangan akan diidentifikasi oleh baris k yang memiliki lebih dari dua kolom yang berisi nilai 1. Lihat simpul 4 pada contoh 1 di atas, atau semua simpul dalam contoh 3 di atas.

3. Sebaris

Stasiun inline ditandai dengan memiliki tepat 2 kolom di baris ke- k di mana nilainya adalah 1. Lihat semua simpul pada contoh 2 di atas. (Abaikan fakta bahwa {v 1 , v 3 } memotong {v 2 , v 4 }.)

nagytech
sumber
Siapa kamu dan dari mana asalmu! Itu adalah salah satu jawaban terbaik yang saya terima dalam waktu yang lama. @Geoist terima kasih.
Michael Markieta
@MichaelMarkieta Cerita lucu, saya baru tahu tentang ini bukan 2 jam sebelum saya melihat posting Anda.
nagytech
1

Anda dapat mencoba menggunakan Shapely . Jika Anda mengonversi titik lengket Anda ke titik bentuk, Anda dapat menghitung jarak antara titik-titik individual.

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
Cyrus
sumber
Saya harus menyebutkan bahwa Shapely hanya dapat digunakan untuk fitur pada bidang Cartesian, jadi metode ini tidak akan berfungsi jika data Anda berada dalam koordinat geografis.
Cyrus
Jawaban ini menunjukkan ambiguitas dalam bagaimana pertanyaan itu dapat dipahami. Saya telah membaca pertanyaan yang mengindikasikan jarak yang diketahui; perhitungan mereka tampaknya bukan masalah. Apa yang dicari oleh OP, saya yakin, adalah algoritma untuk mengidentifikasi sejumlah variabel tetangga langsung simpul di sepanjang jaringan, hingga akhir kemudian mengambil jarak mereka dan menghitung ringkasan statistiknya (seperti rata-rata).
whuber
@whuber Ups! Setuju, saya menjawab pertanyaan itu agak terlalu tergesa-gesa.
Cyrus
@whuber ada di sasaran.
hhart
Ini tidak akan berhasil untuk saya, tapi terima kasih!
Michael Markieta