Untuk setiap kelompok blok Sensus 208.781, saya ingin mengambil ID FIPS dari semua tetangga urutan pertama. Saya memiliki semua batas TIGER yang diunduh dan digabung menjadi 1GB shapefile tunggal.
Saya mencoba skrip ArcPython yang menggunakan SelectLayerByLocation untuk BOUNDARY_TOUCHES pada intinya, tetapi dibutuhkan lebih dari 1 detik untuk setiap grup blok yang lebih lambat dari yang saya inginkan. Ini bahkan setelah saya membatasi pencarian SelectLayerByLocation untuk memblokir grup dalam kondisi yang sama. Saya menemukan skrip ini , tetapi juga menggunakan SelectLayerByLocation secara internal sehingga tidak lebih cepat.
Solusinya tidak harus berbasis Arc - saya terbuka untuk paket lain, meskipun saya paling nyaman coding dengan Python.
Jawaban:
Jika Anda memiliki akses ke ArcGIS 10.2 untuk Desktop, atau mungkin sebelumnya, maka saya pikir alat Polygon Neighbors (Analisis) yang:
mungkin membuat tugas ini lebih mudah sekarang.
sumber
Untuk solusi menghindari ArcGIS, gunakan pysal . Anda bisa mendapatkan bobot langsung dari shapefile menggunakan:
atau
Buka dokumen untuk info lebih lanjut.
sumber
Hanya pembaruan. Setelah mengikuti saran Whuber, saya menemukan bahwa Generate Spatial Weights Matrix hanya menggunakan loop Python dan kamus untuk menentukan tetangga. Saya mereproduksi proses di bawah ini.
Bagian pertama loop melalui setiap simpul dari setiap grup blok. Ini membuat kamus dengan koordinat titik sebagai kunci dan daftar ID grup blok yang memiliki titik pada koordinat itu sebagai nilai. Perhatikan bahwa ini membutuhkan dataset yang rapi secara topologi, karena hanya vertex / vertex yang tumpang tindih yang akan terdaftar sebagai hubungan tetangga. Untungnya, pembentukan blok grup TIGER Biro Sensus tidak ada masalah dalam hal ini.
Bagian kedua loop melalui setiap simpul dari setiap kelompok blok lagi. Ini membuat kamus dengan ID grup blok sebagai kunci dan ID tetangga kelompok itu sebagai nilainya.
Di belakang saya menyadari saya bisa menggunakan metode yang berbeda untuk bagian kedua yang tidak memerlukan perulangan melalui shapefile lagi. Tapi ini yang saya gunakan, dan berfungsi cukup baik bahkan untuk 1000-an grup blok sekaligus. Saya belum mencoba melakukannya dengan seluruh AS, tetapi dapat mengeksekusi untuk seluruh negara.
sumber
Alternatifnya mungkin menggunakan PostgreSQL dan PostGIS . Saya telah mengajukan beberapa pertanyaan tentang cara melakukan perhitungan serupa di situs ini:
Saya menemukan ada kurva belajar yang curam untuk mencari tahu bagaimana berbagai bagian dari perangkat lunak cocok bersama, tetapi saya menemukan itu bagus untuk melakukan perhitungan pada lapisan vektor besar. Saya sudah menjalankan beberapa perhitungan tetangga terdekat pada jutaan poligon dan itu cepat dibandingkan dengan ArcGIS.
sumber
Hanya beberapa komentar ... metode esri / ArcGIS saat ini menggunakan kamus untuk menyimpan informasi tetapi perhitungan inti dilakukan dalam C ++ menggunakan Polygon Neighbors Tool. Alat ini menghasilkan Tabel yang berisi informasi kedekatan serta attr opsional seperti panjang batas bersama. Anda dapat menggunakan Generate Spatial Weights Matrix Tool jika Anda ingin menyimpan dan kemudian menggunakan kembali info berulang-ulang. Anda juga dapat menggunakan fungsi ini di WeightsUtilities untuk menghasilkan kamus [akses acak] dengan info kedekatan:
di mana inputFC = semua jenis kelas fitur poligon, masterField adalah bidang "ID unik" dari bilangan bulat dan contiguityType di {"ROOK", "QUEEN"}.
Ada upaya di esri untuk melewati aspek tabular untuk pengguna Python dan langsung ke iterator yang akan membuat banyak kasus penggunaan jauh lebih cepat. Paket PySAL dan spdep dalam R adalah alternatif yang fantastis [lihat jawaban radek] . Saya pikir Anda diharuskan untuk menggunakan shapefile sebagai format data dalam paket ini yang selaras dengan format input utas ini. Tidak yakin bagaimana mereka menangani poligon yang tumpang tindih serta poligon dalam poligon. Hasilkan SWM serta fungsi yang saya jelaskan akan menghitung hubungan spasial tersebut sebagai Tetangga "ROOK" DAN "QUEEN".
sumber