2013-10-03 36 views
1

擴展數據我有一個KML地標,看起來像這樣提取KML使用Javascript

<Placemark> 
<id>test345</id> 
<name>Images from KML file</name> 
<ExtendedData> 
<Data name="type"> 
    <value>images</value> 
</Data> 
</ExtendedData> 
<Point> 
    <coordinates>-122.448425,37.802907,0</coordinates> 
</Point> 

我試圖提取ExtendedData信息出這個位置的作法上的click事件:

google.earth.addEventListener(kmlObject, 'click', function(event) { 
    event.preventDefault(); 
    var kmlPlacemark = event.getTarget(); 
}); 

另一種解決方案是從kmlPlacemarker獲取kmlObject,有什麼想法?

回答

1

鑑於地標,Google地球API提供了兩種訪問ExtendedData元素的方法。

  • getBalloonHtml()
  • getBalloonHtmlUnsafe可()

API參考:
https://developers.google.com/earth/documentation/reference/interface_kml_feature

您可以在谷歌代碼遊樂場在這裏找到工作的例子:
https://code.google.com/apis/ajax/playground/?exp=earth#extended_data_in_balloons

如果你想要獲取擴展數據的原始KML,則可以獲取KML表示並將其解析爲XML文檔。

var output = placemark.getKml(); 
+0

完美,我把這些數據轉換成地圖的唯一方法就是寫一個解析函數? 但是,感謝給我一個出發點,正是我需要的! – UltraLord

0

只是說我貼一下只是對插件的支持論壇這個問題:https://code.google.com/p/earth-api-samples/issues/detail?id=16

這裏是我拼湊爲getExtendedData提供支持的方法。它通過'feature.getKml()'接受一串Kml作爲參數;`它返回任何在key [value]對象中具有值的擴展數據元素。該公司預計擴展數據是在格式:

<Data name="Foo"> 
    <value>bar</value> 
</Data> 

在XP下測試 - FF3.0,IE7,鉻

function getExtendedData(kmlString) { 
    var xmlDoc = null; 
    var keyValue = []; 
    //Parse the kml 
    try { 
    //Internet Explorer 
    xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); 
    xmlDoc.async="false"; 
    xmlDoc.loadXML(kmlString); 
    } catch(e) { 
    try { 
     //Firefox, etc. 
     var parser = new DOMParser(); 
     xmlDoc = parser.parseFromString(kmlString,"text/xml"); 
    } 
    catch(e) { 
     //Failed to parse 
     alert(e.message); 
     return; 
    } 
    } 
    // Get all the named elements 
    var data = xmlDoc.getElementsByTagName("Data"); 
    // Iterate through the data elements 
    for(var i=0; i<data.length; i++) { 
    if(data[i].getAttribute("name") && 
     data[i].getElementsByTagName("value").length > 0) { 
     // Get the name and value 
     var name = data[i].getAttribute("name"); 
     var value = data[i].getElementsByTagName("value")[0].firstChild.data; 
     // Assign them to the keyValue object 
     keyValue[name] = value; 
    } 
    } 
    return keyValue; 
} 

使用

// where 'feature' is the object with the extended data 
var data = getExtendedData(feature.getKml()); 

for (var name in data) { 
    var value = data[name]; 
    alert(name + '=' + value); // e.g. type=images 
} 
0

它實際上是可能的通過DOM API訪問ExtendedData元素,儘管它們在任何地方都沒有特別的文檔記錄。 我在使用插件打包的某些資源(.rcc)內查找它們時發現了它們。

假設類似你一個簡單的標樣:

<Placemark id="testmark"> 
    <!-- other stuff... --> 
    <ExtendedData> 
     <Data name="someDataUrl"> 
     <displayName>URL Representing some Data</displayName> 
     <value>http://example.com/#hello</value> 
     </Data> 
    </ExtendedData> 
    </Placemark> 

然後(一旦它獲取/解析/加載到地球,您可以訪問它是這樣的:

var mark = ge.getElementById('testmark'); 
var extDataObj = mark.getExtendedData(); 
var extDataOut = Array(extDataObj.getDataCount()); 

for (var i = 0; i < extDataObj.getDataCount(); i++) { 
    var item = extDataObj.getData(i); 
    var details = { name: item.getName(), 
        displayName: item.getDisplayName(), 
        value: item.getValue() 
        }; 
    extDataOut[i] = details; 
} 
console.dir(extDataOut); 

沒有測試它的性能與.getKml()相當,並且支持外部解析器方法,缺少官方文檔可能意味着它沒有完全的功能或支持,但在目前爲止的所有測試中,它似乎沒有問題。我還沒有找到一種方法來訪問任何更復雜的SchemaData類型結構,只有簡單的<data name=''><value>...表單。