बहुभुज के केन्द्रक और दूर के बिंदु के बीच की दूरी


12

मेरे पास एक गाँव बहुभुज परत है जिस पर 6,00,000 से अधिक रिकॉर्ड हैं। मैंने प्रत्येक गाँव के केन्द्रक की गणना की है। मैं प्रत्येक बहुभुज के केन्द्रक और सबसे दूर के नोड के बीच की दूरी का पता लगाना चाहता हूं। संदर्भ के लिए नीचे दी गई छवि की जाँच करें। काली रेखाएँ बहुभुज सीमाएँ हैं। यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें


दिलचस्प ... मैं बस एक बहुभुज के चारों ओर एक सर्कल का निर्माण करने के लिए पोस्टगिस के साथ इस शुक्रवार को किया था। मेरे द्वारा उपयोग किए गए कोड को देखने के लिए मुझे कुछ मिनटों की आवश्यकता है .. i.stack.imgur.com/EKnkg.png
kttii

1
सबसे पहले हमें आपके निपटान में होने वाले कार्यक्रमों को जानना होगा। यह भी कि आपने थिसारस और नोड्स कैसे बनाए? (भले ही यह थोड़ा स्पष्ट लगता हो कि बहुभुजों पर नोड्स आपके आकृतियों की सीमाओं को निर्धारित करने के लिए उपयोग किए जाते हैं, लेकिन क्या आपने थोज्स के शीर्ष पर एडिशननल प्वाइंट को जोड़ा है?)
मोरो कॉलिन

क्या केन्द्रक का स्थान महत्वपूर्ण है? आपने उन्हें कैसे बनाया?
GISGe

संभावित डुप्लिकेट - gis.stackexchange.com/questions/133099/…
klewis

यदि केंद्रक वास्तव में केंद्रीय है, तो यह उस बिंदु पर केंद्रित सबसे छोटे वृत्त की त्रिज्या है जो बहुभुज ( en.wikipedia.org/wiki/Smallest-circle_problem ) पर फिट बैठता है
मार्क आयरलैंड

जवाबों:


3

ऐसा लगता है कि आप MapInfo के साथ काम कर रहे हैं। "डिस्टेंस कैलकुलेटर" (टूल मैनेजर में इसे खोजें) के कई विकल्प हैं और मुझे लगता है कि यह इस कार्य को भी संभाल सकता है। इसके बारे में एक लेख यहाँ है: http://web.pb.com/mapinfopro-jul-2013/Toolbox-Distance-Calculator


15

PostGIS का उपयोग करते हुए, मैंने तेजी से परिणाम के लिए बहुभुज को सरल बनाने के लिए 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 मैं नहीं जानता कि PostGIS का उपयोग कैसे करें। क्या आप आर्क या मेपिनफो या क्विज़
दिव्य

@kttii तो मैंने Postgresql स्थापित किया। मैंने इस सटीक क्वेरी को कॉपी-पेस्ट किया, लेकिन इसने एक त्रुटि दी: कॉलम "the_geom" मौजूद नहीं है। मैं क्या करूं?
दिव्य

The_geom को आपके ज्यामिति फ़ील्ड नाम से बदला जाना चाहिए। आपको अपना डेटा PostgreSQL में भी डालना होगा। PostgreSQL MSSQL की तरह एक डेटाबेस है। PostGIS डेटाबेस को स्थानिक रूप से जागरूक करने और सभी ST_ फ़ंक्शन प्रदान करने के लिए एक एक्सटेंशन है।
12

@kttii मैंने अपने डेटाबेस में the_geom से "gid" क्षेत्र का नाम अपडेट किया। क्वेरी फिर से चलाने के बाद, मुझे यह ERROR मिला: फ़ंक्शन st_convexhull (पूर्णांक) मौजूद नहीं है
दिव्य

4

अगले PyQGIS कोड का उपयोग करना :

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 सुविधाओं के साथ):

यहाँ छवि विवरण दर्ज करें

मुझे एक मेमोरी लेयर मिली जहां पॉलीइन्स प्रत्येक बहुभुज (सुविधा) के सेंट्रोइड और दूर के बिंदु के बीच की दूरी थी; क्योंकि यह अगली छवि में देखा जा सकता है:

यहाँ छवि विवरण दर्ज करें

क्यूजीआईएस के पायथन कंसोल में, यह फीचर का सूचकांक भी मुद्रित किया गया था, पॉइंट ऑफ़ फ़ीचर जहां सेंटीरोइड से दूरी अधिकतम और अंत में, अधिकतम दूरी है।

यहाँ छवि विवरण दर्ज करें


मैं नहीं जानता कि कैसे PyQGIS का उपयोग करना है। क्या आप आर्क या मेपिनफो या क्विज़
दिव्य


0

जैसा कि ऐसा लगता है कि आप MapInfo का उपयोग कर रहे हैं, यहाँ एक MapBasic फ़ंक्शन है जिसे मैंने कुछ समय पहले एक इन-हाउस टूल के लिए लिखा था, जिस पर मैं काम कर रहा था। यह एक स्रोत नोड (आपका केंद्र बिंदु) और एक क्षेत्र ऑब्जेक्ट (बहुभुज) को तर्क के रूप में लेता है और स्रोत बिंदु से बहुभुज में सबसे दूर नोड पर एक बिंदु वस्तु देता है।

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