Tôi có, trong PostGIS, một loạt các đối tượng LINESTRING Z (đại diện cho các cực) và tôi muốn tìm những đối tượng nào ở trong một khu vực (được đại diện bởi POLYGON). Với mục đích của bài tập này, chúng ta có thể giả định một cách an toàn rằng một cây cột có chiều dọc khá nhiều, vì vậy nó sẽ không giao nhau với ranh giới của khu vực.
Vấn đề là đôi khi cực chính xác.
Truy vấn này, một truy vấn tôi muốn làm, không thành công:
SELECT ST_Intersects(ST_GeomFromText('LINESTRING Z (544483.525 6849134.28 104.1098,544483.525 6849134.28 114.6)',28356),
ST_GeomFromText('POLYGON((543907.636214323 6848710.84802846,543909.787417164 6849286.92923919,544869.040437688 6849283.30837091,544866.842236582 6848707.22673193,543907.636214323 6848710.84802846))',28356));
Khám phá một vài biến thể, điều này thành công:
SELECT ST_Intersects(ST_GeomFromText('POINT (544483.525 6849134.28)',28356),
ST_GeomFromText('POLYGON((543907.636214323 6848710.84802846,543909.787417164 6849286.92923919,544869.040437688 6849283.30837091,544866.842236582 6848707.22673193,543907.636214323 6848710.84802846))',28356));
Điều này không thành công:
SELECT ST_Intersects(ST_GeomFromText('LINESTRING (544483.525 6849134.28,544483.525 6849134.28)',28356),
ST_GeomFromText('POLYGON((543907.636214323 6848710.84802846,543909.787417164 6849286.92923919,544869.040437688 6849283.30837091,544866.842236582 6848707.22673193,543907.636214323 6848710.84802846))',28356));
Nếu bạn thực hiện truy vấn 3DIntersects, nó sẽ thành công:
SELECT ST_3DIntersects(ST_GeomFromText('LINESTRING Z (544483.525 6849134.28 104.1098,544483.525 6849134.28 114.6)',28356),
ST_GeomFromText('POLYGON((543907.636214323 6848710.84802846,543909.787417164 6849286.92923919,544869.040437688 6849283.30837091,544866.842236582 6848707.22673193,543907.636214323 6848710.84802846))',28356));
tuy nhiên, nó đưa ra một thông báo rằng:
One or both of the geometries is missing z-value. The unknown z-value will be regarded as "any value"
Vì vậy, nó hoạt động, loại, nhưng nó lấp đầy nhật ký của tôi với tiếng ồn và tôi không muốn tắt cảnh báo.
Tôi đọc tiêu chuẩn truy cập tính năng OpenGIS Simple (xem phần 1, mục 4.14) là mặc dù LINESTRING là một suy biến, nhưng nó vẫn nên được hiểu là đóng theo cấu trúc liên kết, vì vậy chúng nên giao nhau.
Điều này có đúng không?
BIÊN TẬP
Sau một số thử nghiệm, tôi có thể trả lời một phần câu hỏi của riêng tôi. Lý do tại sao các truy vấn trên trả về sai là vì LINESTRING Z được cho là không hợp lệ:
SELECT ST_IsValidReason(ST_GeomFromText('LINESTRING Z (544483.525 6849134.28 104.1098,544483.525 6849134.28 114.6)',28356));
st_isvalidreason
----------------------------------------------------------------------
Too few points in geometry component[544483.525 6849134.28 104.1098]
(1 row)
Đây là một cách lịch sự để nói rằng OGC không hỗ trợ 3D và do đó, GDAL / PostGIS chỉ hỗ trợ loại này.
Tôi có thể chấp nhận điều đó, mặc dù tôi vẫn chưa tìm thấy bất cứ điều gì trong đặc tả OGC chỉ ra rằng LINESTRING tương ứng không hợp lệ.
Vì vậy, tôi đoán câu hỏi của tôi thực sự là: Có một cách chính thức may mắn để tìm dấu chân của một mảnh hình học 3D luôn trả về hình học 2D hợp lệ?