29

Google Haritalar ile büyük miktarlarda işaretleyicileri işleyebilen bir harita oluşturmak istiyorum (10.000'in üzerinde). Haritayı yavaşlatmamak için, sadece mevcut görünümün içinde bulunan işaretleyicileri çıkaran bir XML dosyası oluşturdum.Google Maps V3: Yalnızca görünüm işaretleyicileri göster - İşaretçileri temizle

Birincisi, harita seçenekleri kurulum için) (başlatmak kullanın: Olay 'tilesloaded' bittiğinde

function initialize() { 
    var myLatlng = new google.maps.LatLng(51.25503952021694,3.27392578125); 
    var myOptions = { 
     zoom: 8, 
     center: myLatlng, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    } 
    var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 

    google.maps.event.addListener(map, 'tilesloaded', function() { 
    loadMapFromCurrentBounds(map); 
    }); 
} 

, ben loadMapFromCurrentBounds(), bu fonksiyonlar akım sınırları alacak kullanmak ve bir istek gönderir Bu artık de görünümdeki olmayan harika, ancak, geçerli kod boşaltması değil işaretleri çalışıyor

function loadMapFromCurrentBounds(map) { 

    // First, determine the map bounds 
    var bounds = map.getBounds(); 

    // Then the points 
    var swPoint = bounds.getSouthWest(); 
    var nePoint = bounds.getNorthEast(); 

    // Now, each individual coordinate 
    var swLat = swPoint.lat(); 
    var swLng = swPoint.lng(); 
    var neLat = nePoint.lat(); 
    var neLng = nePoint.lng(); 

    downloadUrl("mapsxml.php?swLat="+swLat+"&swLng="+swLng+"&neLat="+neLat+"&neLng="+neLng+"", function(data) { 
     var xml = parseXml(data); 
     var markers = xml.documentElement.getElementsByTagName("marker"); 
     var infoWindow = new google.maps.InfoWindow; 

     for (var i = 0; i < markers.length; i++) { 
      var address = markers[i].getAttribute("address"); 
      var type = markers[i].getAttribute("type"); 
      var name = markers[i].getAttribute("name"); 

      var point = new google.maps.LatLng( 
      parseFloat(markers[i].getAttribute("lat")), 
      parseFloat(markers[i].getAttribute("lng")) 
      ); 

      var html = "<b>" + name + "</b> <br/>" + address; 
      var icon = customIcons[type] || {}; 

      var marker = new google.maps.Marker({ 
      map: map, 
      position: point, 
      icon: icon.icon, 
      shadow: icon.shadow}); 

      bindInfoWindow(marker, map, infoWindow, html); 
     } 
    }) 
} 

: XML dosyasına geçerli görünümdeki içerde işaretleri göstermeye. Bunun yanı sıra, halihazırda yüklenmiş olan, yine haritayı aynı alanda bir görünüm sürerken haritayı hızlı bir şekilde yavaşlatan işaretleyicileri yeniden yükler.

Görüntüleme görünümü değiştiğinde, yeni işaretçileri yüklemeden önce tüm haritayı temizlemeyi seviyorum. Bunu yapmanın en iyi yolu nedir?

+0

@jeff Hey düzenlemeler için teşekkürler! Ben sadece 'JavaScript' etiketini ekleyerek, soruların cevaplarını * hepsine * vurgulamak için etiketlerin sağında görünen "etiketleri düzenle" bağlantısını kullanarak gerçekten bir sözdizimi vurgulayabileceğinizi bildirmek istedim. İyi şanslar! :) – jmort253

+0

[Marker Clusterer] (https://code.google.com/p/google-maps-utility-library-v3/wiki/Libraries) çok fazla markörle çalışırken yararlı olabilir. – Blazemonger

+1

map.getBounds(). ToUrlValue(). Split (',') 'yaparak köşeleriniz için güzel bir diziye sahip olabilirsiniz. – tim

cevap

15

Haritaya başka Etkinlik İşleyici'yi eklemem gerekiyor:

google.maps.event.addListener(map,'bounds_changed', removeMarkers); 

google haritadan tüm işaretleri kaldırma konusunda daha fazla bilgi için here bakın - ne yazık ki bu bir çağrı ile yapılabilir sanmıyorum. Yani şöyle tek tek kaldırarak haritadaki tüm belirteçler arasında yineleme zorunda kalacak removeMarkers veya benzeri şeyler yazmak zorunda kalacak:

markersArray[i].setMap(null); 

Ben işaretleyici olup olmadığını kontrol etmek hızlıdır olup olmadığını bilmiyorum görünümdeki kullanarak çıkarmadan önce:

map.getBounds(); 

Read more about Google Map API v3 events

+0

Cevabınız için teşekkürler! Neden 'bounds_changed' kullanmalıyım? Şu anda kullanıyorum Olay Dinleyici ('Tilesloaded') aynı görünüyor, her zaman viewport loadMapFromCurrentBounds() işlevini değiştirir. İşaretçileri denedimArray [i] .setMap (null); ama işe yaramıyor. Bunun yanı sıra, artık sadece viewport'ta olmayan işaretleyicileri temizlediğim çözümleri beğeniyorum ... Bu akşam daha sonra bir örnek yüklemeyi deneyeceğim! – Thijs

+2

ayrıca, haritayı biraz hareket ettiriyorsanız karo döşenmeyebilir, yani hareketiniz görünüm kutusuna yeni bir döşemenin yüklenmesine neden olmazsa – tim

6

Bu konu kontrol etmek isteyebilir. Daniel bunu çok güzel yanıtladı. bounds_changed Ayrıca

What's the most efficient way to create routes on google maps from gps files?

, sizin işlevi çağırmak için ilk fırsattır. tilesloaded, sürekli çağrılacak. Görünüm, görünüm alanını doldurmak için birden fazla döşemeye sahip olabilir.

Alternatif olarak, ayrıca bir SetVisible (false) de yapabilirsiniz.

İşaretleyiciyi kaldırmak için dinleyicileri kaldırmanız gerekebilir.

google.maps.event.clearInstanceListeners(marker); 
marker.setMap(null); 
markers.remove(marker); 
delete marker; 
4

Bu makale oldukça güzel içinden geçiyor: biz zaten sonra

  • eklenmiştir belirteçlerin bir hashtable tutmak bir eşik
  • ulaşana kadar Dynamically loading thousands of markers in Google Maps

    • dinamik işaretleri yüklemek eşiğe ulaşıldı, şu anda görüntüleme noktasında olmayan işaretçileri kaldırın
    • kullanıcı uzaklaştırdınız zaman haritadan tüm işaretleri kaldırmak ve kullanıcı makul bir seviyeye
  • +1

    Link artık işe yaramaz. –

    +3

    Bu bağlantıyı http://xyzzyb.tumblr.com/post/10317033064/dynamically-loading-thousands-of-markers-in-google-maps adresinden deneyin. – webjunkie

    1

    Orijinal fonksiyon kodunun çok gibi görünüyor geri yakınlaştırır kadar herhangi bir işaretçileri yüklemeyin. Sen Google bu belgeleri kontrol etmek isteyebilirsiniz

    if(map.getBounds().contains(markers[i].getPosition())) { 
        myMarkerDisplayFunction(markers[i]); 
    } 
    
    0

    : Böyle bir şey yapardım.

    With the new list of markers you can remove the current markers 
    (marker.setMap(null)) that are on the map and 
    add the new ones (marker.setMap(map)). 
    
    5

    nedeniyle aşağıdaki açıklama 'tilesloaded' kullanarak ya da 'bounds_changed' çok yanlış ve isteksiz sürekli işten çıkarmaları neden olur: Bu gerektiğini açıklar. Bunun yerine, kullanıcının kaydırma/yakınlaştırma işlemini durdurduğunda tetiklenecek 'boşta' etkinliğini kullanmak istersiniz.

    google.maps.event.addListener (harita, 'boşta', loadMapFromCurrentBounds);

    https://developers.google.com/maps/articles/toomanymarkers#viewportmarkermanagement

    İlgili konular