程序生成的KML文件验证,但不起作用

时间:2014-11-14 15:42:44

标签: google-maps google-maps-api-3

我有一个通常与谷歌地图合作的同事,现在我正在制作我的第一张地图。我正在使用他们过去开发的东西并根据我的需要进行更改。他们创建了一个脚本来设置一些地图默认值,这就是为什么事情可能会略有不同。

var map = new Map();
map.loadMap();
var kml = new google.maps.KmlLayer({ url: 'http://api.mankatomn.gov/api/engineeringprojectskml', suppressInfoWindows: true });
kml.setMap(map.map);

地图加载。我的KML文件无法加载。我在控制台中没有出现任何错误。当我用不同的网址http://www.mankato-mn.gov/Maps/StreetConstruction/streetconstruction.ashx?id=122替换网址时,它会正常工作。我的新Feed确实有效。我的网络服务有问题吗?

更新:几天后,我仍然遇到了这个问题。所以我很确定这不再是DNS问题了。我创建了一个jsFiddle来查看它是否是我的代码或其他内容。我从Google's sample code开始,将KML文件的URL更改为我的Web服务和生成文件的静态版本。这两个are valid个KML文件。都没有工作。如果出现语法错误,API是否会报告?

2 个答案:

答案 0 :(得分:1)

您可以使用

获取KML图层的状态
kml.getStatus();

在这种情况下返回:

"INVALID_DOCUMENT"

现在,如果我从浏览器请求您的网址,我会

<Error>
   <Message>An error has occurred.</Message>
</Error>

所以似乎那里有一个有效的KML,它已经不存在了。假设从你的问题我可以猜测它超过了重量限制,或者你没有将它与有效的地图实例相关联。

要让getStatus返回有用的内容,您必须等待Google Maps API尝试加载您声明的KML图层。例如,您可以在status_changed事件上添加侦听器。

var kmloptions={ 
    url: 'https://dl.dropboxusercontent.com/u/2732434/engineeringprojectskml.kml',     
    suppressInfoWindows: true 
};
var newKml = new google.maps.KmlLayer(kmloptions);
newKml.setMap(map);

google.maps.event.addListenerOnce(newKml, 'status_changed', function () {
    console.log('KML status is', newKml.getStatus());
});

在这种情况下(请注意我使用您在jsFiddle中使用的替代网址),我仍然会收到无效文档。

更新:问题似乎是文件的编码(UTF-16 BE意味着是二进制)。我将它转换为utf-8并重新缩进(it's in my public dropbox now

enter image description here

答案 1 :(得分:0)

您可以通过以下方式检查DNS是否已设置:

  1. 转到浏览器中的网址。在缓存清空和历史记录的情况下执行此操作(私有模式最佳)。如果它最终在您的服务器和正确的文件,它不是DNS问题。
  2. 将文件移动到您确定可以访问的位置,而不会出现任何DNS问题。例如http://www.mankato-mn.gov/Maps/StreetConstruction/engineeringprojectskml
  3. 如果问题仍然存在,请确保您的KML语法和Javascript 100%正确。如果您还有任何问题,请查看https://developers.google.com/maps/documentation/javascript/examples/layer-kml