मैं PostGIS में एक बहुभुज के अंदर एक बिंदु कैसे पा सकता हूं?


22

मैं एक बिंदु कैसे पा सकता हूं जो पोस्टगिस में दिए गए बहुभुज के भीतर होने की गारंटी है।

मुझे 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.