পোস্টজিআইএস-এ আমি বহুভুজের ভিতরে কীভাবে একটি বিন্দু খুঁজে পেতে পারি?


22

পোস্টজিআইএস-এ একটি প্রদত্ত বহুভুজের মধ্যে যে গ্যারান্টিযুক্ত তা আমি কীভাবে খুঁজে পেতে পারি?

আমি ST_Centroidফাংশন সম্পর্কে সচেতন । তবে সেন্ট্রয়েড সবসময় বহুভুজের মধ্যে থাকে না, নীচে দেখুন:

বহুবর্ষের বাইরে শুয়ে থাকা সেন্ট্রয়েড

তদুপরি, আমি বহুভুজ সীমানায় অবস্থিত একটি বিন্দুটি ব্যবহার করা এড়াতে চাই, বরং এটি সীমানার অভ্যন্তরে থাকা একটি (এবং ডোনাট আকৃতির বহুভুজের কোনও গর্তের ভিতরে নয়) চাই।

উত্তর:


17

আপনি যদি কোনও পোস্টজিআইএস ফাংশন সন্ধান করছেন যা আপনাকে আপনার বহুভুজের অভ্যন্তরে এমন একটি বিন্দু বলবে যা 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

পোস্টজিআইএস মেলিংলিস্টে এই ফাংশনটি খুঁজে পেয়েছে। আমার ধারণা এটি আপনার প্রয়োজন:

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.