การระบุความสัมพันธ์ทอพอโลยีโดยใช้ PostGIS


16

ฉันกำลังพยายามวิเคราะห์แบบอักษรพื้นฐานโดยใช้ PostGIS จุดประสงค์ของฉันคือการค้นหารูปหลายเหลี่ยมที่สัมผัสรูปหลายเหลี่ยมอื่น ๆ เมื่อต้องการทำเช่นนี้ฉันคิดว่าST_GetFaceEdgesจะทำงานได้ ( อ้างอิง ) ฉันต้องการตรวจสอบทุกรูปหลายเหลี่ยมในฐานข้อมูลของฉันและรายการรูปหลายเหลี่ยมอื่น ๆ ทั้งหมดที่สัมผัส ในภาพด้านล่างฉันคาดหวังว่าผลลัพธ์จะบอกว่ารูปหลายเหลี่ยมสองอัน (ซึ่งเป็นอาคาร) แตะหนึ่งอาคารและผลลัพธ์ของอีก 4 รูปกล่าวว่าพวกเขาแตะ 0 รูปหลายเหลี่ยม

ป้อนคำอธิบายรูปภาพที่นี่

อย่างไรก็ตามฉันมีปัญหาในการทำความเข้าใจว่าจะทำอย่างไร เมื่อฉันพยายามคัดลอกตัวอย่างมีบางส่วนที่ฉันไม่เข้าใจ

-- 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;

ฉันไม่แน่ใจว่าtopologyเป็นชื่อของตารางคอลัมน์หรือส่วนหนึ่งของฟังก์ชั่น ฉันคิดว่ามันเป็นโต๊ะ แต่ฉันไม่แน่ใจ

-- 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;

ฉันยังไม่แน่ใจว่าหน้าที่ของการรวมภายในคืออะไร - สิ่งนี้เข้าร่วมผลลัพธ์กับวัตถุต้นฉบับหรือไม่


4
ฉันรู้ว่า underdark ตอบคำถามนี้ด้วยไดอะแกรมที่ชัดเจนเป็นพิเศษของเธอ แต่สิ่งที่ฉันไม่แน่ใจคือรูปหลายเหลี่ยมของคุณมีความเกี่ยวข้องกับทอพอโลยีหรือไม่ โทโพโลยีในกรณีนี้แสดงถึงความสัมพันธ์เชิงตรรกะระหว่างเอนทิตีที่แยกจากการแสดงด้วยภาพและ (ใน PostGIS) ต้องมีการตั้งค่าสคีมาด้วยCreateTopologyและอื่น ๆ ( bit.ly/oLk8QY ) แต่วิธีการที่อาคารของคุณ เหมือนพวกมันมีโทโพโลยีที่แตกต่างแม้จะมองเห็นขอบของพวกเขาอย่างใกล้ชิด มีเพียงบางสิ่งสำหรับผู้ถามในอนาคตที่ต้องระวัง
MerseyViking

นี่หมายความว่าฉันต้องเพิ่มAddTopoGeometryColumnตารางก่อนเรียกใช้แบบสอบถามหรือไม่ ขึ้นอยู่กับผลลัพธ์จากST_Touchesค่าที่ฉันตรวจสอบทั้งหมดสมเหตุสมผล แต่อาจเป็นไปได้โดยบังเอิญ
djq

1
ไม่เพียง แต่คุณจะต้องโทรออกAddTopoGeometryColumnแต่ข้อมูลของคุณจะต้องถูกแปลงเป็นดิจิทัลในวิธีที่สอดคล้องกับทอพอโลยี ตัวอย่างเช่นตามเนื้อผ้าคุณจะแปลงบ้านแฝดสองหลังเป็นดิจิทัลเป็นรูปหลายเหลี่ยมสองรูปและใช้ "snap to vertex" ใน GIS ของคุณเพื่อให้แน่ใจว่าผนังที่ใช้ร่วมกันสัมผัส แต่มันจะถูกเก็บไว้เป็นเส้นคู่สองเส้น แต่การทอพอโลยีแบบดิจิทัลพวกเขาหมายความว่ากำแพงที่ใช้ร่วมกันจริงๆเป็นเพียงหนึ่งบรรทัดและสองโหนดที่ใช้ร่วมกันโดยแต่ละรูปหลายเหลี่ยม ST_Touchesตรวจสอบความใกล้ชิดเชิงพื้นที่เพียงอย่างเดียวไม่ใช่ทอพอโลยี
MerseyViking

คำตอบ:


19

คุณสามารถใช้ST_Touchesแทน:

ST_Touches - ส่งคืน TRUE หากรูปทรงเรขาคณิตมีจุดร่วมกันอย่างน้อยหนึ่งจุด แต่การตกแต่งภายในของพวกเขาไม่ได้ตัดกัน

ST_Touches ส่งคืน TRUE เช่น

ป้อนคำอธิบายรูปภาพที่นี่

รับจำนวนควรทำงานดังนี้:

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

ฉันสนใจที่จะรู้ว่ามีรูปหลายเหลี่ยมหลายรูปที่แต่ละรูปสัมผัส ไม่งั้นมันจะสมบูรณ์แบบและฉันก็รีบวิ่งไป!
djq

1
ฉันเพิ่งรู้ว่ามันคืนค่าจริง / เท็จสำหรับทุกกรณีดังนั้นสิ่งที่ฉันต้องทำคือนับจำนวนจริงที่มี ขอบคุณ!
djq

5
เพิ่มคิวรี่การนับที่เป็นไปได้
underdark
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.