文章首發於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的服務器。
- 搭建一個CherryPy 的服務器
- 創建一個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>
- 創建一個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
- 修改ArcGISEarth.exe.config文件,加入以下配置。
<add key="urlwithpos"
value="http://127.0.0.1:8585/callWhat3Words?lon=%LONGITUDE%&lat=%LATITUDE%&elv=%ELEVATION%"
/>
- 重啓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上並上傳你的問題或者與我們分享你的想法。
請盡情發揮想象吧。