2012-07-31 49 views
0

我有一個網絡與谷歌地球API的工作,我使用多個KML圖層來顯示數據。訪問點的地標信息修改高度

隨着用戶的交互,需要修改地標的某些屬性(如樣式和名稱)以更改地標顯示信息。

在某些情況下,我想修改地址Altitude中包含的信息,包括在KML中指定的幾何圖形的Point信息中。其實這是clampedToGround,我想修改它爲任何數字,以便在其他元素之上。

這是我如何修改地標信息的示例:

var pm = ge.getElementByUrl(UrlOfLayer#IdOfPlacemark); 
pm.setStyleUrl(UrlOfLayer#IdOfStyleMap); 
pm.setName(NewName); 

這是正常使用,沒有任何問題,所有的更改。該KML地標的結構,因爲它遵循:

<Placemark id="1"> 
    <name>Name</name> 
    <visibility>1</visibility> 
    <open>0</open> 
    <Point> 
     <extrude>1</extrude> 
     <tessellate>1</tessellate> 
     <altitude>clampedToGround</altitude> 
     <coordinates>1,1,1</coordinates> 
    </Point> 
    <styleUrl>#style</styleUrl> 
</Placemark> 

通過這種結構和標在Javascript通過getElementByUrl了我可以訪問字段名稱,可見性等只是getName()getVisibility()等 但是,這不適用於Point信息,因爲它包含在地標的Geometry對象內。

我可以用pm.getGeometry()訪問幾何信息,但在此之後,「點」不能因爲谷歌地球文件賽斯訪問:

的KmlGeometry對象是一個抽象的對象,不能直接使用 。它爲所有派生的幾何對象提供了一個佔位符對象。

看一些使用Point信息的例子,它只是用來創建一個Point,然後把它包含在Geometry中,但在我的情況下,我不能在Javascript中創建點,因爲我可以' t獲取座標信息,新的點將覆蓋它。

那麼,有沒有我沒能找到的訪問器來完成這個目的?

回答

1

這個文件有點不清楚;也許應該說KmlGeometry對象不能被直接實例化。實際上,如果點擊「所有成員列表」鏈接(最相關的鏈接從KmlObject繼承),則KmlGeometry對象上有多種方法,which you can see in the documentation

所有不同幾何類型從KmlGeometry繼承,但既然你知道這種幾何結構是KmlPoint,你可以把它當作一個KmlPoint(在其他語言中,你可能需要顯式轉換的變量,但是,是好還是更糟的是,Javascript更寬容)。在你的情況,你可以做

var point = pm.getGeometry(); 
point.setAltitude(newAltitudeValue); 
point.setLatLng(...); 

等,您可以使用所有normal KmlPoint methods

順便說一句,如果你知道具體的幾何類型(例如,如果幾何返回爲目標的點擊事件,可以是任何東西),你可以隨時與繼承getType問吧KmlObject(在這種情況下,pm.getGeometry().getType()將返回'KmlPoint'),然後您可以採取行動。不是一個完美的反射系統,但它的工作原理。

附錄:你舉的例子KML包含行

<altitude>clampedToGround</altitude> 

這不是有效的KML。你大概的意思是

<altitudeMode>clampToGround</altitudeMode> 

地球丟棄它不理解的元素(雖然驗證器會顯示這個錯誤),但它並不特別是在這種情況下無所謂,因爲clampToGround是默認altitudeMode反正。這是導致任何高度變化下降的原因,因爲clampToGround「表示忽略高度規格」(per the docs),因此該點將被放置在地平面,而不管其高度值如何。

要改變海拔高度,可以使用relativeToGroundabsolute作爲海拔模式,或者使用API​​更改海拔高度。

pm.getGeometry().setAltitudeMode(ge.ALTITUDE_RELATIVE_TO_GROUND); 

然後,您通過pm.getGeometry().setAltitude(...)設置的任何海拔高度都應該有效。

+0

我會試試看,並說出你的一些東西,如果它的作品完美。 – Nuxy 2012-08-01 06:30:35

+0

這是一個很好的嘗試...類似於我剛開始嘗試的東西,但它不起作用。確實,它返回它是一個KmlPoint,但是當你嘗試設置一個新的Altitude時,它會給你一個錯誤,就像你不能訪問屬性一樣。感謝您的嘗試,如果您發現新的東西讓我知道。 – Nuxy 2012-08-01 07:02:30

+0

我更新了我的答案,以捕捉原始代碼中的altitudeMode問題。我應該更仔細地測試我的答案! – 2012-08-01 20:24:07