जाँच करें कि क्या lat / लॉन्ग पॉइंट google मैप्स का उपयोग करके बहुभुजों के एक सेट के भीतर है


9

मैं जानता हूं कि एसेरी (शेपफाइल पर क्वेरी कार्य) का उपयोग कैसे करना है, लेकिन क्या यह Google मैप्स का उपयोग करके भी किया जा सकता है? क्या मुझे प्रत्येक बहुभुज को क्वेरी करना है या बहुभुजों के सेट को क्वेरी करने की एक विधि है?

जवाबों:


9

Google मैप्स API पहले से ही बहुभुजों में बिंदुओं की जाँच के लिए एक विधि प्रदान नहीं करता है। थोड़ा शोध करने के बाद, मैं रे-कास्टिंग एल्गोरिथ्म में ठोकर खाई, जो यह निर्धारित करेगा कि एक XY समन्वय एक प्लॉट किए गए आकार के अंदर है। यह अक्षांश और देशांतर में अनुवाद करेगा। निम्न इस एल्गोरिथ्म का उपयोग करने के लिए google.maps.polygon.prototype का विस्तार करता है। Google.maps के लोड होने के बाद बस इस कोड को एक बिंदु पर कोड में शामिल करें:

google.maps.Polygon.prototype.Contains = function (point) {
    var crossings = 0,
        path = this.getPath();

    // for each edge
    for (var i = 0; i < path.getLength(); i++) {
        var a = path.getAt(i),
            j = i + 1;
        if (j >= path.getLength()) {
            j = 0;
        }
        var b = path.getAt(j);
        if (rayCrossesSegment(point, a, b)) {
            crossings++;
        }
    }

    // odd number of crossings?
    return (crossings % 2 == 1);

    function rayCrossesSegment(point, a, b) {
        var px = point.lng(),
            py = point.lat(),
            ax = a.lng(),
            ay = a.lat(),
            bx = b.lng(),
            by = b.lat();
        if (ay > by) {
            ax = b.lng();
            ay = b.lat();
            bx = a.lng();
            by = a.lat();
        }
        // alter longitude to cater for 180 degree crossings
        if (px < 0) {
            px += 360;
        }
        if (ax < 0) {
            ax += 360;
        }
        if (bx < 0) {
            bx += 360;
        }

        if (py == ay || py == by) py += 0.00000001;
        if ((py > by || py < ay) || (px > Math.max(ax, bx))) return false;
        if (px < Math.min(ax, bx)) return true;

        var red = (ax != bx) ? ((by - ay) / (bx - ax)) : Infinity;
        var blue = (ax != px) ? ((py - ay) / (px - ax)) : Infinity;
        return (blue >= red);

    }

};

यहाँ हमने google.maps.Polygon की कार्यक्षमता को 'Contains' नाम से एक फ़ंक्शन को परिभाषित करके बढ़ाया है, जिसका उपयोग यह निर्धारित करने के लिए किया जा सकता है कि फ़ंक्शन पैरामीटर में दिए गए अक्षांश देशांतर बहुभुज के भीतर हैं या नहीं। यहां हम रे-कास्टिंग एल्गोरिथ्म का उपयोग करते हैं और उसी का उपयोग करके एक फ़ंक्शन विकसित किया है। अब यह बहुत अभ्यास करने के बाद, हम एक बिंदु की जाँच कर सकते हैं:

var point = new google.maps.LatLng(52.05249047600099, -0.6097412109375);
var polygon = new google.maps.Polygon({path:[INSERT_PATH_ARRAY_HERE]});
if (polygon.Contains(point)) {
    // point is inside polygon
}

पूर्ण कोड और डेमो के लिए कृपया यहां जाएं: http://counsellingbyabhi.blogspot.in/2013/01/google-map-check-whether-point-latlong.html


हां, रे कास्टिंग मैं जाने का तरीका है। मैंने वास्तव में एक अजगर स्क्रिप्ट के माध्यम से उस एल्गोरिथ्म का उपयोग किया। मेरा कार्यान्वयन यहाँ पाया जा सकता है: grky.blogspot.com/2012/12/…
ngramsky

मुझे उन बिट्स को निकालना था जो 360 को नकारात्मक निर्देशांक में जोड़ते थे, इसके लिए देशांतर 0. ठीक से काम करने के लिए
user1431317

4

मैं ओपन लेयर्स प्लगइन पर जाऊंगा; इसे लाएँ, और फिर आप जो भी गतिशील परत अपने मानचित्र और निर्यात में जोड़ सकते हैं।

* ऐसा करने से पहले, सुनिश्चित करें कि आपके पास अपनी परियोजना सीआरएस (ईपीएसजी) डब्ल्यूजीएस84 पर सेट है, और यह कि 'फ्लाई पर' सीआरएस परिवर्तन आपकी परियोजना गुण सेटिंग्स के तहत सक्षम है।

उम्मीद है की यह मदद करेगा।


0

यदि आप तीसरे पक्ष के कार्यक्रम को जियोजेन्जैंगो के रूप में उपयोग करते हैं, तो आप अपनी बात की जांच कर सकते हैं कि पॉलीगॉन के सेट के भीतर है या नहीं। अधिक जानकारी यहाँ है

contains

Availability: PostGIS, Oracle, MySQL, SpatiaLite

Tests if the geometry field spatially contains the lookup geometry.

Example:

Zipcode.objects.filter(poly__contains=geom)

Backend     SQL Equivalent
PostGIS     ST_Contains(poly, geom)
Oracle  SDO_CONTAINS(poly, geom)
MySQL   MBRContains(poly, geom)
SpatiaLite  Contains(poly, geom)

मुझे उम्मीद है इससे आपको मदद मिली होगी...


0

मुझे पता है कि यह थोड़ा देर से है, लेकिन ऐसा हो सकता है कि कोई व्यक्ति Android-मैप-यूटिल्स लाइब्रेरी की कोशिश न करे। मैंने इस प्रश्न के विशिष्ट तरीकों को केवल Android के लिए पोस्ट किया है। हेयर यू गो:

https://stackoverflow.com/a/31988461/2054348

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