বহুভুজের ভিতরে থাকা পয়েন্টগুলি তৈরি করুন


30

আমার বহুভুজ বৈশিষ্ট্য রয়েছে এবং এর ভিতরে পয়েন্ট উত্পন্ন করতে সক্ষম হতে চাই। একটি শ্রেণিবিন্যাস কাজের জন্য আমার এটি দরকার।

একটি বহুভুতের ভিতরে না আসা পর্যন্ত এলোমেলো পয়েন্ট তৈরি করা কার্যকর হবে না কারণ এটি যে সময় নেয় এটি সত্যই অনাকাঙ্ক্ষিত।


3
বিপরীতে, সময়টি অনুমানযোগ্য। বহুভুজের ক্ষেত্রফল দ্বারা বহুভুজের বিস্তৃত ক্ষেত্রের অনুপাতের সাথে সমানুপাতিক, একক পয়েন্ট উত্পন্ন করতে এবং পরীক্ষার জন্য যে সময়ের প্রয়োজন হয় times সময়টি একটু পরিবর্তিত হয়, তবে ভিন্নতাটি পয়েন্টের সংখ্যার বর্গমূলের সাথে সমানুপাতিক। লার্জিশ সংখ্যার জন্য, এটি অসম্পূর্ণ হয়ে ওঠে। কম পরিমাণে এই অঞ্চলের অনুপাতটি পাওয়ার জন্য যদি প্রয়োজন হয় তবে জঘন্য বহুভুজগুলি আরও কমপ্যাক্ট টুকরো টুকরো করুন। কেবল ফ্র্যাক্টাল বহুভুজ আপনাকে সমস্যা দেবে, তবে আমি সন্দেহ করি যে আপনি সেগুলি করেছেন!
শুক্র



@ পাবলো: ভাল পাওয়া গেছে। যাইহোক, এই প্রশ্নগুলোর উভয় সফ্টওয়্যার নির্দিষ্ট এবং উভয় উদ্বেগ বহুভুজ মধ্যে পয়েন্ট নিয়মিত অ্যারে স্থাপন না র্যান্ডম পয়েন্ট
whuber

বহুভুজ মধ্যে নিয়মিত পয়েন্ট উত্স বনাম এলোমেলো পয়েন্ট হ'ল হ'ল পার্থক্যের সাথে একমত হন।
ম্যাপারজ

উত্তর:


20

বহুভুজকে ত্রিভুজগুলিতে দ্রবীভূত করে শুরু করুন, তারপরে সেগুলির মধ্যে পয়েন্ট তৈরি করুন । (অভিন্ন বিতরণের জন্য, প্রতিটি ত্রিভুজকে এর ক্ষেত্রফল অনুযায়ী ওজন করুন))


2
+1 সহজ এবং কার্যকর। এটি উল্লেখ করা মূল্যবান যে অদৃশ্যভাবে এলোমেলো পয়েন্টগুলি কোনও ত্রিভুজটির মধ্যে একেবারেই প্রত্যাখ্যান ছাড়াই উত্পন্ন করা যায়, কারণ যে কোনও ত্রিভুজ এবং একটি সমদ্বীপ ডান ত্রিভুজ, যা অর্ধ বর্গক্ষেত্রের মাঝখানে (সংরক্ষণ করা) অঞ্চল-সংরক্ষণ ম্যাপিং রয়েছে, যেখানে অর্ধেক বলুন y স্থানাঙ্কটি x স্থানাঙ্ককে ছাড়িয়ে গেছে। দুটি এলোমেলো স্থানাঙ্ক তৈরি করুন এবং আইসোসিল ত্রিভুজের একটি এলোমেলো পয়েন্ট পেতে এটিকে সাজান, তারপরে এটি মূল ত্রিভুজটিতে ম্যাপ করুন।
whuber

+1 আমি আপনাকে যে নিবন্ধটি উদ্ধৃত করেছি তার দ্বারা উল্লিখিত ট্রিলিনিয়ার সমন্বয়গুলির আলোচনাটি সত্যই পছন্দ করি । আমি মনে করি এটি এমন গোলকের পক্ষে অনুকূল হবে যার পৃষ্ঠটি ত্রিভুজগুলির ক্ষরণ হিসাবে উপস্থাপিত হয়। একটি অনুমান করা বিমানে, এটি সত্যই র্যান্ডম বিতরণ হবে না, তাই না?
কर्क কুইকেনডাল

@ শুভ - আপনার কাছে +1 আর একটি উপায় (লিঙ্কটিতে, তবে তারা এটির উপর দিয়ে হাত দিয়েছিল) হ'ল ভাগ করা প্রান্ত পেরিয়ে সমানভাবে নমুনাযুক্ত চতুর্ভুজ থেকে প্রত্যাখ্যাত পয়েন্টগুলি প্রতিফলিত করা এবং ত্রিভুজটিতে ফিরে আসা।
ড্যান এস

@ কির্ক - উদ্ধৃতি লিঙ্কটি একটি স্পর্শ বিরোধী সহায়ক যে এটি "ডান" উপায়টির আগে ট্রিলিনিয়ার স্থানাঙ্ক সহ ভুল (অ-ইউনিফর্ম) নমুনা পদ্ধতিগুলির একটি গোছা তালিকাবদ্ধ করে। দেখে মনে হচ্ছে না যে ইউনিফর্ম নমুনা ডাব্লু / ট্রিলিনিয়ারের স্থানাঙ্ক পাওয়ার প্রত্যক্ষ উপায় আছে। আমি 3 ডি তে র্যান্ডম ইউনিট ভেক্টরকে তাদের ল্যাট / দীর্ঘ সমতুল্যে রূপান্তর করে পুরো ক্ষেত্রের উপর অভিন্ন নমুনা গ্রহণ করতে চাই, তবে এটি কেবল আমারই। (। জানত সম্পর্কে স্যাম্পলিং সবাধ করার গোলাকার ত্রিভুজ / বহুভুজ) (উদাঃ WGS84 উপর সত্যিই অভিন্ন স্যাম্পলিং সম্পর্কে নিশ্চিত এছাড়াও: শুধু অবচয় কোণ পক্ষপাত খুঁটি প্রতি একটু, আমি মনে করি হবে।)
ড্যান এস

1
@ ড্যান গোলকের সমানভাবে নমুনা নেওয়ার জন্য, একটি নলাকার সমান-অঞ্চল প্রক্ষেপণ ব্যবহার করুন (স্থানাঙ্কগুলি দ্রাঘিমাংশের দ্রাঘিমাংশ এবং অক্ষাংশের কোসাইন হয়)। আপনি যদি কোনও প্রক্ষেপণ ব্যবহার না করেই নমুনা করতে চান তবে একটি সুন্দর কৌশল আছে: তিনটি স্বতন্ত্র মানক স্বাভাবিক রূপ (x, y, z) উত্পন্ন করুন এবং সেগুলিকে বিন্দুতে প্রজেক্ট করুন (আর এক্স / এন, আর ওয়াই / এন, আর * জেড / এন) ) যেখানে n ^ 2 = x ^ 2 + y ^ 2 + z ^ 2 এবং R হল পৃথিবীর ব্যাসার্ধ। প্রয়োজনে (ল্যাট, লোন) রূপান্তর করুন (একটি গোলকের উপর কাজ করার সময় অটিক অক্ষাংশ ব্যবহার করে) using এটি কাজ করে কারণ এই তুচ্ছ সাধারণ বিতরণটি গোলাকৃতিরভাবে প্রতিসম হয়। নমুনা ত্রিভুজগুলির জন্য, কোনও প্রক্ষেপণকে আটকে দিন।
শুক্র

14

আপনি যেমন এই প্রশ্নটিতে একটি QGIS ট্যাগ রেখেছেন: একটি সীমানা স্তর সহ র্যান্ডম পয়েন্টস সরঞ্জামটি ব্যবহার করা যেতে পারে।

এখানে চিত্র বর্ণনা লিখুন

আপনি যদি কোডটির সন্ধান করছেন তবে অন্তর্নিহিত প্লাগইন উত্স কোডটি সহায়তা করা উচিত।


1
এমনকি 5 বছর পরে, এখনও সত্যিই সহায়ক!
আটকে পড়া শিশু

10

আপনি বহুভুজটির ব্যাপ্তি নির্ধারণ করতে পারেন, তারপরে সেই এক্সেটেন্টগুলির মধ্যে এক্স এবং ওয়াই মানগুলির জন্য এলোমেলো সংখ্যা জেনারেশনকে সীমাবদ্ধ করতে পারেন।

বেসিক প্রক্রিয়া: 1) ম্যাক্সেক্স, ম্যাক্সি, মিনেক্স, বহুভুজের শীর্ষাংশের ক্ষুদ্র ক্ষুদ্র অংশ নির্ণয় করুন 2) এই মানগুলি সীমানা হিসাবে ব্যবহার করে এলোমেলো পয়েন্ট উত্পন্ন করুন 3) আপনার বহুভুজের সাথে ছেদ করার জন্য প্রতিটি পয়েন্ট পরীক্ষা করুন, 4) যখন মোড়কে সন্তুষ্ট করার জন্য পর্যাপ্ত পয়েন্ট রয়েছে তখন জেনারেশন বন্ধ করুন পরীক্ষা

ছেদ পরীক্ষার জন্য এখানে একটি অ্যালগরিদম (সি #) দেওয়া হল:

bool PointIsInGeometry(PointCollection points, MapPoint point)
{
int i;
int j = points.Count - 1;
bool output = false;

for (i = 0; i < points.Count; i++)
{
    if (points[i].X < point.X && points[j].X >= point.X || points[j].X < point.X && points[i].X >= point.X)
    {
        if (points[i].Y + (point.X - points[i].X) / (points[j].X - points[i].X) * (points[j].Y - points[i].Y) < point.Y)
        {
            output = !output;
        }
    }
    j = i;
}
return output;
}

10

কিছু ভাল গ্রন্থাগার আছে যা আপনার জন্য বেশিরভাগ ভারী উত্তোলন করে do

পাইথনে [সুদৃশ্য] [1] ব্যবহারের উদাহরণ।

import random
from shapely.geometry import Polygon, Point

def get_random_point_in_polygon(poly):
     minx, miny, maxx, maxy = poly.bounds
     while True:
         p = Point(random.uniform(minx, maxx), random.uniform(miny, maxy))
         if poly.contains(p):
             return p

p = Polygon([(0, 0), (0, 2), (1, 1), (2, 2), (2, 0), (1, 1), (0, 0)])
point_in_poly = get_random_point_in_polygon(mypoly)

অথবা .representative_point()অবজেক্টের মধ্যে বিন্দু পেতে ব্যবহার করুন (ডেইন দ্বারা উল্লিখিত):

জ্যামিতিক অবজেক্টের মধ্যে থাকা গ্যারান্টিযুক্ত একটি সুলভ গণনাকারী পয়েন্টটি প্রদান করে।

poly.representative_point().wkt
'POINT (-1.5000000000000000 0.0000000000000000)'

  [1]: https://shapely.readthedocs.io

2
এটি আকৃতিযুক্ত জ্যামিতি আমদানি থেকে হওয়া উচিত নয় ...?
পাইমাপার

1
আপনি এই representative_pointপদ্ধতিটিও ব্যবহার করতে পারেন : শেডলি.ড্রেডহেডসকস.আইও
এএন

6

আর যদি বিকল্প ?spsampleহয় তবে spপ্যাকেজে দেখুন। বহুভুজগুলি আর জিডিএল প্যাকেজে অন্তর্নির্মিত যে কোনও জিডিএল-সমর্থিত বিন্যাস থেকে পড়তে পারে এবং তারপরেওspsample বিভিন্ন নমুনা বিকল্পের সাহায্যে সরাসরি আমদানিকৃত বস্তুটিতে কাজ করে।


+1 - যেহেতু আর ওপেন সোর্স যদি কেউ অনুলিপি করতে চায় তবে আপনি কীভাবে তা সম্পন্ন হয় তা দেখতে সর্বদা উত্সটিতে যেতে পারেন। পয়েন্ট প্যাটার্নগুলির জন্য কেউ স্প্যাটস্যাট প্যাকেজের সিমুলেশন সরঞ্জামগুলিতেও আগ্রহী হতে পারে।
অ্যান্ডি ডব্লিউ

5

আমি এমন একটি প্রস্তাব দিতে চাই যা জিআইএস বিশ্লেষণের ক্ষেত্রে খুব কম প্রয়োজন। বিশেষত, এর জন্য কোনও বহুভুজকে ত্রিকোণাকুলের প্রয়োজন হয় না।

সিউডোকোডে প্রদত্ত নিম্নলিখিত অ্যালগরিদমটি মৌলিক তালিকা পরিচালনার ক্ষমতা ছাড়াও কিছু সাধারণ ক্রিয়াকে বোঝায় (অন্তর্ভুক্ত করুন, দৈর্ঘ্য সংযোজন, সাজান, সূক্ষ্ম তালিকা তৈরি করুন, এবং সংলগ্ন) এবং বিরতিতে র্যান্ডম ভাসমানের প্রজন্ম [0, 1):

Area:        Return the area of a polygon (0 for an empty polygon).
BoundingBox: Return the bounding box (extent) of a polygon.
Width:       Return the width of a rectangle.
Height:      Return the height of a rectangle.
Left:        Split a rectangle into two halves and return the left half.
Right:       ... returning the right half.
Top:         ... returning the top half.
Bottom:      ... returning the bottom half.
Clip:        Clip a polygon to a rectangle.
RandomPoint: Return a random point in a rectangle.
Search:      Search a sorted list for a target value.  Return the index  
             of the last element less than the target.
In:          Test whether a point is inside a polygon.

এগুলি প্রায় কোনও জিআইএস বা গ্রাফিক্স প্রোগ্রামিং পরিবেশে উপলব্ধ (এবং কোড না থাকলে সহজ) to Clipঅধঃপতিত বহুভুজগুলি অবশ্যই ফিরিয়ে আনবে না (এটি হ'ল শূন্য অঞ্চলযুক্ত)।

পদ্ধতিটি SimpleRandomSampleদক্ষতার সাথে বহুভুজের মধ্যে এলোমেলোভাবে বিতরণ করা পয়েন্টগুলির একটি তালিকা অর্জন করে। এটি একটি মোড়ক জন্যSRS , যা প্রতিটি টুকরোকে দক্ষতার সাথে নমুনা দেওয়ার জন্য যথেষ্ট পরিমাণে কমপ্যাক্ট না হওয়া পর্যন্ত বহুভুজকে ছোট ছোট টুকরো টুকরো করে। এটি করার জন্য, প্রতিটি টুকরোকে কত পয়েন্ট বরাদ্দ করতে হবে তা নির্ধারণ করতে এটি এলোমেলো সংখ্যার একটি প্রাক্পম্পিউটেড তালিকা ব্যবহার করে।

পরামিতি পরিবর্তন করে এসআরএসকে "টিউন" করা যায় t। এটি সর্বাধিক সীমাবদ্ধ বাক্স: বহুভুজ অঞ্চল অনুপাত যা সহ্য করা যায়। এটিকে ছোট (তবে 1 এর বেশি) তৈরি করা বেশিরভাগ বহুভুজকে অনেক টুকরো টুকরো টুকরো করে দেবে; এটিকে বড় করে তোলার ফলে কয়েকটি বহুভুজের জন্য বহু পরীক্ষার পয়েন্টগুলি প্রত্যাখ্যান করা হতে পারে (স্লিভারযুক্ত, বা গর্তে পূর্ণ) এটি গ্যারান্টি দেয় যে মূল বহুভুজের নমুনার সর্বাধিক সময় অনুমানযোগ্য।

Procedure SimpleRandomSample(P:Polygon, N:Integer) {
    U = Sorted list of N independent uniform values between 0 and 1
    Return SRS(P, BoundingBox(P), U)
}

পরবর্তী প্রক্রিয়াটি প্রয়োজন হলে নিজেকে পুনরাবৃত্তভাবে ডাকে। রহস্যজনক প্রকাশ t*N + 5*Sqrt(t*N)রক্ষণশীলভাবে কতগুলি পয়েন্ট প্রয়োজন হবে তার উপরের সীমাটি অনুমান করে, সুযোগের পরিবর্তনশীলতার জন্য অ্যাকাউন্টিং। এটি ব্যর্থ হওয়ার সম্ভাবনা হ'ল প্রতি মিলিয়ন পদ্ধতি কলগুলিতে কেবল ০.০। আপনি যদি চান তবে এই সম্ভাবনা হ্রাস করতে 5 থেকে 6 বা 7 বৃদ্ধি করুন।

Procedure SRS(P:Polygon, B:Rectangle, U:List) {
    N = Length(U)
    If (N == 0) {Return empty list}
    aP = Area(P)
    If (aP <= 0) {
        Error("Cannot sample degenerate polygons.")
        Return empty list
    }
    t = 2
    If (aP*t < Area(B)) {
        # Cut P into pieces
        If (Width(B) > Height(B)) {
            B1 = Left(B); B2 = Right(B)
        } Else {
            B1 = Bottom(B); B2 = Top(B)
        }
        P1 = Clip(P, B1); P2 = Clip(P, B2)
        K = Search(U, Area(P1) / aP)
        V = Concatenate( SRS(P1, B1, U[1::K]), SRS(P2, B2, U[K+1::N]) )
    } Else {
        # Sample P
        V = empty list
        maxIter = t*N + 5*Sqrt(t*N)
        While(Length(V) < N and maxIter > 0) {
            Decrement maxIter
            Q = RandomPoint(B)
            If (Q In P) {Append Q to V}
        }
       If (Length(V) < N) {
            Error("Too many iterations.")
       }
    }
    Return V
}

2

যদি আপনার বহুভুজটি উত্তল এবং আপনি সমস্ত শিখুনগুলি জানেন তবে আপনি একটি নতুন বিন্দুর নমুনা করার জন্য শীর্ষবিন্দুগুলির একটি "এলোমেলো" উত্তল ওজনকে বিবেচনা করতে চাইতে পারেন যা উত্তল কুটির (এই ক্ষেত্রে বহুভুজ) এর অভ্যন্তরে শুয়ে থাকার নিশ্চয়তা রয়েছে।

উদাহরণস্বরূপ বলুন যে আপনি একটি এন পার্শ্বযুক্ত উত্তল বহুভুজ আছে শীর্ষে

V_i, i={1,..,N}

তারপরে এলোমেলোভাবে এন উত্তল ওজন উত্পন্ন করুন

 w_1,w_2,..,w_N such that  w_i = 1; w_i>=0

এলোমেলোভাবে নমুনাযুক্ত পয়েন্টটি পরে দেওয়া হয়

Y=  w_i*V_i

এন উত্তল ওজনের নমুনার বিভিন্ন উপায় থাকতে পারে

  • একটি রেঞ্জের মধ্যে আনুষাঙ্গিকভাবে এলোমেলোভাবে এন -1 নম্বর বাছুন (প্রতিস্থাপন ছাড়াই), তাদের বাছাই করুন এবং ওজন পেতে তাদের মধ্যে এন অন্তরগুলিকে স্বাভাবিক করুন।
  • আপনি ডেরিচলেট বিতরণ থেকেও নমুনা নিতে পারেন যা বহুবারিক বিতরণের আগে প্রায়শই সংক্ষিপ্ত রূপ হিসাবে ব্যবহৃত হয়, যা আপনার ক্ষেত্রে উত্তল ওজনের মতো।

যখন আপনার বহুভুজ খুব মারাত্মকভাবে নন-উত্তল নয় তখন আপনি প্রথমে এটিকে উত্তল কুঁচকে রূপান্তর করতে বিবেচনা করতে পারেন। এটি কমপক্ষে আপনার বহুভুজের বাইরে থাকা পয়েন্টগুলির সংখ্যা সীমিত করা উচিত।


2

গ্রাস জিআইএস (এক কমান্ড) v.random ব্যবহার করে টাস্কটি সমাধান করা খুব সহজ

ম্যানুয়াল পৃষ্ঠা থেকে নির্বাচিত বহুভুজগুলিতে (এখানে র্যালি, এনসি শহরের জিপ কোড অঞ্চলগুলি) কীভাবে 3 টি এলোমেলো পয়েন্ট যুক্ত করতে হবে তার উদাহরণের নীচে। এসকিউএল "যেখানে" বিবৃতি সংশোধন করে বহুভুজ (গুলি) নির্বাচন করা যেতে পারে।

নির্বাচিত বহুভুজগুলিতে এলোমেলো পয়েন্ট তৈরি করা


1
বাধ্যতামূলক অনুস্মারক যে জিপ কোডগুলি বহুভুজ নয়, লাইন।
রিচার্ড

তুমি কি বিস্তারিত বলতে পারো? আমাকে এখানে এটিতে এলাকায় বোঝায় en.wikipedia.org/wiki/ZIP_Code#Primary_state_prefixes
markusN

নিশ্চিত: জিপ কোডগুলি নির্দিষ্ট পোস্ট অফিসগুলি এবং তাদের মেল সরবরাহের রুটের উল্লেখ করে। ফলস্বরূপ, জিপ কোডগুলি বহুভুজ নয়, লাইন। তারা একে অপরের সাথে ওভারল্যাপ করতে পারে, গর্তগুলি ধারণ করতে পারে এবং অগত্যা পুরো মার্কিন বা কোনও প্রদত্ত রাষ্ট্রকে coverাকতে পারে না। এগুলি ভাগ করার জন্য তাদের ব্যবহার করা বিপজ্জনক। সেন্সাস ইউনিট (ব্লক গ্রুপগুলির মতো) আরও ভাল পছন্দ। আরও দেখুন: এই এবং এই
রিচার্ড

1
ধন্যবাদ! এটি সম্ভবত দেশের উপরও নির্ভর করে, উদাহরণস্বরূপ দেখুন en.wikedia.org/wiki/Postal_codes_in_Gرمy - তবে, জিপ কোডগুলি আমার মূল বিষয় নয়, কেবল "বহুভুজের অভ্যন্তরে অবস্থিত পয়েন্টগুলি উত্পন্ন করুন" এর পরিবর্তে মূল প্রশ্নের চিত্র তুলে ধরতে চেয়েছিলাম জিপ কোড সংজ্ঞাগুলি এখানে ওটি
হ'ল

1
উভয় বিবেচনায় লক্ষণীয়। আমার সম্ভবত একটি সামান্য ব্লগ এন্ট্রি করা উচিত যাতে আমি পরের বার আরও সংক্ষেপে বলতে পারি :-)
রিচার্ড

1

উত্তর লিঙ্ক

https://gis.stackexchange.com/a/307204/103524

বিভিন্ন পদ্ধতির ব্যবহার করে তিনটি অ্যালগরিদম।

গিট রেপো লিঙ্ক

  1. এক্স এবং ওয়াইয়ের দিক থেকে স্থানাঙ্কগুলির প্রকৃত দূরত্ব ব্যবহার করে এখানে একটি সহজ এবং সর্বোত্তম পদ্ধতির। অভ্যন্তরীণ অ্যালগরিদম WGS 1984 (4326) ব্যবহার করে ফলাফল SRোকানো এসআরআইডি রূপান্তর করে।

ফাংশন ================================================== ==================

CREATE OR REPLACE FUNCTION public.I_Grid_Point_Distance(geom public.geometry, x_side decimal, y_side decimal)
RETURNS public.geometry AS $BODY$
DECLARE
x_min decimal;
x_max decimal;
y_max decimal;
x decimal;
y decimal;
returnGeom public.geometry[];
i integer := -1;
srid integer := 4326;
input_srid integer;
BEGIN
CASE st_srid(geom) WHEN 0 THEN
    geom := ST_SetSRID(geom, srid);
        ----RAISE NOTICE 'No SRID Found.';
    ELSE
        ----RAISE NOTICE 'SRID Found.';
END CASE;
    input_srid:=st_srid(geom);
    geom := st_transform(geom, srid);
    x_min := ST_XMin(geom);
    x_max := ST_XMax(geom);
    y_max := ST_YMax(geom);
    y := ST_YMin(geom);
    x := x_min;
    i := i + 1;
    returnGeom[i] := st_setsrid(ST_MakePoint(x, y), srid);
<<yloop>>
LOOP
IF (y > y_max) THEN
    EXIT;
END IF;

CASE i WHEN 0 THEN 
    y := ST_Y(returnGeom[0]);
ELSE 
    y := ST_Y(ST_Project(st_setsrid(ST_MakePoint(x, y), srid), y_side, radians(0))::geometry);
END CASE;

x := x_min;
<<xloop>>
LOOP
  IF (x > x_max) THEN
      EXIT;
  END IF;
    i := i + 1;
    returnGeom[i] := st_setsrid(ST_MakePoint(x, y), srid);
    x := ST_X(ST_Project(st_setsrid(ST_MakePoint(x, y), srid), x_side, radians(90))::geometry);
END LOOP xloop;
END LOOP yloop;
RETURN
ST_CollectionExtract(st_transform(ST_Intersection(st_collect(returnGeom), geom), input_srid), 1);
END;
$BODY$ LANGUAGE plpgsql IMMUTABLE;

একটি সাধারণ ক্যোয়ারী সহ ফাংশনটি ব্যবহার করুন, জ্যামিতিটি অবশ্যই বৈধ এবং বহুভুজ, বহু-বহুভুজ বা খামের হতে হবে

SELECT I_Grid_Point_Distance(geom, 50, 61) from polygons limit 1;

ফলাফল ================================================= ===================== এখানে চিত্র বর্ণনা লিখুন

  1. নিক্লাস আভান অ্যালগরিদমের উপর ভিত্তি করে দ্বিতীয় ফাংশন । যে কোনও এসআরআইডি হ্যান্ডেল করার চেষ্টা করেছেন।

    আমি অ্যালগরিদমে নিম্নলিখিত পরিবর্তনগুলি প্রয়োগ করেছি।

    1. পিক্সেল আকারের জন্য x এবং y দিকের জন্য পৃথক ভেরিয়েবল,
    2. স্পেরয়েড বা এলিপসয়েডের দূরত্ব গণনার জন্য নতুন ভেরিয়েবল।
    3. যে কোনও এসআরআইডি ইনপুট করুন, ফাংশনটি জিওমকে স্পেরয়েড বা এলিপসয়েড ডেটামের কর্ম পরিবেশে রূপান্তর করুন, তারপরে প্রতিটি দিকে দূরত্ব প্রয়োগ করুন, ফলাফল পাবেন এবং এসআরআইডি ইনপুটটিতে রূপান্তর করুন।

ফাংশন ================================================== ==================

CREATE OR REPLACE FUNCTION I_Grid_Point(geom geometry, x_side decimal, y_side decimal, spheroid boolean default false)
RETURNS SETOF geometry AS $BODY$ 
DECLARE
x_max decimal; 
y_max decimal;
x_min decimal;
y_min decimal;
srid integer := 4326;
input_srid integer; 
BEGIN
CASE st_srid(geom) WHEN 0 THEN
  geom := ST_SetSRID(geom, srid);
  RAISE NOTICE 'SRID Not Found.';
    ELSE
        RAISE NOTICE 'SRID Found.';
    END CASE;

    CASE spheroid WHEN false THEN
        RAISE NOTICE 'Spheroid False';
        srid := 4326;
        x_side := x_side / 100000;
        y_side := y_side / 100000;
    else
        srid := 900913;
        RAISE NOTICE 'Spheroid True';
    END CASE;
    input_srid:=st_srid(geom);
    geom := st_transform(geom, srid);
    x_max := ST_XMax(geom);
    y_max := ST_YMax(geom);
    x_min := ST_XMin(geom);
    y_min := ST_YMin(geom);
RETURN QUERY
WITH res as (SELECT ST_SetSRID(ST_MakePoint(x, y), srid) point FROM
generate_series(x_min, x_max, x_side) as x,
generate_series(y_min, y_max, y_side) as y
WHERE st_intersects(geom, ST_SetSRID(ST_MakePoint(x, y), srid))
) select ST_TRANSFORM(ST_COLLECT(point), input_srid) from res;
END;
$BODY$ LANGUAGE plpgsql IMMUTABLE STRICT;

একটি সাধারণ ক্যোয়ারী সহ এটি ব্যবহার করুন।

SELECT I_Grid_Point(geom, 22, 15, false) from polygons;

ফলাফল ================================================= ==================এখানে চিত্র বর্ণনা লিখুন

  1. সিরিজ জেনারেটরের উপর ভিত্তি করে ফাংশন।

ফাংশন ================================================= =================

CREATE OR REPLACE FUNCTION I_Grid_Point_Series(geom geometry, x_side decimal, y_side decimal, spheroid boolean default false)
RETURNS SETOF geometry AS $BODY$
DECLARE
x_max decimal;
y_max decimal;
x_min decimal;
y_min decimal;
srid integer := 4326;
input_srid integer;
x_series DECIMAL;
y_series DECIMAL;
BEGIN
CASE st_srid(geom) WHEN 0 THEN
  geom := ST_SetSRID(geom, srid);
  RAISE NOTICE 'SRID Not Found.';
    ELSE
        RAISE NOTICE 'SRID Found.';
    END CASE;

    CASE spheroid WHEN false THEN
        RAISE NOTICE 'Spheroid False';
    else
        srid := 900913;
        RAISE NOTICE 'Spheroid True';
    END CASE;
    input_srid:=st_srid(geom);
    geom := st_transform(geom, srid);
    x_max := ST_XMax(geom);
    y_max := ST_YMax(geom);
    x_min := ST_XMin(geom);
    y_min := ST_YMin(geom);

    x_series := CEIL ( @( x_max - x_min ) / x_side);
    y_series := CEIL ( @( y_max - y_min ) / y_side );
RETURN QUERY
SELECT st_collect(st_setsrid(ST_MakePoint(x * x_side + x_min, y*y_side + y_min), srid)) FROM
generate_series(0, x_series) as x,
generate_series(0, y_series) as y
WHERE st_intersects(st_setsrid(ST_MakePoint(x*x_side + x_min, y*y_side + y_min), srid), geom);
END;
$BODY$ LANGUAGE plpgsql IMMUTABLE STRICT;

একটি সাধারণ ক্যোয়ারী সহ এটি ব্যবহার করুন।

SELECT I_Grid_Point_Series(geom, 22, 15, false) from polygons; ফলাফল ================================================= =========================

এখানে চিত্র বর্ণনা লিখুন

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