Kursor Postgas / postgis

8

Saya memiliki jaringan jalan dengan StreetName dan rentang alamat min / maks untuk setiap segmen (yaitu- StreetName = 'Main St', Min = 100, Max = 199). Saya juga memiliki poin alamat individual dengan informasi yang sama (yaitu- StreetName = 'Main St', HouseNumber = 115).

Saya ingin menetapkan featureid (gid) segmen jalan ke setiap titik alamat yang memiliki StreetName yang cocok dan berada dalam kisaran min / max segmen jalan. Di ArcGIS saya mungkin akan menulis kursor pencarian untuk jalan dan yang akan melihat siklus melalui setiap segmen jalan, mendapatkan nilai gid, nama, min, & maks, dan kemudian melakukan pernyataan permintaan untuk menemukan semua titik alamat dengan HouseNumber yang termasuk dalam jalan diberikan rentang segmen (yaitu- pilih AddressPoints di mana StreetName = 'Main St' dan min> = 100 dan maks <= 199), hitung gid dari segmen jalan ke dalam bidang untuk titik-titik yang dipilih di lapisan Titik Alamat, kemudian pindah ke segmen jalan berikutnya dan ulangi.

  1. Bagaimana saya menulis kursor serupa di postgres / postgis atau
  2. Apakah ada cara yang lebih efisien untuk melakukan ini?
RyanKDalton
sumber

Jawaban:

8

Saat saya memahami pertanyaan Anda, tidak perlu kursor. Ini adalah tugas yang sangat umum dan sederhana untuk dilakukan dengan sql sederhana. Jika kami menyebut dua tabel Anda roadegment dan titik alamat dengan bidang seperti ini:

roadsegments
gid
the_geom
min_address
max_address

nomor
rumah
tangga alamat jalan

Kemudian Anda bisa membuat kolom untuk roadid di tabel addresspoints seperti ini:

ALTER TABLE adresspoints ADD COLUMN roadid integer;

Kemudian Anda dapat memperbarui bidang itu seperti ini:

UPDATE adresspoints SET roadid = roadsegmants.gid FROM 
roadsegments WHERE roadsegments.streetname=adresspoints.streetnames
AND addresspoints.housenumber >= roadsegments.min_address
AND addresspoints.housenumber <= roadsegments.max_address;

Jika tabel sangat besar mungkin lebih efisien untuk membuat ulang tabel titik-titik alamat seperti ini:

CREATE TABLE new_addresspoints as
SELECT a.*, b.gid as roadid  
FROM addresspoints a inner join roadsegments b
on a.streetname=b.streetnames
AND a.housenumber >= b.min_address
AND a.housenumber <= b.max_addres;

Untuk membuat segalanya berjalan cepat, Anda juga harus meletakkan indeks pada nama jalan di kedua tabel dan min_address, max_address, dan nomor rumah.

HTH
Nicklas

Nicklas Avén
sumber