擴展你的ArcGIS Earth

文章首發於Esri Beijing R&D Center的公衆號。

前言

ArcGIS Earth是一款免費的桌面應用,也是ArcGIS平臺中最重要的桌面端。ArcGIS Earth可以免費使用Esri提供的全球地形、影像服務,像Google Earth一樣瀏覽感興趣的地區;同時用戶還可添加自己的二、三維數據如shapefile、KML/KMZ數據,實現在三維空間內展現二、三維數據並滿足用戶繪製基本要素、量測、分享等基本需求。ArcGIS Earth對企業級用戶而言,可以讓企業內每一個人根據角色的不同訪問發佈在Server上二維要素服務、三維場景服務等。

本文介紹一下ArcGIS Earth的一些不爲人知的功能。

Point based service

當你安裝完ArcGIS Earth後,會發現在X
C:\Users\username\AppData\Local\Programs\ArcGIS\Earth\bin. XX位置有一個config.xml文件,這是earth的配置文件。詳細說明見文檔。裏面有一個
positionServiceUrl, 詳細說明如下:

計算機管理員可以輸入某些帶有編碼值的URL, 這些編碼值會被ArcGIS Earth識別,並填充相應的位置信息。 在設置好該參數後,用戶在ArcGIS Earth中使用鼠標右鍵單擊地面,將會把點擊的點的經緯度,高程等信息傳遞到該URL,並向管理員配置的服務器發送請求,當服務器返回有效的KML時,該KML將會顯示在地球窗口中。


調用google街景服務,在ArcGIS Earth中顯示街景

收到了很多用戶的反饋,要求我們提供類似與Google街景的功能,目前ArcGIS Earth裏還不支持街景,但是我們可以使用上面的方式來查看街景。

此處嵌入視頻

實現的原理大概是這樣的。

用戶鼠標右鍵點擊->earth獲取點擊位置的經緯度座標->將位置信息填充到URL模板中,併發送請求->服務器解析請求,並生成kml->Earth加載KML並顯示Popup。

用戶可以按照以下步驟創建一個能返回kml的服務器。

  1. 搭建一個CherryPy 的服務器
  2. 創建一個KML的模板文件,支持替換其中的位置參數,例如:

<?xml version="1.0" encoding="UTF-8"?>
<kml>
<Document>
<name>%title%</name>
<description><![CDATA[%description1%]]>
</description>
<Placemark>
 <name>%lon%,%lat%</name>
 <styleUrl>#golf-balloon-style</styleUrl>
 <description><![CDATA[<img 
     src="http://www.yakjive.com/styles/
     icons/spaceship-orange.png"/>]]>%descrip
     tion2%</description>
 <LookAt>
 <longitude>%lon%</longitude>
 <latitude>%lat%</latitude>
 <altitude>%elevation%</altitude>
 <heading>0.00265562742696041</heading>
 <tilt>0</tilt>
 <range>11030676.39798315</range>
 </LookAt>
 <Point>
 <coordinates>%lon%,%lat%,%elevation%</coordinates>
 </Point>
</Placemark>
</Document>
</kml>
  1. 創建一個cherrypy app,支持解析用戶的請求,替換模板中的參數,並返回kml文件。

@cherrypy.expose
def callWhat3Words(self, lon=0, lat=0, elv=0):
  cherrypy.response.headers['Content-Type']= 'text/xml'
  w3wURL = 'https://api.what3words.com/position?key={MYKEYNOTYOURS}&position=' 
     + str(lat) + ',' + str(lon)
  req = urllib.request.Request(w3wURL)
  c = urllib.request.urlopen(req)
  res = c.read()
  data = json.loads(res.decode("utf-8"))
  #Build my HTML that will be embedded in KML
  description1 = 
    '<div height=250 width=400 style="font-family:Verdana;">' + 
    '<img src="http://127.0.0.1:8585/templates/what3words_logo.png"' + 
    ' height=139 width=400/>' + 
    '<p><span style="color:blue">' + 
     data['words'][0] + ':' + 
     data['words'][1] + ':' + 
     data['words'][2] + 
    '</span></p></div>'
  description2 = ''
  #Load and modify the KML template
  kmlFile = open('home/templates/response.kml', 'r')
  result = kmlFile.read() 
  result = result.replace("%lon%", str(lon)).
    replace("%lat%", str(lat)).
    replace("%elevation%", str(elv)).
    replace("%description1%", description1).
    replace("%description2%", description2).
    replace("%title%", "What3Words Test")
  return result
  1. 修改ArcGISEarth.exe.config文件,加入以下配置。
 <add key="urlwithpos" 
value="http://127.0.0.1:8585/callWhat3Words?lon=%LONGITUDE%&amp;lat=%LATITUDE%&amp;elv=%ELEVATION%"
/>
  1. 重啓Earth,右鍵單擊,就會看到

目前支持的參數有:

  • %LONGITUDE% - 表示單擊點的經度的鍵值
  • %LATITUDE% - 表示單擊點的緯度的鍵值
  • %ELEVATION% - 表示單擊點的高程的鍵值,當前以米爲單位
  • %HEADING% - 表示朝向

Automation API

ArcGIS Earth的Automation API則是ArcGIS Earth另一個擴展功能。更多信息請見ArcGIS for Developers 或者是 ArcGIS Earth homepage

在我們發佈ArcGIS Earth的第一個版本的時候,就聽到有關於API的需求。使用這些API能夠控制ArcGIS Earth以及與二三維的數據內容進行交互。因此,我們設計了這個API,主要用於app to app(應用程序對應用程序)的通訊。

它是什麼?

ArcGIS Earth Automation API 提供了基於WCF的服務契約(Service Contract),這樣第三方的基於.Net的應用程序就可以通過使用API提供的服務契約與ArcGIS Earth進行通訊。ArcGIS Earth提供的通訊方式使用NetNamedPipeBinding,可以提供快速,安全的單機綁定。

它能做什麼?

通過ArcGIS EarthAPI,用戶可以在他們自己的應用程序基礎上創建.Net的擴展,並使用這個擴展來訪問ArcGIS Earth的資源,或者是控制3D瀏覽。

ArcGIS Earth Automation API 提供了以下的功能:
1、 獲取和設置相機信息
2、 控制相機的飛行
3、 從本地文件夾或者網絡路徑添加圖層
4、 管理workspace內容(目前僅提供添加圖層和刪除所有圖層)
5、 提供當前視圖的截圖

目前的ArcGIS Earth Automation API爲用戶的痛點提供的解決方案。它能給你場景和工作區的控制能力。Esri將會添加更多功能。

現在就試試!

我們來看看能用它幹什麼吧。下面的一個例子展示了,如何在ArcGIS Pro 2.0中關鍵一個擴展,並使用這個擴展來同步ArcGIS Pro和ArcGIS Earth的三維場景的相機視角。如你所見,在切換ArcGIS Pro的書籤的同時,我們會發現ArcGIS Earth的相機視角也會進行相應的改變。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-peF37TBq-1573224168903)(https://community.esri.com/servlet/JiveServlet/downloadImage/38-57809-370813/api3.gif)]

[外鏈圖片轉存失敗(img-aAo8YPbS-1565227643427)(https://geonet.esri.com/servlet/JiveServlet/showImage/38-57809-370813/api3.gif)]
想試試這個add-in嗎,去這個頁面View Synchronization Sample,然後下載用例代碼到你本機。請注意,你需要在你本地的開發環境中編程生成該插件。如果你想獲取add layer是否成功等信息,你需要修改這部分的代碼以完善雙工通訊部分。

後記

ArcGIS Earth product homepage中獲取更多信息,在GeoNet上並上傳你的問題或者與我們分享你的想法。
請盡情發揮想象吧。

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章