Ich bin mit dem Performance-Problem fest, das Laden von 2000 Markierungen auf Google-Karte. Diese Frage ist eine Übersicht kann an vielen Orten gefunden werden, aber immer noch, kann das Problem für mich nicht herausfinden.Google Maps JS API V3 mehrere Marker Rendering
So, das Problem in Kürze: Google Map-Initialisierung hängt den Browser für 10-20 Sekunden.
Rahmen:
- Die Marker Daten aus Back-End empfangen in einem einzigen get Anfrage. geladen in 0.3 sec
- Marker Clusterer (https://googlemaps.github.io/js-marker-clusterer/docs/examples.html) Bibliothek wird verwendet. Allerdings mit oder ohne der Browser immer noch die gleiche Zeit hängen.
- Die Marker sind reich. mit benutzerdefinierten Bildern, Infofenstern und Ereignissen.
- Infofenster wird als AngularJS Richtlinie Einrichtung
Marker Setup-Code:
function showMarkers(scope,data) {
var locations = data;
console.log("Starting markers setup: ", new Date());
for(var i = 0; i < locations.length; i++) {
var MarkerImage = '/img/reasestate.png';
markers[i] = new google.maps.Marker({
position: {lat:locations[i].latitude, lng:locations[i].longtitude},
map: map,
id: locations[i].id,
icon: MarkerImage
});
var infowindow = new google.maps.InfoWindow();
var contentString = '<infowindow></infowindow>';
var compiled = $compile(contentString)(scope);
google.maps.event.addListener(markers[i], 'click', (function(i, scope) {
return function(){
scope.placeInfo = null;
//for search around
scope.condo_LatLng = new google.maps.LatLng(locations[i].latitude,locations[i].longtitude);
//update scope
scope.$apply();
//////////////////
///INFOWINDOW SETUP
///////////////////
//you can change url to your url . '/maps/api/getcondo?CondoID='+scope.place.id'
$http.get('/maps/api/condo/items?CondoID='+locations[i].id).then(function(success) {
//a bit of additional received data processing, not important.
}, function(error) {
}).finally(function() {})
};
})(i, scope, locations[i]));
}
setClustering(markers);
console.log("Finished markers setup: ", new Date());
/////////////
///context menu
////////////
var menuStyle = {
menu: 'context_menu'
//menuSeparator: 'context_menu_separator',
//menuItem: 'context_menu_item'
};
var contextMenuOptions = {
classNames: menuStyle,
menuItems: [
{ label:'Add your condo...', id:'menu_option1',
className: 'menu_item', eventName:'option1_clicked' },
{ label:'Exit', id:'menu_option2',
className: 'menu_item', eventName:'option2_clicked' }
],
pixelOffset: new google.maps.Point(10, -5),
zIndex: 5
};
var contextMenu = new ContextMenu(map, contextMenuOptions);
google.maps.event.addListener(contextMenu, 'menu_item_selected',
function(latLng, eventName, source){
switch(eventName){
case 'option1_clicked':
createDraggableMarker(latLng);
break;
case 'option2_clicked':
// do something else
break;
default: break;
}
});
google.maps.event.addListener(map, 'rightclick', function(mouseEvent) {
contextMenu.show(mouseEvent.latLng, map);
});
}
function setClustering(markers){
var mcOptions = {gridSize: 150};
mc = new MarkerClusterer(map,markers, mcOptions);
}
das Erste auf Console.Out:
Starting markers setup: Sun Jun 19 2016 16:43:57
jsAllMain.js:240 Finished markers setup: Sun Jun 19 2016 16:43:57
jsAllMain.js:256 Show markers method done at: Sun Jun 19 2016 16:43:57
jsAllMain.js:256 Initialize searchmap done at: Sun Jun 19 2016 16:43:57
aber nachdem ich bekommen das in console.out, hängt der Browser wie 10-20 Sekunden mehr unti l Es zeigt die Karte mit Markern.
UPDATE: Das Problem ist mit AngularJS Bindungen Verarbeitung (Infowindow Richtlinie). Irgendeine Idee, wie man damit umgeht?
Ich denke, das ist eines der Leistungsprobleme von eckigen. Ich gehe davon aus, 2000 Markern bedeutet mehr als 2000 Bindungen, und dies wird Winkel Auswirkungen auf die Leistung haben. Hast du es mit 100 Markern versucht, dauert es noch Zeit? – gaurav5430
mit 100 Markern ist es in Ordnung – user1935987
dann ist es sicherlich angular Leistungsproblem für diese vielen Bindungen, wenn Sie überprüfen möchten, können Sie Checkpoints in Ihrem Code (in Chrom-Debugger) und sehen, wie lange ist der Winkel Code ausgeführt, weil 2000 Bindungen bedeuten, es müsste für 2000 Uhren in jeder Digest-Schleife zu überprüfen – gaurav5430