วิธีการใช้ ST_Intersection


15

ต่อไปนี้เป็นข้อมูลสรุปโดยย่อเกี่ยวกับสิ่งที่ฉันพยายามทำ: ฉันมี 3 ตารางใน Postgres, 'a' และ 'b', แต่ละอันมีคอลัมน์รูปหลายเหลี่ยมและ 'c' มีคอลัมน์จุด สิ่งที่ฉันพยายามทำที่นี่คือการหาจุดตัดรูปทรงเรขาคณิตระหว่าง 'a', 'b' และ 'c' และเพื่อแสดงรูปทรงเรขาคณิตดังกล่าวบนเลเยอร์เวกเตอร์ของเลเยอร์ OpenLayers

ฉันรู้วิธีแสดงรูปทรงเรขาคณิตแบบใด ๆ จากสตริงใน OpenLayers แต่ฉันมีปัญหากับฟังก์ชัน ST_Intersection ของ PostGIS ฉันกำลังทำสิ่งนี้:

SELECT ST_Intersection(a.geom, b.geom) as inter from a, b;

โดยที่ a.geom และ b.geom เป็นทั้งคอลัมน์รูปทรงเรขาคณิตและฉันได้รับข้อความแสดงข้อผิดพลาดนี้:

NOTICE:  TopologyException: found non-noded intersection between 515172 2.14408e+06, 497067 2.13373e+06 and 501321 2.13546e+06, 471202 2.14843e+06 500621 2.13576e+06 
ERROR:  GEOS Intersection() threw an error!

นอกจากนี้ฉันพยายามแสดงเรขาคณิตผลลัพธ์เป็นข้อความโดยใช้ ST_AsText ดังนี้:

SELECT ST_AsText(ST_Intersection(a.geom, b.geom)) as inter from a, b;

แต่มันก็ส่งข้อความข้อผิดพลาดนี้:

HINT: No function matches the given name and argument types. You might need to add explicit type casts.

ฉันไม่รู้ว่าฉันทำอะไรผิดฉันแค่อยากให้ Polygons 'WKT แสดงบน OpenLayers นี่คือวิธีที่ฉันแสดงรูปเรขาคณิตจาก WKT:

                    var in_options = {
                        'internalProjection': new OpenLayers.Projection("EPSG:4326"),
                        'externalProjection': new OpenLayers.Projection("EPSG:4326")
                    }; 

                    var fea= new OpenLayers.Format.WKT(in_options).read(data); //data is the string with the WKT
                    vectorLayer.addFeatures([fea]); //this piece of code works great
                    map.zoomToExtent(bounds);

อัปเดต: ฉันลองครั้งต่อไป:

SELECT ST_Intersection(a.geom, b.geom) as intersect_ab FROM a INNER JOIN b ON 
ST_Intersection(a,b) WHERE ST_Overlaps(a.geom, b.geom) 
AND ST_isvalid(a.geom)='t' AND ST_isvalid(b.geom)='t';

แต่ฉันได้รับข้อความแสดงข้อผิดพลาดถัดไป:

ERROR: Function st_intersection(a,b) does not exist.
HINT: No function matches the given name and argument types. You might need to add explicit type casts.

ฉันเพิ่ม isvalid เพื่อตรวจสอบรูปหลายเหลี่ยมที่ถูกต้องเท่านั้นที่กำลังถูกประเมิน แต่มันบอกว่าข้อผิดพลาดอยู่ใน ST_Intersection (a, b), ทั้ง a, b และ c มี SRID เดียวกันดังนั้นฉันสับสนจริง ๆ ขออภัยถ้าฉัน ถามมากเกินไป แต่ฉันค่อนข้างใหม่กับ PostGIS ดังนั้นฉันหวังว่าฉันจะไม่รบกวนคุณมาก ขอบคุณ


1
อะไรSELECT PostGIS_Full_Version();กลับมา?
Mike T

POSTGIS = "1.4.0" GEOS = "3.1.0-CAPI-1.5.0" PROJ = "Rel. 4.7.1, 23 กันยายน 2009" USE_STATS
Uriel

คำตอบ:


8

ฉันเดาว่ามันจะล้มเหลวถ้าทางแยกคืนค่า NULL ดังนั้นคุณควรเพิ่มส่วนคำสั่งตรวจสอบว่ามีทางแยกก่อนที่จะลองสร้าง WKT หรือไม่


ฉันลองสิ่งนี้: เลือก ST_Intersection (a.geom, b.geom) เป็น intersect_ab จาก INNER JOIN b บน ST_Intersection (a, b) WHERE ST_Overlaps (a.geom, b.geom) และ ST_isvalid (a.geom) = 't 'AND ST_isvalid (b.geom) =' t '; แต่มันกลับข้อผิดพลาดเดียวกัน: ** ข้อผิดพลาด: ไม่มีฟังก์ชั่น st_intersection (a, b) คำแนะนำ: ไม่มีฟังก์ชันที่ตรงกับชื่อและประเภทอาร์กิวเมนต์ที่กำหนด คุณอาจต้องเพิ่มประเภทการส่งแบบชัดแจ้ง ** ฉันติดอยู่ที่นี่จริงๆถ้าคุณสามารถช่วยฉันฉันจะขอบคุณจริงๆ
Uriel

ลองสรุป (a.geom) และสรุป (b.geom) เพื่อตรวจสอบค่าต่างๆ
underdark

สรุป -------------------------- รูปหลายเหลี่ยม [BS] พร้อมวงแหวน 1 วง 0 มี 4 คะแนนรูปหลายเหลี่ยม [BS] พร้อมรูปวงแหวน 1 วง 0 มี 5 คะแนนรูปหลายเหลี่ยม [BS] กับ 1 วงแหวน 0 มี 10 คะแนน
Uriel

ใช่มันควรเป็น ST_Intersection (a.geom, b.geom) ไม่ใช่ ST_Intersection (a, b)
underdark

6

เบาะแสคือ

ERROR: Function st_intersection(a,b) does not exist.
HINT: No function matches the given name and argument types. You might need to add explicit type casts.

ในขณะที่ข้อความแสดงข้อผิดพลาดบอกว่าคุณไม่สามารถใช้ st_intersection ได้ สรุปคำตอบอื่น ๆ ที่คุณควรใช้ดังนี้:

SELECT ST_Intersection(a.geom, b.geom) as intersect_ab 
FROM a INNER JOIN b ON ST_Intersects(a.geom,b.geom)
WHERE ST_isvalid(a.geom)='t' AND ST_isvalid(b.geom)='t';

AFAIK มีความรู้สึกที่จะใช้ไม่มีst_overlapsและst_intersectsในประโยคเดียวกับที่พวกเขาจะสวยเหมือนกัน


4

ฉันทดสอบระหว่างชั้นของรูปหลายเหลี่ยมที่แตกต่างกันและมันล้มเหลวถ้าอย่างน้อยก็มีรูปทรงเรขาคณิตที่ไม่ถูกต้องในชั้นหนึ่ง คุณตรวจสอบความถูกต้องของรูปหลายเหลี่ยมของคุณโดยใช้ ST_isvalid (the_geom) หรือไม่ อาจเป็นกุญแจสำคัญ


ฉันลองสิ่งนี้: เลือก ST_Intersection (a.geom, b.geom) เป็น intersect_ab จาก INNER JOIN b บน ST_Intersection (a, b) WHERE ST_Overlaps (a.geom, b.geom) และ ST_isvalid (a.geom) = 't 'AND ST_isvalid (b.geom) =' t '; แต่มันกลับข้อผิดพลาดเดียวกัน: ** ข้อผิดพลาด: ไม่มีฟังก์ชั่น st_intersection (a, b) คำแนะนำ: ไม่มีฟังก์ชันที่ตรงกับชื่อและประเภทอาร์กิวเมนต์ที่กำหนด คุณอาจต้องเพิ่มประเภทการส่งแบบชัดแจ้ง ** ฉันหลงทางจริงๆว่าทำไมมันถึงไม่ทำงาน
Uriel

2

ลองสิ่งนี้:

SELECT  ST_Intersection(a.geom, b.geom) As intersect_ab
    FROM a INNER JOIN b ON ST_Intersection(a,b)
    WHERE ST_Overlaps(a.geom, b.geom)
    ;

แหล่ง


ฉันพยายามเช่นกัน แต่จะส่งคืนข้อความแสดงข้อผิดพลาดเดียวกัน: คำแนะนำ: ไม่มีฟังก์ชันที่ตรงกับชื่อและประเภทอาร์กิวเมนต์ที่กำหนด คุณอาจต้องเพิ่มประเภทการส่งแบบชัดแจ้ง
ยูเรียล

ถ้าคุณใช้ "เข้าร่วม b บน ST_Intersection (a.geom, b.geom)"
CaptDragon

มันบอกว่า: ข้อผิดพลาด: อาร์กิวเมนต์ของ JOIN / ON จะต้องพิมพ์บูลีนไม่พิมพ์เรขาคณิต
Uriel

shizer ... ต้องมีบางอย่างผิดปกติกับข้อมูลหรือบางสิ่งบางอย่างเนื่องจากแบบสอบถามชนิดนี้ใช้งานได้สำหรับฉัน
CaptDragon

ฉันเพิ่ม AND ST_isvalid (a.geom) = 't' และ ST_isvalid (b.geom) = 't'; ในตอนท้ายเพื่อประเมินรูปทรงเรขาคณิตที่ถูกต้องเท่านั้น แต่มันบอกฉันว่ามีข้อผิดพลาดอยู่ใน st_intersection (a, b)
Uriel

1

ฉันพยายามแยกรูปทรงเรขาคณิตที่ไม่ถูกต้องออก แต่มันไม่ได้ผลดังนั้นในที่สุดฉันก็ต้องลบรูปทรงเรขาคณิตที่ไม่ถูกต้องออกทุกส่วนแล้วใช้สิ่งนี้:

SELECT ST_AsText(ST_Intersection(a.geom, b.geom)) as intersect_ab FROM a,b 
WHERE ST_Overlaps(a.geom, b.geom) AND ST_isvalid(a.geom)='t' AND ST_isvalid(b.geom)='t';

อย่างที่คุณเห็นฉันไม่เห็นส่วน ST_Intersection (a, b) และมันใช้งานได้ดีฉันเป็นคนเศร้าเพราะฉันไม่สามารถหาวิธียกเว้นรูปทรงเรขาคณิตที่ไม่ถูกต้องออกจากตัวเลือกของฉันได้ขอบคุณทุกคนที่ช่วยฉัน ออกไปที่นี่


0

ฉันมีปัญหานี้ครั้งเดียว

<pre>NOTICE:  TopologyException: found non-noded intersection between xxx, xxxx and xxx, xxx  ERROR:  GEOS Intersection() threw an error!</pre>

ฉันสามารถแก้ไขข้อผิดพลาดนี้ได้โดยใช้วิธีนี้
- ใช้QGIS
- เพิ่มเลเยอร์เวกเตอร์จากฐานข้อมูลของคุณ
- นำจุดจากข้อความแสดงข้อผิดพลาดและค้นหาใน QGIS
   "QuickWKT" (ปลั๊กอิน) สามารถใช้เพื่อค้นหามัน
- จากนั้นคุณจะเห็นปัญหาการเชื่อมต่อ
- เปิดโหมดแก้ไข
- เลือก "เครื่องมือโหนด" เพื่อแสดงโหนดสีเขียว (ปัญหาโหนด)
- ย้ายโหนดออกจากโหนดที่ทับซ้อนกัน
- บันทึกการเปลี่ยนแปลง

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