Googleマップに2000マーカーを読み込む際のパフォーマンスの問題が残っています。この質問は概要ですが、多くの場所で見つけることができますが、それでも私の問題を理解することはできません。GoogleマップJS API V3複数のマーカーレンダリング
したがって、短くて問題があります: Googleマップの初期化でブラウザが10-20秒間ぶら下がっています。
設定:バックエンドからのデータを単一のget要求で受信し
- マーカー。 0.3秒でロードされる。
- マーカー・クラスタリング(https://googlemaps.github.io/js-marker-clusterer/docs/examples.html)ライブラリーが使用される。 しかし、それがあってもなくても、ブラウザはまだ同じ時間にぶら下がっています。
- マーカーは豊富です。カスタム写真、情報ウィンドウ、イベントなどがあります。
- 情報ウィンドウはAngularJSディレクティブとして
マーカーセットアップコード設定されています
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);
}
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
が、私は取得した後これはconsole.outで、ブラウザは10〜20秒ほど掛かっていますマーカー付き地図を表示しています。
更新:問題は、AngularJSバインディング処理(インフォ・イン・ディレクティブ)にあります。どのようにそれに対処する任意のアイデア?
私は、これは、角度のパフォーマンスの問題の一つだと思います。私は2000マーカーが2000以上のバインディングを意味すると仮定しています。これにより、角度にパフォーマンスの影響があります。あなたは100のマーカーで試しましたか?まだ時間がかかりますか? – gaurav5430
100個のマーカーがある場合は、 – user1935987
となります。多くの場合、これらの多くのバインディングでは角膜のパフォーマンス上の問題があります(コードのチェックポイントをクロムデバッガで保持できることを確認してください)。バインディングの意味は、すべてのダイジェストループで2000時計を確認する必要があります – gaurav5430