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


115

বিট এই এক আটকে। আমি জেএসওএন এর মাধ্যমে জিও কর্ডের একটি তালিকা পুনরুদ্ধার করছি এবং একটি গুগল মানচিত্রে এঁকে যাচ্ছি। উদাহরণটি ব্যতীত সমস্ত ঠিকঠাক কাজ করছে যখন আমার ঠিক একই জায়গায় দুটি বা আরও বেশি চিহ্নিতকারী রয়েছে। এপিআই শুধুমাত্র 1 টি চিহ্নিতকারী প্রদর্শন করে - শীর্ষস্থানীয়। এটি যথেষ্ট পরিমাণে আমি মনে করি তবে এগুলি সমস্তরকমভাবে প্রদর্শন করার জন্য কোনও উপায় খুঁজে পেতে চাই।

আমি গুগল অনুসন্ধান করেছি এবং কয়েকটি সমাধান পেয়েছি তবে সেগুলি বেশিরভাগই এপিআইয়ের ভি 2 এর জন্য বলে মনে হয় বা এটি দুর্দান্ত নয়। আদর্শভাবে আমি এমন একটি সমাধান চাই যেখানে আপনি কোনও ধরণের গোষ্ঠী চিহ্নিতকারীকে ক্লিক করেন এবং তারপরে চিহ্নিতকারীরা সমস্ত জায়গার চারদিকে ক্লাস্টার্ড দেখায়।

কারও এই সমস্যা বা অনুরূপ ছিল এবং সমাধান ভাগ করে নেওয়ার যত্ন নেবে?

উত্তর:


116

ওভারল্যাপিংমার্কারস্পাইডারফায়ারটি একবার দেখুন ।
একটি ডেমো পৃষ্ঠা রয়েছে, তবে তারা চিহ্নিতকারীগুলি দেখায় না যা ঠিক একই জায়গাতেই রয়েছে, কেবলমাত্র কিছু কিছু যা একসাথে খুব কাছাকাছি রয়েছে।

তবে ঠিক একই স্থানে চিহ্নিতকারীদের সাথে বাস্তব জীবনের উদাহরণটি http://www.ejw.de/ejw-vor-ort/ এ দেখা যাবে (ম্যাপের জন্য নীচে স্ক্রোল করুন এবং মাকড়সার প্রভাব দেখতে কয়েকটি চিহ্নিতকারীকে ক্লিক করুন) )।

এটি আপনার সমস্যার নিখুঁত সমাধান বলে মনে হচ্ছে।


এটি দুর্দান্ত।
জাস্টিন

যদি মার্কারক্লাস্টারারেরOverlappingMarkerSpiderfier সাথে সংমিশ্রণে ব্যবহার করা হয় তবে ক্লাস্টার কনস্ট্রাক্টরের বিকল্পটি সেট করা একটি ভাল বিকল্প । নির্দিষ্ট জুম লেভেলের পরে চিহ্নিতকারীগুলিকে এই "আনলকস্টারস"। maxZoom
ডিয়েডেরিক

@ ট্যাড আমি জানি না আপনি যদি সেই ওয়েবসাইটের বিকাশকারী হন তবে আমি আপনাকে জানাতে চেয়েছিলাম যে ejw.de এর মানচিত্রটি নষ্ট হয়ে গেছে। আমি একটি জেএস ত্রুটি পেয়েছি।
অ্যালেক্স

আমি প্রস্তাবিত ডেমো পরীক্ষা করেছিলাম, তবে এটি মৃতপ্রায় বলে মনে হচ্ছে। আরও গবেষণার পরে আমি চিহ্নিতকারী ক্লাস্টারগুলি এবং স্পাইড্রিফায়ারকে কীভাবে সংহত করতে পারি তার এই উদাহরণটি পেয়েছি। কোনও লাইভ ডেমো নেই, তবে কেবল ক্লোন করুন এবং রিডমে অনুসরণ করুন। github.com/yagoferrer/markerclusterer-plus-spiderfier-example
স্যাক্স

34

চিহ্নিতকারীরা একই বিল্ডিংয়ে অবস্থিত হলে অফসেট করা কোনও আসল সমাধান নয়। আপনি যা করতে চাইতে পারেন তা হ'ল মার্কারক্লসটিয়ার.জেগুলি সংশোধন করা:

  1. মার্কারক্লাস্টার ক্লাসে একটি প্রোটোটাইপ ক্লিক পদ্ধতি যুক্ত করুন, এর মতো - আমরা এটি পরে মানচিত্রের সূচনা () ফাংশনে ওভাররাইড করব:

    MarkerClusterer.prototype.onClick = function() { 
        return true; 
    };
  2. ক্লাস্টার আইকন ক্লাসে ক্লাস্টার ক্লিক ট্রিগার পরে নিম্নলিখিত কোড যুক্ত করুন:

    // Trigger the clusterclick event.
    google.maps.event.trigger(markerClusterer, 'clusterclick', this.cluster_);
    
    var zoom = this.map_.getZoom();
    var maxZoom = markerClusterer.getMaxZoom();
    // if we have reached the maxZoom and there is more than 1 marker in this cluster
    // use our onClick method to popup a list of options
    if (zoom >= maxZoom && this.cluster_.markers_.length > 1) {
       return markerClusterer.onClickZoom(this);
    }
  3. তারপরে, আপনার আরম্ভ () ফাংশনে যেখানে আপনি মানচিত্রটি আরম্ভ করবেন এবং আপনার মার্কারক্লাস্টার অবজেক্টটি ঘোষণা করুন:

    markerCluster = new MarkerClusterer(map, markers);
    // onClickZoom OVERRIDE
    markerCluster.onClickZoom = function() { return multiChoice(markerCluster); }

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

    function multiChoice(mc) {
         var cluster = mc.clusters_;
         // if more than 1 point shares the same lat/long
         // the size of the cluster array will be 1 AND
         // the number of markers in the cluster will be > 1
         // REMEMBER: maxZoom was already reached and we can't zoom in anymore
         if (cluster.length == 1 && cluster[0].markers_.length > 1)
         {
              var markers = cluster[0].markers_;
              for (var i=0; i < markers.length; i++)
              {
                  // you'll probably want to generate your list of options here...
              }
    
              return false;
         }
    
         return true;
    }

17

আমি jQuery পাশাপাশি এটি ব্যবহার করে এবং এটি কাজ করে:

var map;
var markers = [];
var infoWindow;

function initialize() {
    var center = new google.maps.LatLng(-29.6833300, 152.9333300);

    var mapOptions = {
        zoom: 5,
        center: center,
        panControl: false,
        zoomControl: false,
        mapTypeControl: false,
        scaleControl: false,
        streetViewControl: false,
        overviewMapControl: false,
        mapTypeId: google.maps.MapTypeId.ROADMAP
      }


    map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);

    $.getJSON('jsonbackend.php', function(data) {
        infoWindow = new google.maps.InfoWindow();

        $.each(data, function(key, val) {
            if(val['LATITUDE']!='' && val['LONGITUDE']!='')
            {                
                // Set the coordonates of the new point
                var latLng = new google.maps.LatLng(val['LATITUDE'],val['LONGITUDE']);

                //Check Markers array for duplicate position and offset a little
                if(markers.length != 0) {
                    for (i=0; i < markers.length; i++) {
                        var existingMarker = markers[i];
                        var pos = existingMarker.getPosition();
                        if (latLng.equals(pos)) {
                            var a = 360.0 / markers.length;
                            var newLat = pos.lat() + -.00004 * Math.cos((+a*i) / 180 * Math.PI);  //x
                            var newLng = pos.lng() + -.00004 * Math.sin((+a*i) / 180 * Math.PI);  //Y
                            var latLng = new google.maps.LatLng(newLat,newLng);
                        }
                    }
                }

                // Initialize the new marker
                var marker = new google.maps.Marker({map: map, position: latLng, title: val['TITLE']});

                // The HTML that is shown in the window of each item (when the icon it's clicked)
                var html = "<div id='iwcontent'><h3>"+val['TITLE']+"</h3>"+
                "<strong>Address: </strong>"+val['ADDRESS']+", "+val['SUBURB']+", "+val['STATE']+", "+val['POSTCODE']+"<br>"+
                "</div>";

                // Binds the infoWindow to the point
                bindInfoWindow(marker, map, infoWindow, html);

                // Add the marker to the array
                markers.push(marker);
            }
        });

        // Make a cluster with the markers from the array
        var markerCluster = new MarkerClusterer(map, markers, { zoomOnClick: true, maxZoom: 15, gridSize: 20 });
    });
}

function markerOpen(markerid) {
    map.setZoom(22);
    map.panTo(markers[markerid].getPosition());
    google.maps.event.trigger(markers[markerid],'click');
    switchView('map');
}

google.maps.event.addDomListener(window, 'load', initialize);

থেক্স আমার জন্য নিখুঁতভাবে কাজ করে :) আমি যা ঘণ্টার পর থেকে অনুসন্ধান করেছিলাম: পি
জিকাও

সুন্দর এবং মার্জিত সমাধান। ধন্যবাদ!
কনসেপ্ট 211

নিখুঁত সমাধান কিছুটা অফসেট! এটি কি সম্ভব, আমরা চিহ্নিতকারীকে ঘুরে দেখি এবং এটি একাধিক মার্কার প্রদর্শন করার চেয়ে
ইন্তেখাব খান

14

চোলির উত্তরের প্রসারিত করে , আমি একটি ফাংশন প্রয়োগ করেছি, যার স্থানাঙ্কগুলি ( সংস্থানগুলিlng এবং latবৈশিষ্ট্যগুলি) যার স্থানাঙ্কগুলি হুবহু একই, তাদেরকে তাদের মূল অবস্থান থেকে কিছুটা দূরে সরিয়ে নিয়েছে (স্থানে বস্তু পরিবর্তন করে)। এরপরে তারা কেন্দ্র বিন্দুর চারপাশে একটি সুন্দর বৃত্ত তৈরি করে।

আমি দেখতে পেয়েছি যে, আমার অক্ষাংশের (52 ডিগ্রি উত্তর) জন্য, বৃত্ত ব্যাসার্ধের 0.0003 ডিগ্রি সবচেয়ে ভাল কাজ করে এবং কিলোমিটারে রূপান্তরিত হওয়ার সময় আপনাকে অক্ষাংশ এবং দ্রাঘিমাংশ ডিগ্রিগুলির মধ্যে পার্থক্য তৈরি করতে হবে। আপনি এখানে আপনার অক্ষাংশের জন্য আনুমানিক রূপান্তরগুলি খুঁজে পেতে পারেন ।

var correctLocList = function (loclist) {
    var lng_radius = 0.0003,         // degrees of longitude separation
        lat_to_lng = 111.23 / 71.7,  // lat to long proportion in Warsaw
        angle = 0.5,                 // starting angle, in radians
        loclen = loclist.length,
        step = 2 * Math.PI / loclen,
        i,
        loc,
        lat_radius = lng_radius / lat_to_lng;
    for (i = 0; i < loclen; ++i) {
        loc = loclist[i];
        loc.lng = loc.lng + (Math.cos(angle) * lng_radius);
        loc.lat = loc.lat + (Math.sin(angle) * lat_radius);
        angle += step;
    }
};

1
ডিজিনএক্স, আমি কীভাবে কোনও কোড ছাড়াই আপনার কোডটিতে আপনার কোডটি প্রয়োগ করতে পারি তা জানার চেষ্টা করে শেষ 4 ঘন্টা ব্যয় করেছি। আমি এই সিদ্ধান্তে পৌঁছেছি যে আমি এটি স্তন্যপান করছি এবং সত্যিই আপনার সাহায্যের প্রশংসা করব। আমি এখানে কোডটি প্লাগ করার চেষ্টা করছি এখানে: পেস্টবিন.com / 5qYbvybm - যে কোনও সহায়তা প্রশংসা হবে! ধন্যবাদ!
WebMW

ওয়েবএমডাব্লু: আপনি এক্সএমএল থেকে চিহ্নিতকারীগুলি বের করার পরে আপনাকে প্রথমে সেগুলিকে তালিকাগুলিতে গোষ্ঠী করতে হবে যাতে প্রতিটি তালিকায় একই অবস্থানের দিকে চিহ্নিত করে চিহ্নিতকারী থাকে। তারপরে, প্রতিটি তালিকায় একের অধিক উপাদান রয়েছে, সঠিক লকলিস্ট () চালান। কেবলমাত্র আপনি এটি করার পরে, google.maps.Marker অবজেক্ট তৈরি করুন।
DzinX

তার কাজ করছে না .... এটা ঠিক আমার Lat জন্য longs পরিবর্তন 37.68625400000000000,-75.71669800000000000করতে 37.686254,-75.716698যা সব মান জন্য একই ... এম মত ... কিছু আশা 37.68625400000000000,-75.71669800000000000করতে 37.6862540000001234,-75.7166980000001234 37.6862540000005678,-75.7166980000005678তারতম্য.এটি .. আমি আমার কোণ পরিবর্তন চেষ্টা করে।
প্রেমশঙ্কর তিওয়ারি

হুম, আসুন আমরা একটু খনন করি এবং আশা করি @ ডিজিনএক্স এখনও এলাকায় রয়েছে। আপনি কীভাবে এই সমস্ত নম্বর পেয়েছেন তা আপনি (বা অন্য কেউ) সঙ্গম করতে পারেন? এলজি_রাডিয়াস ইত্যাদি? অনেক ধন্যবাদ. :)
Vae

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

11

@ ইগনিটিয়াস সবচেয়ে দুর্দান্ত উত্তর, মার্কারক্লসটিয়ারপ্লাসের v2.0.7 এর সাথে কাজ করার জন্য আপডেট হয়েছে।

  1. মার্কারক্লাস্টার ক্লাসে একটি প্রোটোটাইপ ক্লিক পদ্ধতি যুক্ত করুন, এর মতো - আমরা এটি পরে মানচিত্রের সূচনা () ফাংশনে ওভাররাইড করব:

    // BEGIN MODIFICATION (around line 715)
    MarkerClusterer.prototype.onClick = function() { 
        return true; 
    };
    // END MODIFICATION
  2. ক্লাস্টার আইকন ক্লাসে ক্লিক / ক্লাস্টার ক্লিক ক্লিকের পরে নিম্নলিখিত কোডটি যুক্ত করুন:

    // EXISTING CODE (around line 143)
    google.maps.event.trigger(mc, "click", cClusterIcon.cluster_);
    google.maps.event.trigger(mc, "clusterclick", cClusterIcon.cluster_); // deprecated name
    
    // BEGIN MODIFICATION
    var zoom = mc.getMap().getZoom();
    // Trying to pull this dynamically made the more zoomed in clusters not render
    // when then kind of made this useless. -NNC @ BNB
    // var maxZoom = mc.getMaxZoom();
    var maxZoom = 15;
    // if we have reached the maxZoom and there is more than 1 marker in this cluster
    // use our onClick method to popup a list of options
    if (zoom >= maxZoom && cClusterIcon.cluster_.markers_.length > 1) {
        return mc.onClick(cClusterIcon);
    }
    // END MODIFICATION
  3. তারপরে, আপনার আরম্ভ () ফাংশনে যেখানে আপনি মানচিত্রটি আরম্ভ করবেন এবং আপনার মার্কারক্লাস্টার অবজেক্টটি ঘোষণা করুন:

    markerCluster = new MarkerClusterer(map, markers);
    // onClick OVERRIDE
    markerCluster.onClick = function(clickedClusterIcon) { 
      return multiChoice(clickedClusterIcon.cluster_); 
    }

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

    function multiChoice(clickedCluster) {
      if (clickedCluster.getMarkers().length > 1)
      {
        // var markers = clickedCluster.getMarkers();
        // do something creative!
        return false;
      }
      return true;
    };

1
ধন্যবাদ, এটি পুরোপুরি কাজ করে! আপনার maxZoomইস্যু হিসাবে , আমি মনে করি এটি কেবলমাত্র একটি সমস্যা যদি ম্যাক্সজুম সেট না থাকে বা ক্লাস্টারের জন্য ম্যাক্সজুম মানচিত্রের জুমের চেয়ে বেশি হয়। আমি আপনার হার্ডকডযুক্ত এই স্নিপেটটি প্রতিস্থাপন করেছি এবং এটি দুর্দান্তভাবে কাজ করছে বলে মনে হচ্ছে:var maxZoom = mc.getMaxZoom(); if (null === maxZoom || maxZoom > mc.getMap().maxZoom) { maxZoom = mc.getMap().maxZoom; if (null === maxZoom) { maxZoom = 15; } }
পাস্কাল

আমি জানি এটি সত্যিই পুরানো, তবে আমি এই সমাধানটি ব্যবহার করার চেষ্টা করছি। আমার এটি কাজ করছে তবে ক্লাস্টারের ডেটা দিয়ে ইনফাইন্ডো দেখানোর ক্ষেত্রে ... আমি যে ক্লাস্টারের প্রথম স্থানে ক্লিক করা হয়েছিল তার মার্কার পজিশনটি কীভাবে পাব যাতে আমি ইনফাইন্ডোটি দেখাতে পারি? চিহ্নিতকারীরা আমার ডেটার অ্যারে ... তবে আমি কীভাবে ক্লাস্টার আইকন / চিহ্নিতকারীটিতে ইনফাইন্ডোটি প্রদর্শন করতে পারি?
ব্যবহারকারী 756659

@ ইউজার 756659 মাল্টিচয়েসে আপনি ল্যাট / এলএনজি এর মাধ্যমে পাবেন: clickedCluster.center_.lat()/clickedCluster.center_.lng()
জেনস কোহল

1
@ পাসল এবং কিছুটা দ্বিধাদ্বন্দ্বের সাথে আমরা এটাকে শেষ করি, যা কাজ করতে পারে, তবে পাইথনের তাও বলেছে। "পঠনযোগ্যতার গণনা"। var সর্বোচ্চ জুম = ম্যাথ.মিন (এমসি.জেটম্যাক্সজুম () || 15, এমসি.জেটম্যাপ ()। ম্যাকজুমম || 15);
Nande,

6

উপরের উত্তরগুলি আরও মার্জিত, তবে আমি একটি দ্রুত এবং নোংরা উপায় পেয়েছি যা সত্যই সত্যিই অবিশ্বাস্যভাবে ভাল কাজ করে। আপনি এটি www.buildinglit.comকর্মে দেখতে পারেন

আমি যা করেছি তা হ'ল আমার জেনেক্স.এম.এল.পি.পি. পৃষ্ঠায় অক্ষাংশ এবং দ্রাঘিমাংশে একটি এলোমেলো অফসেট যুক্ত করা হয়েছিল যাতে প্রতিবার যখন চিহ্নিতকারীদের সাথে মানচিত্র তৈরি হয় তখন অফসেট সহ এটি প্রতিবার কিছুটা ভিন্ন ফলাফল দেয়। এটি হ্যাকের মতো শোনাচ্ছে তবে বাস্তবে আপনার যদি চিহ্নিতকারীরা ওভারল্যাপিং করে থাকে তবে মানচিত্রে ক্লিকযোগ্য হয়ে ওঠার জন্য এলোমেলো দিকের দিকে কেবল একটি হালকা ঠোঁট সরিয়ে নেওয়া আপনার প্রয়োজন। এটি প্রকৃতপক্ষে খুব ভালভাবে কাজ করে, আমি মাকড়সা পদ্ধতির চেয়ে আরও ভাল বলব কারণ কে এই জটিলতা মোকাবেলা করতে এবং সর্বত্র তাদের বসন্ত কাটাতে চায়। আপনি কেবল চিহ্নিতকারী নির্বাচন করতে সক্ষম হতে চান। এলোমেলোভাবে এটিকে ধাক্কা দিয়ে নিখুঁতভাবে কাজ করে।

আমার php_genxML.php এ যখন বিবৃতি পুনরাবৃত্তি নোড তৈরির উদাহরণ রয়েছে

while ($row = @mysql_fetch_assoc($result)){ $offset = rand(0,1000)/10000000;
$offset2 = rand(0, 1000)/10000000;
$node = $dom->createElement("marker");
$newnode = $parnode->appendChild($node);
$newnode->setAttribute("name", $row['name']);
$newnode->setAttribute("address", $row['address']);
$newnode->setAttribute("lat", $row['lat'] + $offset);
$newnode->setAttribute("lng", $row['lng'] + $offset2);
$newnode->setAttribute("distance", $row['distance']);
$newnode->setAttribute("type", $row['type']);
$newnode->setAttribute("date", $row['date']);
$newnode->setAttribute("service", $row['service']);
$newnode->setAttribute("cost", $row['cost']);
$newnode->setAttribute("company", $company);

ল্যাট এবং লম্বার নীচে লক্ষ্য করুন + অফসেট রয়েছে। উপরের 2 ভেরিয়েবল থেকে। সবেমাত্র চিহ্নিতকারীকে ঘুরিয়ে দেওয়ার জন্য এলোমেলোভাবে যথেষ্ট ছোট এমন একটি দশমিক পাওয়ার জন্য আমাকে এলোমেলোভাবে 0,1000 দ্বারা 10000000 দ্বারা বিভক্ত করতে হয়েছিল। আপনার প্রয়োজনের জন্য আরও সুনির্দিষ্ট একটি পেতে সেই পরিবর্তনশীলটির সাথে নির্দ্বিধায় নির্দ্বিধায়।


শান্ত! এটিই নোংরা হ্যাক যা আমি খুব দরকারী বলে খুঁজে পেয়েছি, গুগল ম্যাপস এপিআই কোড দিয়ে
গন্ডগোল

3

একই ভবনে একাধিক পরিষেবা রয়েছে এমন পরিস্থিতিতে আপনি প্রকৃত বিন্দু থেকে ব্যাসার্ধের মধ্যে সামান্য কিছুটা (.001 ডিগ্রি দ্বারা বলুন) চিহ্নিতকারীদের অফসেট করতে পারবেন। এটিও একটি দুর্দান্ত ভিজ্যুয়াল এফেক্ট তৈরি করা উচিত।


3

ম্যাথু ফক্সের পরামর্শ অনুসারে এটি এবার জাভাস্ক্রিপ্ট ব্যবহার করে একটি দ্রুতগতির 'দ্রুত এবং নোংরা' সমাধান।

জাভাস্ক্রিপ্টে আপনি উভয় উদাহরণের জন্য একটি ছোট্ট এলোমেলো অফসেট যোগ করে আপনার সমস্ত অবস্থানের ল্যাট এবং লাস্টটি অফসেট করতে পারেন eg

myLocation[i].Latitude+ = (Math.random() / 25000)

(আমি দেখতে পেয়েছি 25000 দ্বারা বিভক্ত যথেষ্ট বিচ্ছেদ দেয় তবে চিহ্নিতকারীটিকে সঠিক অবস্থান থেকে উল্লেখযোগ্যভাবে স্থানান্তরিত করে না যেমন একটি নির্দিষ্ট ঠিকানা)

এটি একে অপরের থেকে অফসেট করার পক্ষে যুক্তিসঙ্গতভাবে ভাল কাজ করে তবে কেবল আপনি ঘনিষ্ঠভাবে জুম করার পরে। যখন জুম আউট হবে, তখনও এটি স্পষ্ট হবে না যে অবস্থানটির জন্য একাধিক বিকল্প রয়েছে।


1
আমি এই পছন্দ। আপনার যদি সঠিকভাবে প্রতিনিধি চিহ্নিতকারীগুলির প্রয়োজন না হয় তবে কেবল 25000 থেকে 250 বা 25 কে কম করুন Simple সহজ এবং দ্রুত সমাধান।
ফিড

2

পরীক্ষা করে দেখুন মার্কার Clusterer একদল মার্কার মধ্যে পয়েন্ট নিকটবর্তী এই লাইব্রেরি ক্লাস্টার - v3 এর জন্য। যখন ক্লাস্টারগুলি ক্লিক করা হয় তখন মানচিত্রটি জুম করে। আমি কল্পনা করতে পারি যে ঠিক যখন জুম করা হয়েছিল তখনও একই স্থানে চিহ্নিতকারীদের সাথে আপনার একই সমস্যা রয়েছে।


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

@ লুজয়েড মার্কার ক্লাস্টার সমস্যাটি কাটিয়ে উঠতে পারে নি আমি যেমনটি সন্ধান করেছি। আমার একই সমস্যা হচ্ছে, আমার এক ভবনের মধ্যে বেশ কয়েকটি সংস্থা রয়েছে এবং তাই এটি কেবল 1 টি চিহ্নিতকারী দেখায়।
রব

1

মার্কারক্লসটিয়ারপ্লাসের সাথে কাজ করার জন্য আপডেট হয়েছে।

  google.maps.event.trigger(mc, "click", cClusterIcon.cluster_);
  google.maps.event.trigger(mc, "clusterclick", cClusterIcon.cluster_); // deprecated name

  // BEGIN MODIFICATION
  var zoom = mc.getMap().getZoom();
  // Trying to pull this dynamically made the more zoomed in clusters not render
  // when then kind of made this useless. -NNC @ BNB
  // var maxZoom = mc.getMaxZoom();
  var maxZoom = 15;
  // if we have reached the maxZoom and there is more than 1 marker in this cluster
  // use our onClick method to popup a list of options
  if (zoom >= maxZoom && cClusterIcon.cluster_.markers_.length > 1) {
    var markers = cClusterIcon.cluster_.markers_;
    var a = 360.0 / markers.length;
    for (var i=0; i < markers.length; i++)
    {
        var pos = markers[i].getPosition();
        var newLat = pos.lat() + -.00004 * Math.cos((+a*i) / 180 * Math.PI);  // x
        var newLng = pos.lng() + -.00004 * Math.sin((+a*i) / 180 * Math.PI);  // Y
        var finalLatLng = new google.maps.LatLng(newLat,newLng);
        markers[i].setPosition(finalLatLng);
        markers[i].setMap(cClusterIcon.cluster_.map_);
    }
    cClusterIcon.hide();
    return ;
  }
  // END MODIFICATION

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

1

আমি সহজ সমাধান পছন্দ করি তাই এখানে আমার। পরিবর্তে lib পরিবর্তন, যা মেন্টেন করা কঠিন করে তুলবে। আপনি কেবল ইভেন্টটি দেখতে পারেন watch

google.maps.event.addListener(mc, "clusterclick", onClusterClick);

তারপরে আপনি এটি পরিচালনা করতে পারেন

function onClusterClick(cluster){
    var ms = cluster.getMarkers();

i, অর্থাত্, তালিকা সহ একটি প্যানেল দেখানোর জন্য বুটস্ট্র্যাপ ব্যবহার করা হয়। যা আমি "ভিড়যুক্ত" জায়গাগুলিতে মাকড়সা শিকারের চেয়ে অনেক বেশি সাবলীল এবং ব্যবহারযোগ্য বলে মনে করি। (আপনি যদি ক্লাস্টারের সম্ভাবনা ব্যবহার করছেন তবে আপনি মাকড়সা করার পরে সংঘর্ষের সাথে শেষ হবেন)। আপনি সেখানে জুমও পরীক্ষা করতে পারেন।

BTW। আমি শুধু, লিফলেট পাওয়া গেছে এবং এটা কাজ অনেক ভালো বলে মনে হয় ক্লাস্টার ও spiderfy কাজ খুব fluidly http://leaflet.github.io/Leaflet.markercluster/example/marker-clustering-realworld.10000.html এবং এটি ওপেন সোর্স আছে।


0

এটি দেখুন: https://github.com/plank/MarkerClusterer

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

এটি এখানে কীভাবে কাজ করে তা আপনি দেখতে পারেন: http : //cल्র্চডস.সিএ / en / 2013- কার্যকরতা


0

উপরের উত্তরগুলিতে প্রসারিত করার জন্য, মানচিত্র অবজেক্টটি আরম্ভ করার সময় সর্বাধিক জুম বিকল্পটি সেট করার বিষয়টি নিশ্চিত করুন।


0

অফসেট দেওয়া যখন ব্যবহারকারীরা সর্বাধিকের সাথে জুম বাড়ায় তখন চিহ্নিতকারীদের দূরত্বে পরিণত করে। সুতরাং আমি এটি অর্জনের জন্য একটি উপায় খুঁজে পেয়েছি। এটি সঠিক উপায় নাও হতে পারে তবে এটি খুব ভালভাবে কাজ করেছে।

// This code is in swift
for loop markers
{
//create marker
let mapMarker = GMSMarker()
mapMarker.groundAnchor = CGPosition(0.5, 0.5)
mapMarker.position = //set the CLLocation
//instead of setting marker.icon set the iconView
let image:UIIMage = UIIMage:init(named:"filename")
let imageView:UIImageView = UIImageView.init(frame:rect(0,0, ((image.width/2 * markerIndex) + image.width), image.height))
imageView.contentMode = .Right
imageView.image = image
mapMarker.iconView = imageView
mapMarker.map = mapView
}

চিহ্নিতকারীটির zIndex সেট করুন যাতে আপনি চিহ্নিতকরণের আইকনটি দেখতে পাবেন যা আপনি উপরে দেখতে চান, অন্যথায় এটি অটো অদলবদলের মতো চিহ্নিতকারীকে অ্যানিমেটেড করবে। যখন ব্যবহারকারী টোকা দিয়ে চিহ্নিতকারীটিকে zIndex অদলবদল করে শীর্ষে মার্ক আনতে zIndex হ্যান্ডেল করে।


0

কীভাবে এটি দিয়ে পালানো যায় .. [সুইফ্ট]

    var clusterArray = [String]()
    var pinOffSet : Double = 0
    var pinLat = yourLat
    var pinLong = yourLong
    var location = pinLat + pinLong

একটি নতুন চিহ্নিতকারী তৈরি হতে চলেছে? clusterArrayএটি অফসেট পরীক্ষা করে দেখুন

 if(!clusterArray.contains(location)){
        clusterArray.append(location)
    } else {

        pinOffSet += 1
        let offWithIt = 0.00025 // reasonable offset with zoomLvl(14-16)
        switch pinOffSet {
        case 1 : pinLong = pinLong + offWithIt ; pinLat = pinLat + offWithIt
        case 2 : pinLong = pinLong + offWithIt ; pinLat = pinLat - offWithIt
        case 3 : pinLong = pinLong - offWithIt ; pinLat = pinLat - offWithIt
        case 4 : pinLong = pinLong - offWithIt ; pinLat = pinLat + offWithIt
        default : print(1)
        }


    }

ফলাফল

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


0

ম্যাথু ফক্সের স্নিগ্ধ প্রতিভা উত্তর যুক্ত করে, চিহ্নিতকারী অবজেক্টটি সেট করার সময় আমি প্রতিটি ল্যাট এবং এলএনজিতে একটি ছোট র্যান্ডম অফসেট যুক্ত করেছি। উদাহরণ স্বরূপ:

new LatLng(getLat()+getMarkerOffset(), getLng()+getMarkerOffset()),

private static double getMarkerOffset(){
    //add tiny random offset to keep markers from dropping on top of themselves
    double offset =Math.random()/4000;
    boolean isEven = ((int)(offset *400000)) %2 ==0;
    if (isEven) return  offset;
    else        return -offset;
}

-2

উপরের উত্তরগুলি প্রসারিত করার সময়, আপনি যখন স্ট্রিংগুলিতে যোগদান করেছেন, যোগ / বিয়োগকৃত অবস্থান (উদাহরণস্বরূপ "37.12340-0.00069" নয়), আপনার মূল অক্ষাংশ / দ্রাঘিমাংশকে ফ্লোটে রূপান্তর করুন, যেমন পার্সফ্লোট () ব্যবহার করে, তারপর সংশোধন যোগ করুন বা বিয়োগ করুন।

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