2011-08-30 109 views
3

我正在構建將數據提供給獨立Google地球客戶端的應用程序。我想發送一組初始數據,然後使用<NetworkLinkControl><Update><cookie>標籤動態更新它,以便在服務器上進行更改。我使用KML(JAK)庫的Java API生成KML。不幸的是,雖然我可以證實GE正在刷新我的NetworkLink並拉下我發送的更新,但我的更新沒有在GE出現。經過大量閱讀,似乎可能是更新的<targetHref>可能是問題,但我99.9%確定我通過相同的字符串發送。如何使用NetworkLinkControl和KML(JAK)的Java API正確更新Google地球KML?

讓我困惑的部分是我看到衝突信息是否需要將<cookie>元素的值附加到<targetHref>。實際上,當我從靜態服務器URL提供手寫測試KML文件時,實際上看到了一個較早的原型更新,因此我懷疑它不是。實際上,目前令人沮喪的是:我已經看到了在自己的機器上更新工作,但現在無法使用看起來像有效且正確的KML。

目前的設置是這樣的(剝離爲清楚起見外來XML命名空間; 「$ CLIENT_ID」 是一個GUID類的字符串):

<kml xmlns="http://www.opengis.net/kml/2.2" 
     xmlns:gx="http://www.google.com/kml/ext/2.2" 
     xmlns:atom="http://www.w3.org/2005/Atom"  
     xmlns:xal="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"><NetworkLink> 
    <Link> 
    <href>http://server/kmlupdates/${CLIENT_ID}</href> 
    <refreshMode>onInterval</refreshMode> 
    <refreshInterval>1.0</refreshInterval> 
    <viewRefreshTime>0.0</viewRefreshTime> 
    <viewBoundScale>0.0</viewBoundScale> 
    </Link> 
</NetworkLink></kml> 

根KML文件從http://server/kml/ $ {CLIENT_ID}服務

初始內容KML從http://server/kmlupdates/ $ {} CLIENT_ID服務:

<kml><NetworkLinkControl> 
    <minRefreshPeriod>0.0</minRefreshPeriod> 
    <maxSessionLength>-1.0</maxSessionLength> 
    <cookie>cookie=0|kmlRequestType=updates|projectID=6|lastUpdateSeenIndex=-1</cookie> 
    </NetworkLinkControl> 
    <Document id="myProject"> 
    <name>My ProjectProject</name> 
    <Placemark id="pm1"><name>point1</name> 
     <Point><coordinates>-117.0,35.0</coordinates></Point> 
    </Placemark> 
</Document></kml> 

後來更新KML從http://server/kmlupdates/ $服{} CLIENT_ID:

<kml><NetworkLinkControl> 
    <minRefreshPeriod>0.0</minRefreshPeriod> 
    <maxSessionLength>-1.0</maxSessionLength> 
    <cookie>cookie=0|kmlRequestType=updates|projectID=6|lastUpdateSeenIndex=0</cookie> 
    <Update> 
     <targetHref>http://server/kmlupdates/${CLIENT_ID}</targetHref> 
     <Change> 
      <Placemark targetId="pm1"> 
       <name>Name changed by Update Change</name> 
      </Placemark> 
     </Change> 
    </Update> 
</NetworkLinkControl></kml> 

如果任何人有什麼我失蹤這裏任何建議,我會非常感激。謝謝!

回答

4

這個問題的原始版本遺漏了兩個事實,這兩個事實證明是相關的:1)我使用KML的Java API來生成這個,2)<kml>中的XML命名空間。無數次閱讀this Google KML Group post後,我終於明白了這一點。

問題是最後一個XML命名空間「xmlns:xal」。出於某種原因,將其從KML中移除可讓<Update>標籤實際更改Google地球中的項目。 JAK不允許您更改名稱空間,但可以從編組字符串中手動剝離它。

絕對怪異,但至少我找到了解決方案。

-1

我用不同的方法去做別的事情在這裏可能與你的一些樣品(如你的目的「寄過來的一組初始數據,然後動態地使用標籤更新」):

https://sites.google.com/site/canadadennischen888/home/kml/auto-refresh-3d-tracking

方法是所有更改都來自服務器Restful服務。希望能幫助到你。詳情:

如何使一個動態自動刷新3D追蹤:

  1. 準備RESTful服務從數據庫生成KML文件(KML樣品裏面上面的鏈接)

  2. 我的其他JSP代碼將生成一個KMZ文件,其中包含我的Restful服務的鏈接。 KMZ文件具有onInterval(如在底部)

  3. Jsp網頁允許用戶下載KMZ文件。

  4. 當谷歌地球打開KMZ文件,谷歌地球將自動刷新,以獲得從RESTful服務

  5. 每次令人耳目一新的新數據,服務器將用新的數據的最新更新KML數據發送到GE。

KMZ樣本:

<?xml version="1.0" encoding="UTF-8"?> 
    <kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" 
    xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom"> 
    <NetworkLink> 
    <name>[email protected]</name> 
    <open>1</open> 
    <Link> 
    <href>http://localhost:9080/google-earth-project/rest/kml/10001/20002</href> 
    <refreshMode>onInterval</refreshMode> 
    </Link> 
    </NetworkLink> 
    </kml> 
+0

唯一紐帶,答案是沒有用的;你能否在你的答案中包括一些代碼,以及你認爲它的相關性? –

+0

已經更新了更多細節... –

相關問題