PostGIS - รับจุดภายในเส้นหรือรูปหลายเหลี่ยม


10

ฉันต้องได้รับจุดศูนย์กลางของเส้นหรือรูปหลายเหลี่ยมเพื่อให้markerแอปของฉัน ดังนั้นเมื่อคุณคลิกที่เครื่องหมายเรขาคณิตจะปรากฏขึ้น (เส้นหรือรูปหลายเหลี่ยม) ฉันเคยST_Centroidทำให้มันใช้งานได้

ผลที่ได้คือสิ่งที่ฉันคาดไม่ถึงว่ามีรูปหลายเหลี่ยมหรือเส้นที่เซนทรอยด์อยู่นอกรูปเรขาคณิต สิ่งที่ฉันต้องการสำหรับเส้นเหล่านั้นหรือรูปหลายเหลี่ยมคือการได้รับ "จุดกึ่งกลางที่สุด" แต่ภายในเรขาคณิต

ฉันจะทำสิ่งนี้ได้อย่างไร มีวิธีแก้ไขไหม?

คำตอบ:


9

จากเอกสาร: ST_PointOnSurface - ส่งคืน POINT ที่รับประกันว่าจะวางบนพื้นผิว


4
สำหรับบรรทัด ST_LineInterpolatePoint ที่มีเศษส่วน 0.5 ควรเป็นpostgis.net/docs/manual-2.1/ST_LineInterpolatePoint.html ที่
30184

ST_PointOnSurface () ทำงานร่วมกับเส้นได้! (ขอบคุณ Postgis)
WKT

ใช่ คุณถูก @ user30184 เพราะดูเหมือนว่าสำหรับบรรทัด ST_PointOnSurface () ใช้จุดโดยพลการฉันไม่แน่ใจ แต่ในตัวอย่าง doc จะใช้จุดแรกของ LineString
Jose Hermosilla Rodrigo

7

ในกรณีของฉันฉันมีรูปทรงเรขาคณิตแต่ละอันในตาราง disctint สิ่งที่ฉันทำคือ:

  1. สำหรับบรรทัด -> ที่ST_LineInterpolatePoint()มี 0.5 ปัจจัย
  2. สำหรับรูปหลายเหลี่ยม -> ทดสอบว่าST_Centroid()อยู่ในรูปทรงเรขาคณิตหรือไม่ ถ้าเป็นเช่นนั้นเป็นตัวเลือกที่ดีที่สุดถ้าไม่ฉันเลือกST_Centroid()PointOnSurface()

นี่คือแบบสอบถาม:

SELECT
    CASE WHEN (SELECT the_geom FROM points WHERE gid = d.gid) IS NOT NULL
    THEN (SELECT the_geom FROM points WHERE gid = d.gid)
    WHEN (SELECT the_geom FROM lines WHERE gid = d.gid) IS NOT NULL
    THEN ST_LineInterpolatePoint((SELECT the_geom FROM lines WHERE gid = d.gid), 0.5)
    WHEN (SELECT the_geom FROM polygons WHERE gid = d.gid AND ST_Intersects(ST_Centroid(the_geom),the_geom)) IS NOT NULL
    THEN ST_Centroid((SELECT the_geom FROM polygons WHERE gid = d.gid))
    ELSE ST_PointOnSurface((SELECT the_geom FROM polygons WHERE gid = d.gid))
    END AS center
FROM someTable d

5
&& ผู้ดำเนินการตรวจสอบ bbox เท่านั้น คุณอาจต้องการใช้ ST_intersects ()
WKT

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