Tạo bộ đệm một phía hoặc các đường song song trong PostGIS?


19

Tôi đang tìm cách tạo ra cái gọi là bộ đệm một phía hoặc các đường song song trong PostGIS. Ví dụ: 1. đệm, 2. một phía, 3. cả hai phía

văn bản thay thế

Tôi đã tìm thấy một số cuộc thảo luận về danh sách gửi thư từ năm 2009 và thông tin rằng nó đã được triển khai trong GEOS , nhưng không có gì về tình trạng PostGIS hiện tại.

Trong trường hợp chức năng chưa được triển khai, bạn có biết cách giải quyết nào không? Có thể cắt bỏ một bên của một bộ đệm bình thường?


Vì vậy, bạn đang tìm kiếm một tương đương với "bù đắp" trong AutoCAD?
dassouki

@dassouki: Xin lỗi, tôi không biết AutoCAD. Nhưng tôi nghĩ UMN Mapserver có tùy chọn "bù" sẽ làm những gì tôi đang tìm kiếm.
underdark

Làm cách nào để tạo bộ đệm một phía hoặc các đường song song, từ một bảng có 600 dòng?

Chào mừng đến với trang web. Nếu bộ câu trả lời hiện tại không giải quyết được vấn đề của bạn, bạn nên mở câu hỏi này dưới dạng câu hỏi mới (và nêu lý do tại sao câu hỏi này không trả lời vấn đề của bạn). Trong định dạng của trang web, đây không phải là nơi thích hợp để đưa ra tuyên bố này, vì nó không phải là một câu trả lời cho câu hỏi.
Andy W

Làm cách nào tôi có thể tạo một đường thẳng song song trong bảng ĐA NĂNG?
Felipe Costa

Câu trả lời:


13

Các bộ đệm một phía thích hợp được cho là đã hạ cánh xuống 1,5 , nhưng theo tôi thì trong khi các kiểu dáng đã hạ cánh, thì các mặt không tạo ra được. Tuy nhiên, có một bản vá hiện tại phơi bày GEOSSingleSidedBuffervà thực hiện bộ đệm một phía như mong đợi , dưới tên ST_OffsetCurve; xem thêm nền trong vé # 413 . Đang sử dụng:

select ST_AsText(ST_OffsetCurve(
ST_GeomFromText('LINESTRING(10 10,10 20, 20 20 )'),
1,'right', 'join=mitre mitre_limit=5.0'));
--------------
LINESTRING(20 19,11 19,11 10)

Xin chào, tôi đang cố gắng sử dụng giải pháp này nhưng không sử dụng postgis thường xuyên - Tôi đã kiểm tra truy vấn này và nhận được một số giá trị ouput, nhưng làm cách nào để dịch chúng thành các tính năng? Tôi chỉ muốn các dòng cuối cùng, là một phần của bảng gốc hoặc một dòng mới. Đây là truy vấn của tôi: chọn ST_AsText (ST_ OffersetCurve (test_data_.geom, test_data_.buffer_dis, 'tham gia = miter mitre_limit = 5.0)) từ test_data_;
kflaw

@kflaw - có lẽ bạn đã tìm ra điều này, nhưng bạn chỉ cần thêm vào đầu truy vấn: "tạo newtable dưới dạng" hoặc để xem, "tạo hoặc thay thế xem newview dưới dạng" theo sau là câu lệnh chọn.
jbalk

4

Mẫu này tạo ra hai đa giác ở hai bên của một dòng. Nó đòi hỏi PostGIS 1.5 trở lên. Tôi không chắc nó sẽ đối phó tốt như thế nào với các đường tự vượt qua.

SELECT ST_AsText(geom)

FROM ST_Dump ((

SELECT 
  ST_Polygonize(GEOMUNION(ST_Boundary(ST_Buffer(the_geom, 0.5, 'endcap=flat join=round')), the_geom)) AS buffer_sides 
FROM
  (SELECT ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)') AS the_geom) AS table1

));

Nó xuất ra:

                        st_astext

------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------
 POLYGON((0.5 5,0.509607359798385 5.09754516100806,0.538060233744357 5.19134171618254,0.584265193848727 5.2777851165098,
0.646446609406726 5.35355339059327,0.722214883490199 5.41573480615127,0.808658283817455 5.46193976625564,0.9024548389919
36 5.49039264020162,1 5.5,5 5.5,5 5,1 5,1 1,0.5 1,0.5 5))
 POLYGON((5 5,5 4.5,1.5 4.5,1.5 1,1 1,1 5,5 5))
(2 rows)

Mã này hoạt động theo cách sau:

  1. Bộ đệm linestring bằng ST_Buffer. Chúng tôi tận dụng tính năng PostGIS 1.5 hỗ trợ các endcaps tùy chỉnh để chỉ định không có giới hạn cuối nào cả. Xem ví dụ dưới đây.
  2. Chia đa giác đệm thành hai, sử dụng dòng gốc, sử dụng phương thức được ghi lại trong wiki .

Điều này có thể được cải thiện để đối phó với các đường tự vượt trong tương lai.

Một linestring đệm với một endcap phẳng


3

Sửa đổi này tạo ra hai linestring song song. Nó đòi hỏi PostGIS 1.5 trở lên.

hình học hoặc wkt cần thiết và khoảng cách trong bộ đệm


SELECT astext(
     st_removepoint( 
     st_removepoint(        st_linemerge(ST_Difference(st_boundary(geom),ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)')))         ,0),
      st_npoints(st_linemerge(ST_Difference(st_boundary(geom),ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)'))))-2)

    ) as parallel
    FROM ST_Dump ((
    SELECT 
    ST_Polygonize(st_union(ST_Boundary(ST_Buffer(geometria, 0.5, 'endcap=flat join=mitre mitre_limit=5.0')), geometria)) AS buffer_sides 
    FROM
    (SELECT ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)') 
        AS geometria) AS tabla))

-------------- CÁC KẾT QUẢ

"LINESTRING(0.5 1,0.5 5.5,5 5.5)"
"LINESTRING(5 4.5,1.5 4.5,1.5 1)"


0

Bởi vì tôi vẫn không thể bình luận ở đây, tôi thêm câu trả lời này

SCW đưa ra câu trả lời tốt nhất,

select ST_AsText(ST_OffsetCurve(
ST_GeomFromText('LINESTRING(10 10,10 20, 20 20 )'),
1, 'right', 'join=mitre mitre_limit=5.0'));
--------------
LINESTRING(20 19,11 19,11 10)

Nhưng có vẻ như chức năng thay đổi
http://postgis.refraction.net/docs/ST_ OffersetCurve.html

Bây giờ 'right'tham số không cần thiết. Sử dụng khoảng cách tích cực sẽ tạo ra bên trái và khoảng cách tiêu cực sẽ tạo ra bên phải

Cũng không có bản vá cần thiết với postgis của tôi

SELECT PostGIS_full_version();
"POSTGIS="2.0.3 r11132" GEOS="3.3.8-CAPI-1.7.8" 
PROJ="Rel. 4.8.0, 6 March 2012" GDAL="GDAL 1.9.2, 
released 2012/10/08" LIBXML="2.7.8" LIBJSON="UNKNOWN" RASTER"
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.