PostGIS: Xấp xỉ một số nhà từ phạm vi địa chỉ


8

Tôi đang phát triển một trình mã hóa địa lý ngược cho Canada. Cho đến nay, với một lat / lng, tôi có thể tìm thấy đường phố gần nhất (đoạn đường), bao gồm hướng phân khúc đường và phạm vi địa chỉ cho cả hai bên đường. Bây giờ tôi đang cố gắng tìm ra cách tốt nhất để lập trình gần đúng số nhà gần nhất với điểm lat / lng đã cho.

Đây là một ví dụ về một hàng chứa dữ liệu đường phố:

-[ RECORD 1 ]-
[...]
l_adddirfg | Same Direction
l_hnumf    | 3219
l_hnuml    | 3235
l_stname_c | Breen Road North-west
r_adddirfg | Same Direction
r_hnumf    | 3224
r_hnuml    | 3236
r_stname_c | Breen Road North-west
the_geom   | 0105000020E610000001000000010200000002000000B0F6990E78885CC088DF2B5F3C8C49400875B39A89885CC0A0BCA6AC4B8C4940

Vì vậy, với tọa độ lat / lng nằm gần đoạn đường "the_geom", một người có thể biết trực quan điểm nào của đường nằm trên (bên trái hoặc bên phải) và khoảng cách dọc theo đoạn đó - qua đó xấp xỉ một số nhà. Ví dụ: nếu điểm nằm ở phía bên phải, ba phần tư xuống phố, tôi sẽ sử dụng các trường r_hnumf (bên phải, số đầu tiên) và r_hnuml (bên phải, số cuối) ... Địa chỉ đường có thể gần đến:

3232 Breen Road North-west

Những gì tôi đang tìm kiếm là một cách thực hành tốt nhất trong việc tính toán / xấp xỉ điều này trong PostGIS (mà tôi mới biết) hoặc trong lớp ứng dụng một khi hàng được tìm nạp.

Cảm ơn!

Câu trả lời:


11

Giải pháp có thể được xây dựng hoàn toàn trong PostGIS.

Đưa ra một điểm (vị trí ngôi nhà, tôi đã mô hình hóa nó thành ĐIỂM) và đoạn đường (đoạn đường gần điểm này nhất, được mô hình là LINESTRING) mà bạn hỏi:

  • Làm thế nào để biết điểm nằm ở bên trái của đoạn đường

Một giải pháp khả thi là xác định điểm trên đoạn đường gần nhà nhất và sau đó xác định xem điểm này nằm bên trái hay bên phải của ngôi nhà (người vận hành &<trả về đúng nếu đối số hình học đầu tiên trùng hoặc ở bên trái của đối số hình học thứ hai). &<thực sự hoạt động với các hộp giới hạn nhưng vì chúng tôi làm việc với các điểm nên điều này không thành vấn đề.

osm=# select 'POINT(4 1)'::geometry &< st_closestpoint('LINESTRING(1 1,2 3,6 6)'::geometry, 'POINT(4 1)'::geometry) as houseIsOnLeft;
 houseisonleft 
---------------
 f
(1 row)
  • Nhà nằm trên đoạn đường bao xa

Một lần nữa, điều này có nghĩa là khoảng cách (giá trị từ 0 đến 1) trên đoạn đường là điểm trên đường gần nhà nhất. Có một hàm tích hợp cho điều đó, được gọi là st_line_locate_point :

osm=# select st_line_locate_point('LINESTRING(1 1,2 3,6 6)'::geometry, 'POINT(2 1)'::geometry);
 st_line_locate_point 
----------------------
   0.0618033988749895
(1 row)

osm=# select st_line_locate_point('LINESTRING(1 1,2 3,6 6)'::geometry, 'POINT(5 6)'::geometry);
 st_line_locate_point 
----------------------
    0.889442719099992
(1 row)

Sơ đồ linestring và điểm được sử dụng ở trên


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.