Tính các đường song song dọc theo một đường trung tâm trong PostGIS


10

Tôi có đường (đường trung tâm đường) và xây dựng các bảng đa giác trong cơ sở dữ liệu PostgreQuery của tôi. Kịch bản mẫu như sau:

Kịch bản mẫu

Vấn đề:

Tôi cần tính toán các đường song song dọc theo đường phố tại giao lộ của bộ đệm 50 mét xung quanh đường phố và đa giác tòa nhà gần nhất ở cả hai bên. Kịch bản đầu ra mong muốn là:

Kịch bản đầu ra mong muốn

Những gì tôi đã thử:

Cách tiếp cận của tôi là:

 1) Generate 50m buffer around street layer
 2) get the intersection of buffer and polygons
 3) Compute the distance
 4) Draw offset curves (parallel lines) at both sides of street layer
 5) Merge both curves to get parallel lines at the intersection

Đây là nỗ lực của tôi:

    WITH street_buffer AS (
     SELECT
      street.gid street_id,
      street.geom street_geom,
      ST_Buffer(street.geom, 50, 'endcap=square join=round') geom1,
      building.geom  geom2  
     FROM street
     LEFT JOIN building on ST_DWithin(building.geom, street.geom, 50)
     ORDER BY street_id
    ),
    selected_buildings AS (
     SELECT
      street_id,
      street_geom,
      ST_Intersection(geom1, geom2) geom
     FROM street_buffer
    ),
    distance AS (
     SELECT 
      street_id,
      street_geom,
      ST_Distance(street_geom, geom) as dist
     FROM selected_buildings 
    ),
    curves AS (
     SELECT 
      street_id,
      ST_OffsetCurve(ST_LineMerge(street_geom), dist) as curve1,
      ST_OffsetCurve(ST_LineMerge(street_geom), -dist) as curve2
     FROM distance
     ORDER BY street_id
    )
    SELECT 
     street_id,
     ST_Union(curve1, curve2) geom 
    FROM curves
    ORDER BY street_id

Vấn đề với mã ở trên là nó không trả về các đường song song theo đầu ra mong muốn, tức là các đường song song tại tất cả các giao điểm đa giác đang được tạo thay vì tại giao điểm của đa giác gần nhất.

EDIT_1:

Đầu ra thực tế của mã trên là:

mã xác nhận

Trong khi, ở đầu ra trên, chỉ có các đường song song màu vàng (đường cong bù cho đa giác gần nhất ở hai bên đường) là bắt buộc:

dòng yêu cầu trong đầu ra thực tế

Bất cứ ai có thể đề nghị tôi làm thế nào để có được đầu ra mong muốn?


Bạn có thể thêm một hình ảnh của đầu ra thực tế là tốt? Nó giúp hiểu được vấn đề.
nghiêng

@tilt: Mình đã chỉnh sửa câu hỏi. Chỉ cần thêm đầu ra thực tế và các đường song song cần thiết trong đầu ra thực tế.
khajlk

Vấn đề phức tạp hơn bạn nghĩ. Khát khao bạn phải tìm ra phía bên nào của những ngôi nhà. Chỉ sau đó bạn có thể tìm thấy gần nhất ở cả hai bên. Đây là một bài đăng có mã ví dụ để tìm đúng mặt: gis.stackexchange.com/questions/156578/ Ấn
nghiêng

Trong thực tế, có thể có trường hợp khi các tòa nhà chỉ ở một bên (tôi sẽ gọi nó là ngoại lệ). Tôi có thể sửa đổi mã của mình để xử lý các ngoại lệ một khi tôi có thể đạt được đầu ra mong muốn của mình. Ở trên, bạn vẫn thấy xây dựng đa giác ở cả hai bên. Tại thời điểm này, yêu cầu của tôi là có được các đường song song ở hai bên đường (giống như những gì tôi thể hiện trong hình). Về liên kết của bạn, tôi có thể sử dụng mã ví dụ để cải thiện mã ở trên có thể sau này.
khajlk

Một điều tôi thấy là bộ đệm là dư thừa. Bạn chỉ có thể sử dụng stdwithin và sử dụng 50 làm khoảng cách. (Chọn đường phố, tòa nhà nơi st_dwithin (đường phố, tòa nhà, 50))
jbalk

Câu trả lời:


1

Nếu bạn sửa đổi khoảng cách CTE như sau:

distance AS (
 SELECT 
  street_id,
  street_geom,
  MIN(ST_Distance(street_geom, geom)) as dist
 FROM selected_buildings
 GROUP BY street_id, street_geom
)

sau đó chỉ khoảng cách ngắn nhất sẽ được trả về cho mỗi đường và một cặp đường bù sẽ được tạo ở khoảng cách đó.


Cảm ơn vì đã góp ý. Tôi sẽ kiểm tra nó và xem nếu nó cho kết quả mong đợi. Tôi đã đào xung quanh để giải quyết vấn đề này. Tôi phát hiện ra một ý tưởng điên rồ: Để bắt đầu với bộ đệm 1 m xung quanh đường phố và lập trình tăng bộ đệm VÀ tìm kiếm các tòa nhà ở cả hai bên cho đến khi số lượng tòa nhà là 2, sau đó trả lại khoảng cách bộ đệm này theo chiều rộng đường phố. Mục đích cuối cùng của tất cả các bài tập trên.
khajlk

Đúng là chỉ có một cặp bù được tạo bằng đề xuất của bạn. Tuy nhiên, các dòng paralle màu vàng được hiển thị ở trên vẫn còn thiếu :(
khajlk
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.