Xác định các mối quan hệ cấu trúc liên kết bằng PostGIS


16

Tôi đang cố gắng thực hiện phân tích kiểu chữ cơ bản bằng PostGIS. Mục tiêu của tôi là tìm bất kỳ đa giác nào chạm vào các đa giác khác. Để làm điều này, tôi nghĩ rằng ST_GetFaceEdgessẽ làm việc ( tham khảo ). Tôi muốn kiểm tra mọi đa giác trong cơ sở dữ liệu của mình và liệt kê tất cả các đa giác khác chạm vào nó. Trong hình ảnh bên dưới, tôi cho rằng kết quả sẽ nói rằng hai trong số các đa giác (là các tòa nhà) chạm vào một tòa nhà và kết quả của 4 hình kia sẽ nói rằng chúng chạm 0 đa giác.

nhập mô tả hình ảnh ở đây

Tuy nhiên, tôi gặp một số khó khăn để hiểu phải làm gì. Khi tôi cố gắng sao chép ví dụ, có một vài phần trong đó tôi không hiểu.

-- Returns the sequence, edge id
-- , and geometry of the edges that bound face 1
-- If you just need geom and seq, can use ST_GetFaceGeometry
SELECT t.seq, t.edge, geom
FROM topology.ST_GetFaceEdges('tt',1) As t(seq,edge)
    INNER JOIN tt.edge AS e ON abs(t.edge) = e.edge_id;

Tôi không chắc topologylà tên của một bảng, cột hay một phần của hàm. Tôi cho rằng đó là cái bàn, nhưng tôi không chắc.

-- try out on sample of data
-- Table is called 'TestArea', column used is 'fid_1'
SELECT t.seq, t.edge, geom
FROM  TestArea.ST_GetFaceEdges('fid_1', 1) As t(seq,edge)
    INNER JOIN tt.edge AS e ON abs(t.edge) = e.edge_id;

Tôi cũng không chắc chức năng của phép nối bên trong là gì - cái này có nối kết quả với đối tượng ban đầu không?


4
Tôi biết underdark đã trả lời điều này với sơ đồ rõ ràng đặc trưng của cô ấy, nhưng một điều tôi không chắc chắn là liệu đa giác của bạn có liên quan về mặt tôpô ngay từ đầu không. Cấu trúc liên kết, trong trường hợp này, ngụ ý một mối quan hệ logic giữa các thực thể tách biệt với biểu diễn trực quan của chúng và (trong PostGIS) yêu cầu thiết lập một lược đồ CreateTopologyvà v.v. ( bit.ly/oLk8QY ) Nhưng cách các tòa nhà của bạn được số hóa giống như chúng là khác biệt về mặt cấu trúc mặc dù sự gần gũi về thị giác của các cạnh của chúng. Chỉ cần một cái gì đó cho người hỏi trong tương lai nhận thức được.
MerseyViking

Điều này có nghĩa là tôi cần thêm một AddTopoGeometryColumnbảng vào trước khi chạy truy vấn? Dựa trên kết quả từ ST_Touchescác giá trị tôi đã kiểm tra tất cả có ý nghĩa nhưng có lẽ đó là tình cờ.
djq

1
Bạn không chỉ cần gọi AddTopoGeometryColumn, mà dữ liệu của bạn cũng cần được số hóa theo cách thống nhất về mặt tôpô. Ví dụ, theo truyền thống, bạn sẽ số hóa hai ngôi nhà liền kề thành hai đa giác và sử dụng "snap to vertex" trong hệ thống GIS của bạn để đảm bảo các bức tường được chia sẻ, nhưng nó sẽ được lưu trữ dưới dạng hai đường trùng khớp với hai điểm trùng khớp ở mỗi đầu. Nhưng số hóa tôpô chúng có nghĩa là bức tường được chia sẻ thực sự chỉ là một dòng và hai nút được chia sẻ bởi mỗi đa giác. ST_Toucheschỉ cần kiểm tra không gian cho sự gần gũi, không phải là một cấu trúc liên kết.
MerseyViking

Câu trả lời:


19

Bạn có thể sử dụng ST_Touches thay thế:

ST_Touches - Trả về ĐÚNG nếu hình học có ít nhất một điểm chung, nhưng nội thất của chúng không giao nhau.

ST_Touches trả về TRUE cho ví dụ

nhập mô tả hình ảnh ở đây

Việc đếm số sẽ hoạt động như thế này:

SELECT a.id, count(*)
FROM polygon_table as a
JOIN polygon_table as b
  ON ST_Touches(a.the_geom,b.the_geom)
GROUP BY a.id

Tôi quan tâm đến việc biết có bao nhiêu đa giác mỗi đa giác chạm vào mặc dù. Nếu không thì nó là hoàn hảo, và tôi đã có nó để chạy!
djq

1
Tôi chỉ nhận ra rằng nó trả về một giá trị đúng / sai cho mọi trường hợp vì vậy tất cả những gì tôi cần làm là đếm xem có bao nhiêu giá trị thật. Cảm ơn!
djq

5
Đã thêm một truy vấn đếm có thể.
underdark
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.