Google मानचित्र Api v3 - निकटतम मार्करों को ढूंढें


89

जब मैं मानचित्र पर क्लिक करता हूं, जो निकटतम मार्कर या मार्कर खोजने का सबसे अच्छा तरीका होगा? क्या एपी में कुछ कार्य हैं जो मुझे ऐसा करने में मदद करेंगे?

यह google map api v3 है।


1
क्या आप मार्कर के कोर्ड को स्टोर करने के लिए किसी डेटाबेस का उपयोग करते हैं?
अर्गोप्रोपोलोस स्टावरोस

यकीन है, मार्कर पदों mysql datbase में संग्रहीत हैं।
11:19 बजे user198003

जवाबों:


112

सबसे पहले आपको इवेंटलिस्ट को जोड़ना होगा

google.maps.event.addListener(map, 'click', find_closest_marker);

फिर एक फ़ंक्शन बनाएं जो मार्करों के सरणी से गुजरता है और क्लिक से प्रत्येक मार्कर की दूरी की गणना करने के लिए हैवरसाइन फॉर्मूला का उपयोग करता है ।

function rad(x) {return x*Math.PI/180;}
function find_closest_marker( event ) {
    var lat = event.latLng.lat();
    var lng = event.latLng.lng();
    var R = 6371; // radius of earth in km
    var distances = [];
    var closest = -1;
    for( i=0;i<map.markers.length; i++ ) {
        var mlat = map.markers[i].position.lat();
        var mlng = map.markers[i].position.lng();
        var dLat  = rad(mlat - lat);
        var dLong = rad(mlng - lng);
        var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
            Math.cos(rad(lat)) * Math.cos(rad(lat)) * Math.sin(dLong/2) * Math.sin(dLong/2);
        var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
        var d = R * c;
        distances[i] = d;
        if ( closest == -1 || d < distances[closest] ) {
            closest = i;
        }
    }

    alert(map.markers[closest].title);
}

यह निकटतम मार्करों का ट्रैक रखता है और इसके शीर्षक को सचेत करता है।

मेरे पास मेरे मानचित्र ऑब्जेक्ट पर एक सरणी के रूप में मेरे मार्कर हैं


2
एक पुराने धागे को खोलने के लिए नहीं, लेकिन मैंने इसे लागू करने की कोशिश की है, और ऐसा लगता है कि पूर्व की ओर खोज करना है और फिर निकटतम को खोजना है। इसलिए अगर मैं किसी स्थान को खोजता हूं, तो वह पूर्व की ओर खोज करेगा और पश्चिम के सबसे करीब पहुंच जाएगा, भले ही वह पश्चिम के करीब हो। क्या इसका कोई मतलब है?
लीआर

@ ली - यह समझ में आता है, लेकिन मैं इस मुद्दे को डुप्लिकेट नहीं कर सकता
गैलेन

1
हाँ, यह मेरे लिए बिल्कुल काम नहीं किया - मुझे हमारे कैलिफ़ोर्निया स्थान पर रखा और मैं NY में हूँ। और मेरे स्थान पर एक मार्कर है। यह एक मार्कर हालांकि पाया!
बुनकरों

@ नौकर - कोड में कोई त्रुटि है। से परिवर्तन (i = 1 से) (i = 0) यह पहले मार्कर सहित नहीं था।
गैलन

1
@Magico आप जावास्क्रिप्ट को php कोड में नहीं बदल सकते। आप एक php आवरण लिख सकते हैं जो उत्तर में जावास्क्रिप्ट कोड उत्पन्न करता है। यदि आप इसे अपने दम पर नहीं कर सकते, तो php का उपयोग बिल्कुल न करें ...
Daniel W.


30

मैं Leor के सुझाव पर विस्तार करना चाहता हूं निकटतम स्थान की गणना करने और वास्तव में एक कार्यशील समाधान प्रदान करने के बारे में उलझन में किसी के लिए :

मैं एक markersसरणी में मार्करों का उपयोग कर रहा हूँ जैसे var markers = [];

तो फिर चलो हमारी स्थिति कुछ इस तरह है var location = new google.maps.LatLng(51.99, -0.74);

फिर हम अपने मार्करों को हमारे द्वारा पसंद किए गए स्थान के विरुद्ध कम कर देते हैं:

markers.reduce(function (prev, curr) {

    var cpos = google.maps.geometry.spherical.computeDistanceBetween(location.position, curr.position);
    var ppos = google.maps.geometry.spherical.computeDistanceBetween(location.position, prev.position);

    return cpos < ppos ? curr : prev;

}).position

जो पॉप आउट करता है वह आपकी निकटतम मार्कर LatLngवस्तु है।


1
जबरदस्त जवाब!
सीज़र अलोंसो

स्वच्छ और साफ जवाब!
TheBen

क्या इसका उपयोग मार्करों को दूरी के आधार पर क्रमबद्ध करने के लिए किया जा सकता है, बल्कि तब केवल एक लौटाया जा सकता है?
लुई डब्ल्यू

ज़रूर @Louis, फ़िल्टर विधि को देखें। आप उन्हें सॉर्ट करने के लिए उपयोग कर सकते हैं
जोनाथन

1
मैंने इसे स्थान वस्तु पर स्थिति को हटाकर काम किया; जैसे: computeDistanceBetween (स्थान, prev.position) ... क्योंकि स्थान पहले से ही एक LatLng वस्तु है।
होल्म 50

9

ऊपर दिया गया सूत्र मेरे लिए काम नहीं करता था, लेकिन मैंने बिना किसी समस्या के इसका उपयोग किया। फ़ंक्शन के लिए अपना वर्तमान स्थान पास करें, और निकटतम को खोजने के लिए मार्कर की एक सरणी के माध्यम से लूप करें:

function find_closest_marker( lat1, lon1 ) {    
    var pi = Math.PI;
    var R = 6371; //equatorial radius
    var distances = [];
    var closest = -1;

    for( i=0;i<markers.length; i++ ) {  
        var lat2 = markers[i].position.lat();
        var lon2 = markers[i].position.lng();

        var chLat = lat2-lat1;
        var chLon = lon2-lon1;

        var dLat = chLat*(pi/180);
        var dLon = chLon*(pi/180);

        var rLat1 = lat1*(pi/180);
        var rLat2 = lat2*(pi/180);

        var a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
                    Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(rLat1) * Math.cos(rLat2); 
        var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
        var d = R * c;

        distances[i] = d;
        if ( closest == -1 || d < distances[closest] ) {
            closest = i;
        }
    }

    // (debug) The closest marker is:
    console.log(markers[closest]);
}

1
आप markersसरणी को कैसे आबाद करते हैं ? यह एक मार्कर का उपयोग करके बना रहा है var marker1 = new google.maps.Marker({ ... })?
करामाती

1
@enchance मुझे ऐसा करना पड़ा: map.markers = map.markers || [];प्रत्येक मार्कर के लिएmap.markers.push(marker);
ट्रैविस


4

यहाँ एक और कार्य है जो मेरे लिए बहुत अच्छा काम करता है, किलोमीटर में दूरी तय करता है:

 function distance(lat1, lng1, lat2, lng2) {
        var radlat1 = Math.PI * lat1 / 180;
        var radlat2 = Math.PI * lat2 / 180;
        var radlon1 = Math.PI * lng1 / 180;
        var radlon2 = Math.PI * lng2 / 180;
        var theta = lng1 - lng2;
        var radtheta = Math.PI * theta / 180;
        var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
        dist = Math.acos(dist);
        dist = dist * 180 / Math.PI;
        dist = dist * 60 * 1.1515;

        //Get in in kilometers
        dist = dist * 1.609344;

        return dist;
    }

3

Google मानचित्र पर अपने स्थान और मार्कर सूची के बीच मार्कर की गणना करने के लिए computeDistanceBetween () Google मानचित्र API विधि का उपयोग करें।

कदम:-

  1. गूगल मैप पर मार्कर बनाएं।
    function addMarker(location) { var marker = new google.maps.Marker({ title: 'User added marker', icon: { path: google.maps.SymbolPath.BACKWARD_CLOSED_ARROW, scale: 5 }, position: location, map: map }); }

  2. माउस पर अपने स्थान के लंबे, लंबे होने के लिए ईवेंट बनाएं पर क्लिक करें और उसे खोजने के लिए पास करें_closest_marker ()।

    function find_closest_marker(event) {
          var distances = [];
          var closest = -1;
          for (i = 0; i < markers.length; i++) {
            var d = google.maps.geometry.spherical.computeDistanceBetween(markers[i].position, event.latLng);
            distances[i] = d;
            if (closest == -1 || d < distances[closest]) {
              closest = i;
            }
          }
          alert('Closest marker is: ' + markers[closest].getTitle());
        }
    

इस लिंक पर जाएँ चरणों का पालन करें। आप अपने स्थान के करीब पहुंच सकते हैं।

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