ฉันจะหาจุดในรูปหลายเหลี่ยมใน PostGIS ได้อย่างไร


22

ฉันจะหาจุดที่รับประกันได้ว่าอยู่ในรูปหลายเหลี่ยมที่กำหนดใน PostGIS ได้อย่างไร

ฉันตระหนักถึงST_Centroidฟังก์ชั่น อย่างไรก็ตามเซนทรอยด์อาจไม่อยู่ในรูปหลายเหลี่ยมเสมอไปดูด้านล่าง:

เซนทรอยด์ที่อยู่นอกรูปหลายเหลี่ยม

นอกจากนี้ฉันต้องการหลีกเลี่ยงการใช้จุดที่อยู่ในขอบเขตของรูปหลายเหลี่ยม แต่ต้องการให้มีจุดที่อยู่ภายในขอบเขต

คำตอบ:


17

หากคุณกำลังมองหาฟังก์ชั่น PostGIS ที่จะบอกตำแหน่งที่อยู่ภายในรูปหลายเหลี่ยมของคุณฟังก์ชันST_PointOnSurfaceอาจให้สิ่งที่คุณต้องการ

SELECT 
   ST_AsText(ST_PointOnSurface('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'::geometry));

   st_astext
----------------
 POINT(2.5 2.5)
(1 row)

6

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

CREATE OR REPLACE FUNCTION point_inside_geometry(param_geom geometry)
  RETURNS geometry AS
$$
  DECLARE
     var_cent geometry := ST_Centroid(param_geom);
     var_result geometry := var_cent;
  BEGIN
  -- If the centroid is outside the geometry then 
  -- calculate a box around centroid that is guaranteed to intersect the geometry
  -- take the intersection of that and find point on surface of intersection
 IF NOT ST_Intersects(param_geom, var_cent) THEN
  var_result := ST_PointOnSurface(ST_Intersection(param_geom, ST_Expand(var_cent, ST_Distance(var_cent,param_geom)*2) ));
 END IF;
 RETURN var_result;
  END;
  $$
  LANGUAGE plpgsql IMMUTABLE STRICT
  COST 100;

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