【问题标题】:Accessing ExtendedData information via Google Maps API v3通过 Google Maps API v3 访问 ExtendedData 信息
【发布时间】:2011-06-02 11:08:47
【问题描述】:

我有一个 KML 文件,它在每个 <Placemark> 节点中包含一个 <ExtendedData> 节点,然后是一些带有键/值对的 <Data> 节点。我遵循了以下示例:http://code.google.com/apis/kml/documentation/extendeddata.htmlcode.google.com/apis/kml/documentation/ kmleelementsinmaps.html 建议地图确实支持 KML ExtendedData 节点(尽管部分支持),但我找不到通过 javascript 访问 ExtendedData 对象的方法。我正在使用:

google.maps.event.addListener(agency_layer, 'click', function(kmlEvent) {
  console.debug( kmlEvent );
}

(其中 Agency_layer 是 KML 对象)。 kmlEvent 包含所有 KML 特征数据,但不包含扩展数据,我正在摸不着头脑。我想让我的 KML 在语义上合理,而不是在描述中加载更多数据并稍后使用 javascript 对其进行解析。

有没有人有类似的经历,或者知道如何通过 Google Maps API v3 访问 ExtendedData 节点?

【问题讨论】:

    标签: javascript google-maps kml


    【解决方案1】:

    我一直在寻找完全相同的东西。我根据here找到的信息构建了一个jQuery解决方案。

    由于 jQuery 可以轻松解析 xml,而且 kml 是 xml,所以效果很好。这是我写的函数。

    function extendedDataToArray(feature)
    {
        var returnArray = new Array();
        $(feature.getKml()).find("Data").each(function()
        {
            returnArray[$(this).attr("name")] = $(this).find("value").text();
        }
        );
        return returnArray;
    }
    

    该函数返回一个关联数组,其中键等于数据元素的名称,值作为值标签的内容。希望这会有所帮助!

    【讨论】:

    • 感谢使用 JQuery 解析 KML 的建议,问题是通过 Google Maps API 加载时,ExtendedData 节点被剥离,所以我什至看不到该数据。我最终直接访问 KML(与此类似)并手动删除每个引脚,而不是使用 Google Maps API 中的 KML 功能:(
    • 这真的很不幸:/。我正在使用 Google Earth API,到目前为止,它为每个 Placemark 保留了完整的 kml。
    • +1 顺便说一下,JavaScript 没有关联数组。您应该将returnArray 声明为对象{}
    【解决方案2】:

    另一种解决方案可能是在需要使用时在地标描述和预处理描述中传递数据。

    /*
    <Placemark>
        <name></name>
        <description><![CDATA[
        Lorem Ipsum  [data]{"datakey":524}[/data]
        ]]>
        </description>
        <Point>
            <coordinates>COORDINATES</coordinates>
        </Point>
    </Placemark>
    */
       var map_overlay = new google.maps.KmlLayer(
            'URL_TO_KML_FILE',
            {
                'suppressInfoWindows': true
            }
        );
        map_overlay.setMap( gmap );
    
        var placemarkInfo = new google.maps.InfoWindow();
        google.maps.event.addListener(map_overlay, 'click', function (kmlEvent) {
    
            var text_to_process = kmlEvent.featureData.description,
            matches = text_to_process.match(/\[data\](.*)\[\/data\]/),
            json_data_string = matches[1],
            json_data = JSON.parse(json_data_string),
            real_description = text_to_process.split('[data]')[0];
    
            alert(json_data.datakey);
    
            placemarkInfo.setContent( real_description );
            placemarkInfo.setPosition(kmlEvent.latLng);
            placemarkInfo.open(gmap);
    
        });
    

    【讨论】:

      【解决方案3】:

      我也在寻找同样的东西。您可以使用kmlEvent 对象上的JSON.stringify() 函数查看正在返回的数据:

      alert(JSON.stringify(kmlEvent));    
      

      ExtendedData 节点根据KML Elements Supported in Google Maps 页面得到部分支持,但我还没有弄清楚如何正确使用它们。

      【讨论】:

      • 是的,它说 ExtendedData 支持“仅无类型的 ”,但我似乎无法在对象中找到它。
      【解决方案4】:

      某些数据已从 ExtendedData 中删除,但如果您信任 KML 的来源,则可以使用 getBalloonHtml()getBalloonHtmlUnsafe()。请参阅“https://developers.google.com/kml/documentation/extendeddata”以供参考。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-03
        • 2012-07-25
        • 1970-01-01
        • 1970-01-01
        • 2016-11-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多