বহুভুজের কেন্দ্রতম এবং দূরতম পয়েন্টের মধ্যে দূরত্ব


12

আমার কাছে একটি গ্রামের বহুভুজ স্তর রয়েছে যার 6,00,000 এরও বেশি রেকর্ড রয়েছে। আমি প্রতিটি গ্রামের সেন্ট্রয়েড গণনা করেছি। আমি সেন্ট্রয়েড এবং প্রতিটি বহুভুজের সবচেয়ে দূরের নোডের মধ্যে দূরত্ব খুঁজে পেতে চাই। রেফারেন্সের জন্য নীচের চিত্রটি দেখুন। কৃষ্ণ রেখাগুলি বহুভুজ সীমানা। এখানে চিত্র বর্ণনা লিখুন

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

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


আকর্ষণীয় ... আমি বহুগ্রহের আশেপাশে একটি বৃত্ত তৈরি করতে পোস্টগিস দিয়ে এই শুক্রবারটি করেছি। আমার ব্যবহৃত কোডটি সন্ধান করতে আমার কয়েক মিনিট প্রয়োজন ... i.stack.imgur.com/EKnkg.png
kttii

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

সেন্ট্রয়েডের অবস্থান কি গুরুত্বপূর্ণ? আপনি এগুলি কীভাবে তৈরি করেছেন?
জিআইএসজি

সম্ভাব্য সদৃশ - gis.stackexchange.com/questions/133099/…
ক্লিওস

যদি সেন্ট্রয়েডটি সত্যই কেন্দ্রীয় হয় তবে এটি বহুভুজের সাথে মানানসই বিন্দুতে কেন্দ্রের মধ্যে সবচেয়ে ক্ষুদ্রতর বৃত্তের ব্যাসার্ধ ( en.wikedia.org/wiki/Somelest-circ_problem )
মার্ক আয়ারল্যান্ড

উত্তর:


3

দেখে মনে হচ্ছে আপনি মানচিত্রের সাথে কাজ করছেন। "দূরত্বের ক্যালকুলেটর" (এটি সরঞ্জাম ব্যবস্থাপকটিতে সন্ধান করুন) এর অনেকগুলি বিকল্প রয়েছে এবং আমি মনে করি এটি এই কাজটিও পরিচালনা করতে পারে। এটি সম্পর্কে এখানে একটি নিবন্ধ রয়েছে: http://web.pb.com/mapinfopro-jul-2013/Toolbox- দূরত্ব- ক্যালকুলেটর


15

পোস্টজিআইএস ব্যবহার করে, আমি একটি দ্রুত ফলাফলের জন্য বহুভুজকে সরল করতে ST_ConvexHull ব্যবহার করেছি:

দূরতম পয়েন্ট পান:

SELECT Villages_v4_Trial_region.geom as FarPoint from (
SELECT ST_PointN(ST_ExteriorRing(ST_ConvexHull(Villages_v4_Trial_region.geom)),
generate_series(1, ST_NPoints(ST_ExteriorRing(ST_ConvexHull(Villages_v4_Trial_region.geom))))) as points, 
geom
FROM Villages_v4_Trial_region
ORDER BY ST_MaxDistance(points,ST_Centroid(Villages_v4_Trial_region.geom)) DESC
LIMIT 1;

এবং যদি আপনি সেন্ট্রয়েড থেকে একটি বৃত্ত তৈরি করতে আগ্রহী হন:

SELECT ST_Buffer(Center,ST_Distance(Center,FarPoint)) as Circle
FROM (
SELECT Villages_v4_Trial_region.geom as FarPoint, Center from (
    SELECT ST_PointN(ST_ExteriorRing(ST_ConvexHull(Villages_v4_Trial_region.geom)),
    generate_series(1, ST_NPoints(ST_ExteriorRing(ST_ConvexHull(Villages_v4_Trial_region.geom))))) as points,
    ST_Centroid(Villages_v4_Trial_region.geom) as Center, 
    geom
    FROM Villages_v4_Trial_region
    ) as Villages_v4_Trial_region
    ORDER BY ST_MaxDistance(points,Center) DESC
    LIMIT 1) as foo;

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


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

@kttii আমি পোস্টজিআইএস কীভাবে ব্যবহার করতে হয় তা জানি না। আপনি কি অর্ক বা ম্যাপিনফো বা কিগিসে একটি সহজ সমাধান সরবরাহ করতে পারেন
দিব্যা

@kttii তাই আমি পোস্টগ্র্যাস্কল ইনস্টল করেছি। আমি এই সঠিক ক্যোয়ারীটি অনুলিপি করেছিলাম তবে এটি একটি ERROR দিয়েছে: কলাম "the_geom" বিদ্যমান নেই। আমি কি করব?
দিব্যা

the_geom আপনার জ্যামিতি ক্ষেত্রের নাম দ্বারা প্রতিস্থাপন করা উচিত। আপনার নিজের পোস্টগ্রিএসকিউএলও রাখতে হবে। পোস্টগ্রাইএসকিউএল এমএসএসকিউএলের মতো একটি ডাটাবেস। পোস্টজিআইএস হ'ল ডেটাবেসকে স্থানিকভাবে সচেতন করতে এবং সমস্ত এস এস ফাংশন সরবরাহ করার জন্য একটি এক্সটেনশন।
কেটিআই

@kttii আমি আমার ডাটাবেসে ক্ষেত্রের নামটি_জুম থেকে "গিড" এ আপডেট করেছি। আবার ক্যোয়ারী চালানোর পরে, আমি এই ত্রুটি পেয়েছি: ফাংশন st_convexhull (পূর্ণসংখ্যা) অস্তিত্ব নেই
Divya

4

পরবর্তী পাইকিজিআইএস কোড ব্যবহার করে :

from math import sqrt

layer = iface.activeLayer()

feats = [ feat for feat in layer.getFeatures() ]

n = len(feats)

centroids = [ feat.geometry().centroid().asPoint() for feat in feats ]
polygons = [ feat.geometry().asPolygon()[0] for feat in feats ]

lengths = []

for i, pol in enumerate(polygons):
    max_dist = 0
    idx_j = 0
    for j, point in enumerate(pol):
        dist = sqrt(centroids[i].sqrDist(point))
        if dist > max_dist:
            max_dist = dist
            idx_j = j
    print i, idx_j, max_dist
    lengths.append([centroids[i], pol[idx_j]])

crs = layer.crs()
epsg = crs.postgisSrid()

uri = "LineString?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"

mem_layer = QgsVectorLayer(uri,
                           'max_distance',
                           'memory')

prov = mem_layer.dataProvider()

feats = [ QgsFeature() for i in range(n) ]

for i, feat in enumerate(feats):
    feat.setAttributes([i])
    feat.setGeometry(QgsGeometry.fromPolyline(lengths[i]))

prov.addFeatures(feats)

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)

এবং এই শেফফাইল (11 টি বৈশিষ্ট্য সহ):

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

আমি একটি স্মৃতি স্তর পেয়েছি যেখানে প্রতিটি বহুভুজের (বৈশিষ্ট্য) সেন্ট্রয়েড এবং দূরতম পয়েন্টের মধ্যে পলিনগুলি দূরত্ব ছিল; এটি পরবর্তী ছবিতে লক্ষ্য করা যায়:

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

কিউজিআইএসের পাইথন কনসোলে, এটি বৈশিষ্ট্য সূচকটিও ছাপানো হয়েছিল, বৈশিষ্ট্যের বিন্দু সূচক যেখানে সেন্ট্রয়েড থেকে দূরত্ব সর্বোচ্চ এবং শেষ পর্যন্ত সর্বাধিক দূরত্ব।

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


পাইকিজিআইএস কীভাবে ব্যবহার করতে হয় তা আমি জানি না। আপনি কি অর্ক বা ম্যাপিনফো বা কিগিসে একটি সহজ সমাধান সরবরাহ করতে পারেন
দিব্যা


0

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

Function GetFurthest(ByVal oNode1 as Object, ByVal oObj as Object) as Object

Dim sourceE,sourceN,East,North,Longest,Dist as Float,
    nNodes,nPolys,i,j as SmallInt,
    oNode2 as Object

    sourceE = CentroidX(oNode1)
    sourceN = CentroidY(oNode1)
    Longest = 0

    nPolys = ObjectInfo(oObj,OBJ_INFO_NPOLYGONS)
    For i = 1 to nPolys
        nNodes = ObjectInfo(oObj,OBJ_INFO_NPOLYGONS+nPolys)
        For j = 1 to nNodes
            East = ObjectNodeX(oObj,i,j)
            North = ObjectNodeY(oObj,i,j)
            Dist = Distance(sourceE,sourceN,East,North,"m")
            If Dist > Longest then
                Longest = Dist
                oNode2 = CreatePoint(East,North)
            End if
        Next
    Next

    GetFurthest = oNode2

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