Postgres / postgis con trỏ


8

Tôi có một mạng lưới đường với StreetName và phạm vi địa chỉ tối thiểu / tối đa cho mỗi phân đoạn (ví dụ: StreetName = 'Main St', Min = 100, Max = 199). Tôi cũng có các điểm địa chỉ riêng lẻ có thông tin tương tự (ví dụ: StreetName = 'Main St', HouseNumber = 115).

Tôi muốn chỉ định tính năng (gid) của các đoạn đường cho từng điểm địa chỉ khớp với StreetName và nằm trong phạm vi tối thiểu / tối đa của đoạn đường. Trong ArcGIS, tôi có thể sẽ viết một trình tìm kiếm cho các con đường và nó sẽ xem xét chu kỳ qua từng đoạn đường, lấy các giá trị gid, name, min, & max, sau đó thực hiện một câu lệnh truy vấn để tìm tất cả các điểm địa chỉ có HouseNumbers nằm trong phạm vi phân đoạn đã cho (ví dụ: chọn Địa chỉ địa chỉ trong đó StreetName = 'Main St' và min> = 100 và tối đa <= 199), tính gid của đoạn đường vào trường cho các điểm đã chọn trong lớp Điểm địa chỉ, sau đó di chuyển đến đoạn đường tiếp theo và lặp lại.

  1. Làm thế nào tôi có thể viết một con trỏ tương tự trong postgres / postgis hoặc
  2. Có cách nào hiệu quả hơn để làm điều này?

Câu trả lời:


8

Theo tôi hiểu câu hỏi của bạn không cần con trỏ. Đây là một nhiệm vụ rất phổ biến và đơn giản để làm với sql đơn giản. Nếu chúng tôi gọi hai bảng đường của bạn và địa chỉ với các trường như thế này:

roadsegments
gid
the_geom
min_address
max_address

adresspoints
Tên đường
Số nhà

Sau đó, trước tiên bạn có thể tạo cột cho đường trong bảng địa chỉ như thế này:

ALTER TABLE adresspoints ADD COLUMN roadid integer;

Sau đó, bạn có thể cập nhật trường đó như thế này:

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;

Nếu đó là các bảng ver lớn, có thể hiệu quả hơn để tạo lại bảng điểm địa chỉ như thế này:

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;

Để làm cho mọi thứ chạy nhanh, bạn cũng nên đặt các chỉ mục trên tên đường phố trong cả hai bảng và min_address, max_address và housenumber.

HTH
Nicklas

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.