我有一个google-maps mashup,与“小”测试文件相当不错 - 我生成的每个文件,即使是60英里的行程,都不到16k。
然后,昨天,用户向我发送了一个他们遇到问题的KML文件 - 它的大小超过360k,虽然它上传正常,但当我调用GGeoXML()时,它似乎可以加载到谷歌地图中,但是没有地图出现,并且日志中出现错误“脚本错误。(main.js,0)”。这种情况在我自己的应用程序中发生,如果我尝试将kml文件提供给Google的“Code Playground” - 但该文件在Google Earth中正常加载。如果我将文件从Google Earth重新保存为kmz格式,那也可以 - 但由于该文件不再是XML,我丢失了mashup的一些“附加值”功能。
我已经扫描了Google文档,但是我找不到任何有关kml文件的最大文件大小的引用。
有什么建议吗?
这是导致Code Playground中出现问题的代码片段:
var map;
function zoomToGeoXML(geoXml) {
var center = geoXml.getDefaultCenter();
var span = geoXml.getDefaultSpan();
var sw = new GLatLng(center.lat() - span.lat() / 2,
center.lng() - span.lng() / 2);
var ne = new GLatLng(center.lat() + span.lat() / 2,
center.lng() + span.lng() / 2);
var bounds = new GLatLngBounds(sw, ne);
map.setCenter(center);
map.setZoom(map.getBoundsZoomLevel(bounds));
}
function initialize() {
if (GBrowserIsCompatible()) {
map = new GMap2(document.getElementById("map_canvas"));
var geoXml = new GGeoXml("http://(my base url)/files/gps/expr.kml",
function() { zoomToGeoXML(geoXml); });
map.addOverlay(geoXml);
}
}
答案 0 :(得分:2)
事实证明,真正的问题不是文件大小,而是片段
map = new GMap2(document.getElementById("map_canvas"));
var geoXml = new GGeoXml("http://(my base url)/files/gps/expr.kml",
function() { zoomToGeoXML(geoXml); });
map.addOverlay(geoXml);
根据Google Map文档,您必须在构建新地图后立即调用setCenter()。我没有这样做,因为zoomToGeoXML()会这样做。
不幸的是,这显然在谷歌地图代码中设置了竞争条件。将代码更改为:
map = new GMap2(document.getElementById("map_canvas"));
map.setCenter(new GLatLng(0,0));
var geoXml = new GGeoXml("http://(my base url)/files/gps/expr.kml",
function() { zoomToGeoXML(geoXml); });
map.addOverlay(geoXml);
显然正确地解决了这个问题。但是,它具有副作用,即在放大到kml文件定义的区域之前,地图最初将属于整个地球。
答案 1 :(得分:2)
如果你从Mike的例子中重新排列几行,你就可以摆脱“在放大到kml文件定义的区域之前地图最初将是整个地球的副作用。”
var map;
function loadMapAndZoomToGeoXML(geoXml) {
center = geoXml.getDefaultCenter();
var span = geoXml.getDefaultSpan();
var sw = new GLatLng(center.lat() - span.lat() / 2, center.lng() - span.lng() / 2);
var ne = new GLatLng(center.lat() + span.lat() / 2, center.lng() + span.lng() / 2);
var bounds = new GLatLngBounds(sw, ne);
map = new GMap2(document.getElementById("map_canvas"));
map.setCenter(center);
map.setZoom(KmlMap.getBoundsZoomLevel(bounds));
map.addOverlay(geoXml);
map.enableScrollWheelZoom();
map.setUIToDefault();
map.addControl(new GLargeMapControl());
}
function initialize() {
if (GBrowserIsCompatible()) {
var geoXml = new GGeoXml("http://(my base url)/files/gps/expr.kml", function() { loadMapAndZoomToGeoXML(geoXml); });
}
}
不幸的是,它将加载地图的过程与缩放和中心化相关联,但这可以进一步重构。我想尽可能坚持迈克给出的榜样。
答案 2 :(得分:1)
在Rafe的代码中更改此内容:
map.setZoom(KmlMap.getBoundsZoomLevel(bounds));
到此
map.setZoom(map.getBoundsZoomLevel(bounds));
答案 3 :(得分:0)
看起来GGeoXml的大小限制为3MB,因此KML文件本身可能存在问题。
见Pamela的帖子here。