ต่อไปนี้เป็นข้อมูลสรุปโดยย่อเกี่ยวกับสิ่งที่ฉันพยายามทำ: ฉันมี 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 ดังนั้นฉันหวังว่าฉันจะไม่รบกวนคุณมาก ขอบคุณ
SELECT PostGIS_Full_Version();
กลับมา?