পোস্টজিআইএস - একটি লাইন বা বহুভুজের ভিতরে একটি পয়েন্ট পান


10

markerআমার অ্যাপ্লিকেশনটি তৈরি করতে আমাকে একটি লাইন বা বহুভুজের কেন্দ্রবিন্দু পেতে হবে । যাতে আপনি যখন কোনও চিহ্নকারকে ক্লিক করেন তখন জ্যামিতিটি উপস্থিত হয় (লাইন বা বহুভুজ)। আমি ST_Centroidএটি কাজ করতে ব্যবহৃত ।

ফলাফলটি আমি প্রত্যাশা করেছিলাম যে কয়েকটি বহুভুজ বা লাইনগুলি সেন্ট্রয়েডগুলি জ্যামিতির বাইরে রয়েছে। আমি সেই লাইনগুলি বা বহুভুজগুলির জন্য যা চাই তা হ'ল "সর্বাধিক কেন্দ্র পয়েন্ট" পাওয়া কিন্তু জ্যামিতির অভ্যন্তরে।

কিভাবে আমি এটি করতে পারব? একটি সমাধান আছে কি?

উত্তর:


9

দস্তাবেজ থেকে: ST_PointOnSurface - পৃষ্ঠে মিথ্যা গ্যারান্টিযুক্ত একটি POINT প্রদান করে।


4
ভগ্নাংশ 0.5 সহ ST_LineInterplatePoint রেখাগুলির জন্য নিখুঁত postgis.net/docs/manual-2.1/ST_LineInterplatePoint.html
ব্যবহারকারীর 30184

ST_PointOnSurface () লাইনের সাথে কাজ করে! (ধন্যবাদ Postgis)
উইকেটরক্ষক

হ্যাঁ! আপনি ঠিক @ ব্যবহারকারী 30184 বলে মনে করছেন কারণ মনে হয় যে লাইনের জন্য ST_PointOnSurface () নির্বিচারে একটি বিন্দু নিয়েছে, আমি নিশ্চিত নই তবে নথির উদাহরণে একটি লাইনস্ট্রিংয়ের প্রথম পয়েন্টটি নিয়েছে।
জোসে হার্মোসিলা রদ্রিগো

7

আমার ক্ষেত্রে আমার প্রতিটি জ্যামিতি ডিস্টিন্ট টেবিলগুলিতে রয়েছে। আমি যা করেছি তা হ'ল:

  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
&& অপারেটর কেবলমাত্র বাক্স চেক করে। আপনি ST_intersects () ব্যবহার করতে চাইতে পারেন।
ডাব্লু কেটি

তুমি ঠিক বলছো. আমি ভৃল ছিলাম. আমি আমার উত্তর আপডেট করব। ধন্যবাদ!
জোসে হার্মোসিলা রদ্রিগো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.