গুগল ম্যাপস এপিআই ভি 3 - নিকটতম চিহ্নিতকারীগুলি সন্ধান করুন


89

আমি যখন মানচিত্রে ক্লিক করি তখন নিকটস্থ চিহ্নিতকারী বা চিহ্নিতকারীদের সন্ধান করার সর্বোত্তম উপায়টি কী হবে? এপিআই-তে কিছু ফাংশন রয়েছে যা আমাকে তা করতে সাহায্য করবে?

এটি গুগল ম্যাপ এপিআই ভি 3।


4
আপনি চিহ্নিতকারীদের কর্ডগুলি সঞ্চয় করতে কোনও ডাটাবেস ব্যবহার করেন?
Argiropoulos Stavros

নিশ্চিত, চিহ্নিতকারীদের অবস্থানগুলি মাইএসকিএল ডেটাবেসে সংরক্ষিত আছে।
ব্যবহারকারী 198003

উত্তর:


113

প্রথমে আপনাকে ইভেন্টলিস্টার যুক্ত করতে হবে

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);
}

এটি নিকটতম চিহ্নিতকারীদের নজর রাখে এবং এর শিরোনামকে সতর্ক করে।

আমার মানচিত্র অবজেক্টে অ্যারে হিসাবে আমার চিহ্নিতকারী রয়েছে


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

@ লী - এটি উপলব্ধি করে তবে আমি বিষয়টিটির সদৃশ করতে পারি না
গ্যালেন

4
হ্যাঁ এটি আমার পক্ষে মোটেও কার্যকর হয়নি - আমাকে আমাদের ক্যালিফোর্নিয়াতে রাখুন এবং আমি এনওয়াইতে আছি। এবং আমার অবস্থানে একটি চিহ্নিতকারী আছে। যদিও এটি একটি চিহ্নিতকারী খুঁজে পেয়েছে!
মায়াভারগুলি

@ এমআইভার্স - কোডটিতে একটি ত্রুটি রয়েছে। (i = 1 থেকে পরিবর্তন করুন (i = 0 It এটি প্রথম চিহ্নিতকারী সহ অন্তর্ভুক্ত ছিল না
গ্যালেন

4
@ মাগিকো আপনি জাভাস্ক্রিপ্টকে পিএইচপি কোডে পরিণত করতে পারবেন না। আপনি এমন একটি পিএইচপি র‌্যাপার লিখতে পারেন যা উত্তরের মতো জাভাস্ক্রিপ্ট কোড উত্পন্ন করে। যদি আপনি নিজে থেকে এটি করতে না পারেন তবে পিএইচপি মোটেও ব্যবহার করবেন না ...
ড্যানিয়েল ডাব্লু।


30

আমি নিকটবর্তী অবস্থানের গণনা এবং আসলে একটি কার্যনির্বাহী সমাধান সরবরাহ করতে পারে সে সম্পর্কে বিভ্রান্ত যে কারও জন্য লেওরের পরামর্শটি প্রসারিত করতে চাই :

আমি একটি 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অবজেক্ট।


4
দুর্দান্ত উত্তর!
সিজার আলোনসো

পরিষ্কার পরিচ্ছন্ন উত্তর!
থিবেন

এটি কি দূরত্বে চিহ্নিতকারীদের বাছাই করতে ব্যবহার করা যেতে পারে, তবে কেবল একটিটি ফেরত দিতে পারেন?
লুই ডাব্লু

অবশ্যই লুইস, ফিল্টার পদ্ধতিটি দেখুন। আপনি সেগুলি বাছাই করতে এটি ব্যবহার করতে পারেন
জোনাথন

4
লোকেশন অবজেক্টে অবস্থান সরিয়ে আমি এটি কাজ করেছিলাম; যেমন পছন্দ করুন: কম্পিউটডেস্টেন্সটি বিটউইন (অবস্থান, প্রপোজেশন) ... কারণ অবস্থানটি ইতিমধ্যে একটি ল্যাটলং অবজেক্ট।
holm50

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]);
}

4
আপনি markersঅ্যারে কীভাবে তৈরি করবেন ? এটি ব্যবহার করে কোনও মার্কার তৈরি করে var marker1 = new google.maps.Marker({ ... })?
এএনএনচে

4
@ পরিবর্তন আমার এই কাজটি করতে হয়েছিল: map.markers = map.markers || [];তারপরে প্রতিটি চিহ্নিতকারীর জন্যmap.markers.push(marker);
ট্র্যাভিস

5

আপনি কি মাইএসকিএল স্পেসিয়াল এক্সটেনশন সম্পর্কে সচেতন? ?

আপনি এমবিআর কনটেনস (জি 1, জি 2) এর মতো কিছু ব্যবহার করতে পারেন ।


4
আবার ^^ উভয়ই 404 - লিংক-উত্তরগুলির সাথে সমস্যা।
ট্রেইবেক

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 মানচিত্রের এপিআই পদ্ধতিটি ব্যবহার করুন ।

পদক্ষেপ: -

  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. মাউসে আপনার অবস্থানের দীর্ঘ, ল্যাট হওয়ার জন্য ইভেন্ট তৈরি করুন ক্লিক করুন এবং এটি সন্ধান করুন_ক্লসস্ট_মার্কারে () পাস করুন।

    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());
        }
    

দেখার এই লিঙ্কে ধাপগুলি অনুসরণ করুন। আপনি আপনার অবস্থানের কাছাকাছি মার্কার পেতে সক্ষম হবেন।

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