我有一个应用程序允许用户在地图上绘制形状(折线)并将它们与一些元数据(名称,描述等)一起保存到数据库(通过AJAX)。我最近移植了代码以使用GMap APIv3而不是v2。它看起来工作得很好,但是在过去的几周里,当用户有很多形状(~20个)有很多点(每个形状80-200个)时,我注意到了一些可怕的性能问题。
一个用户的地图导致浏览器冻结(IE9和最新的Chrome)都很糟糕。当应用程序使用v2 GMap并且我无法确认v3是否总是这样时,这种情况从未发生过。我正在使用blitz-gmap(https://code.google.com/p/blitz-gmap-editor/)来处理绘图元素和以下代码来解析KML并创建叠加层。我使用叠加来引用另一个div中的形状来隐藏和删除。我还可以为KML提供冻结应用程序的原因,但它在Google Earth和GMap4(http://www.mappingsupport.com/p/gmap4.php)中都可以正常加载。我做了一些公然草率的事情吗?
编辑:这是导致问题的KML ...... http://pastebin.com/ksB6zAun即使在我删除了4个最大的形状(海岸线形状)之后,它仍然会冻结浏览器。
this.setMapFromKML = function (kmlString) {
if (kmlString.length == 0) {
return false;
}
if (typeof geoXML3 == "undefined") { // check for include of geoxml3 parser
// http://code.google.com/p/geoxml3/
alert("geoxml3.js not included");
return;
}
if (!geoXml)
geoXml = new geoXML3.parser({
map:mapObj,
zoom:false,
suppressInfoWindows:true
});
geoXml.parseKmlString(kmlString);
var tmpOverlay, ovrOptions;
for (var m = 0; m < geoXml.docs[0].placemarks.length; m++) {
if (geoXml.docs[0].placemarks[m].Polygon) {
tmpOverlay = geoXml.docs[0].placemarks[m].polygon;
if (isEditable) {
tmpOverlay.setEditable(true);
}
tmpOverlay.type = "polyline";
} else if (geoXml.docs[0].placemarks[m].LineString) {
tmpOverlay = geoXml.docs[0].placemarks[m].polyline;
if (isEditable) {
tmpOverlay.setEditable(true);
}
tmpOverlay.type = "polyline";
} else if (geoXml.docs[0].placemarks[m].Point) {
tmpOverlay = geoXml.docs[0].placemarks[m].marker;
tmpOverlay.type = "marker";
}
var uniqueid = uniqid();
tmpOverlay.uniqueid = uniqueid;
if (geoXml.docs[0].placemarks[m].id) {
tmpOverlay.id = geoXml.docs[0].placemarks[m].id;
} else {
tmpOverlay.id = -1;
}
if (geoXml.docs[0].placemarks[m].name) {
tmpOverlay.title = geoXml.docs[0].placemarks[m].name;
} else {
tmpOverlay.title = "";
}
if (geoXml.docs[0].placemarks[m].description) {
tmpOverlay.content = geoXml.docs[0].placemarks[m].description;
} else {
tmpOverlay.content = "";
}
//attach the click listener to the overlay
AttachClickListener(tmpOverlay);
//save the overlay in the array
mapOverlays.push(tmpOverlay);
}
mapObj.fitBounds(geoXml.docs[0].bounds); //adjust map to show all filters
}
答案 0 :(得分:2)
使所有折线可编辑(每个顶点都有一个可拖动的标记)会有显着的性能损失。只允许编辑那些实际需要更改的折线(可能一次只能改变一条),并使它们默认为不可编辑。