iT邦幫忙

1
鐵人賽 神助攻 HERE Technologies

快速建構地圖服務(十二)- HERE Custom Locations 地圖資料倉儲與查詢

WW 2020-09-29 17:13:232738 瀏覽
  • 分享至 

  • xImage
  •  

快速建構地圖服務(十二)- HERE Custom Locations 地圖資料倉儲與查詢

快速比較 HERE Custom Locations 與 HERE Data Hub

您可能會覺得奇怪,我們之前不是已經學過 HERE Data Hub 了,為什麼還要多認識一個 Custom Locations?到底有什麼差別?

HERE Custom Locations 推出的時間比我們之前提過的 HERE Data Hub 早了好幾年,兩者的最主要功能其實是相同的。

  • 兩者都提供地圖向量資料(點、線、面)的儲存空間。
  • 兩者都提供網路 API 的搜尋功能來讀寫線上的資料。
  • 地圖資料是純屬於每個客戶所私有的,不會和其他客戶共享。

雖然說兩者的最主要功能(資料儲存)是差不多的,但是在應用端,卻有蠻大的不同,以下就列出最明顯的差別:

Custom Locations Data Hub
上傳格式 Shapefile/CSV/WKT Shapefile/GeoJSON/CSV
回傳格式 HERE 定義格式 GeoJSON
上傳方式 API/網頁 API/網頁/CLI/QGIS
計費 呼叫次數 傳輸量/儲存量
快速製圖功能 Studio
權限管理方式 APIKEY TOKEN
GIS 整合 QGIS
最大回傳資料量 500 筆 不限
支援線上地址轉經緯度
支援延伸應用 地理圍籬、路徑規劃 圖層演算功能
線上編輯工具 極為難用 簡單易用

我個人認為有些部份是最關鍵的:

  1. Custom Locations 沒有與 GIS 軟體整合,這增加了資料管理與檢視的困難度。使用 Data Hub 的時候,您只要使用 QGIS 就可以很方便的對線上的地圖資料進行操作,但在 Custom Locations,您要先下載,編輯完再上傳,或是自行開發工具來用 API 的方式進行讀寫。
  2. Custom Locations 回傳最大就是 500 筆,如果您的資料高達數千筆甚至數萬筆以上,又想要一次全部回傳的話,就不能用 Custom Locations。
  3. Custom Locations 支援線上地址轉經緯度,所以您可以上傳一個含地址欄位的 CSV 檔,接著使用 Custom Locations 直接轉成經緯度之後存入您的空間中。
  4. Custom Locations 的延伸功能:Geofencing 與 Custom Routes,可以用 Custom Locations 儲存的地理空間資料來作為地理圍籬或自訂道路來進行路徑規劃;而 Data Hub 的延伸功能主要是用在畫面呈現,例如計算 Hexbin 作為熱點分佈的顯示圖。
  5. Data Hub 的回傳格式是 GeoJSON,相對方便處理,支援度也廣;Custom Locations 並不是標準格式(但也並不複雜,只是需要另外處理)。

最重要的是:在費用的預估上,Custom Locations 比較單純,一次查詢或一次上傳、下載就是一次的傳輸,計費也是依照傳輸次數來計費;而 Data Hub 是用傳輸量與儲存量來計費,因此傳輸量的大小就很關鍵!

如果有 5 MB 大小的資料集,大概包含數百個複雜多邊形加上若干屬性,假設放在 Data Hub 上面,一天被下載 100 次,就是相當於 500 MB 的流量(相當於免費帳號每月傳輸量限額 2.5 GB 的 20%);但同樣的資料集在 Custom Locations 被下載 100 次,僅是 100 次的傳輸次數而已(相當於免費帳號每月傳輸 250000 次 的 0.04%),差距可以說是相當的大!

優先使用 Data Hub 的場景:

  • 如果主要用途在於 Big Data 的呈現。
  • 如果主要需求在於用 GeoJSON 發布資料。
  • 如果作業流程高度依賴 GIS。
  • 如果主要用途在於網頁前端的視覺化。
  • 資料量大,使用者少。

優先使用 Custom Locations 的場景:

  • 如果主要用途在後端的程式處理。
  • 如果主要目的不在於視覺化。
  • 如果需要地理圍籬(Geofencing)或私有道路(Custom Routes)的路徑規劃。
  • 資料量少、使用者多。

※ 簡單來說,Data Hub 對於個人、社群、研究用途比較友善;而 Custom Location 比較適合企業用途,您可以依照您的需求來取用您想要的服務。

事前準備

首先,我們先下載一個資料集,請到下方連結下載全台灣的 AED(Automated External Defibrillator / 自動體外心臟電擊去顫器)位置資料:

AED位置資訊:https://data.gov.tw/dataset/12063

打開連結之後,按下網頁中的「CSV」就會下載「全國AED位置資訊.csv」,請把檔案儲存到您偏好的地點即可。

接著,因為這個資料集的欄位名稱都是中文的,但 Custom Locations 只支援大小寫英文與數字作為欄位名稱,因此您必須要先把欄位名稱改掉。這部份您可以使用您偏好的文字編輯器,或是 OpenOffice Calc 來開啟這個 CSV 檔。

例如,我們使用 OpenOffice Calc,請在編碼選擇「Big5」。

表格的第一列就是欄位名稱,必須要把它們都改成英文。

例如,我把欄位名稱修改成這樣:

修改前 修改後
場所名稱 placeName
場所縣市 county
場所區域 city
場所地址 address
場所分類 placeCategory
場所類型 placeSubCategory
其他類型 placeAdditionalCategory
場所描述 placeDescription
AED放置地點 aedLocation
AED地點描述 aedLocationDescription
地點LAT lat
地點LNG lng
全年全天開放大眾使用 openForPublicAtAllTimes
周一至周五起 openForWeekdays
周一至周五迄 closeForWeekDays
周六起 openForSaturday
周六迄 closeForSaturday
周日起 openForSunday
周日迄 closeForSunday
開放使用時間備註 openHoursDescription
開放時間緊急連絡電話 telephoneNumber

修改後會像這樣:

如果我們就這樣進行以下步驟的話,之後會遇到問題,因為有些欄位例如「aedLocationDescription」、「aedLocationDescription」、「openHoursDescription」中的某些內容有換行字元,而這樣的換行字元在 Custom Locations 是不支援的,因此您可以選擇:

  1. 修改這些換行字元,把幾行的內容改成一行。
  2. 直接刪除這個欄位。

因為我們只是作為範例使用,因此有沒有這個欄位並不是很重要,您可以直接把「aedLocationDescription」、「aedLocationDescription」與「openHoursDescription」這幾個欄位刪除。

直接在欄位頂端按下右鍵,選擇「刪除欄」即可。

如果您想保留這些資料,又想快速解決的話,可以用取代的方式。請按下「Ctrl + F」來開啟搜尋對話框。在「搜尋內容」中輸入「\n」,「取代成」輸入「<br>」作為換行的符號,接著按下「更多選項(O)」,勾選「常規表示式(X)」,之後按下「全部取代」,就完成了。

然後就可以按下「Ctrl + S」來儲存檔案,然後關閉 OpenOffice Calc。

接著,請打開 QGIS,按下功能表中的「Layer」,接著選擇「Add Layer」以及「Add Delimited Text Layer...」來準備讀取 CSV 檔案。

接著,按下右上角的「...」開啟您剛剛儲存的「全國AED位置資訊.csv」,接著進行以下設定:

  • Encoding 選擇「Big5」。
  • File Format 選擇「CSV(comma separated values)」
  • Geometry Definition 選擇「Point coordinates」。
  • X field 選擇「lng」
  • y field 選擇「lat」
  • Geometry CRS 選擇「ESPG:4326 - WGS 84」

設定完畢後,請按下右下角的「Add」。

接著,請依照 快速建構地圖服務(三) - 使用 QGIS 玩轉 HERE Data Hub 教學的步驟,加上 OpenStreetMap 底圖來加強辨識度。

完成的結果會像這樣:

您也可以使用圖徵查詢工具來檢視每個圖徵的內容,確認內容無誤。

接著為了把資料匯入 Custom Location,我們必須有一道手續轉成另一種格式的 CSV 檔,請在「全國AED位置資訊」圖層上面按下右鍵,選擇「Export」,接著選擇「Save Features As...」。

接著,請依照以下指示:

  • Format選擇「Comma Separated Value [csv]」
  • CRS 選擇「EPSG:4326 - WGS 84」
  • Encoding 選擇「UTF-8」
  • GEOMETRY 選擇「AS_WKT」
  • SEPARATOR 選擇「TAB」

把檔案存到您偏好的位置,接著按下「OK」。

轉換完成後,在「Layers」就會出現一個新的圖層,按下右鍵選擇「Open Attribute Table」來開啟表格。

表格打開之後,會發現第一個欄位多了一個新的「WKT」,這個欄位就是 Custom Locations 用來識別這個圖徵是點、線、面。

QGIS 的部份在這邊差不多完成了,請關閉 QGIS 進行接下來的步驟。

Custom Locations 資料集上傳

HERE Custom Locations 官方網站:https://developer.here.com/documentation/custom-location/

HERE Custom Locations 提供兩種上傳方式:

  1. 使用 API 上傳。
  2. 使用網頁介面上傳。

我們就先來試試看用 API。

使用 Custom Location API 上傳地圖資料

※ 說明文件:https://developer.here.com/documentation/custom-location/dev_guide/topics/resource-upload.html

這邊要請您打開您的 Postman,如果您尚未安裝或不清楚什麼是 Postman,請參照 快速建構地圖服務(十一)- HERE Route Matching GPS 軌跡分析 的安裝與基本操作醫學。

打開之後,請把「GET」改成「POST」,網址列填入「https://fleet.ls.hereapi.com/2/layers/upload.json?」並在「Params」新增兩個參數:

  • Key 填入「apiKey」,Value 填入「您的 HERE API KEY」。
  • Key 填入「layer_id」,Value 填入「TW_AED_2020」。

完成之後會像這樣:

接著請切換到「Body」分頁,選擇「form-data」,接著請把滑鼠移到「Key」上面,右側會出現一個選單「Text」與「File」,接著請選擇「File」。

完成後,Value 會出現一個按鈕「Select Files」,請按下這個按鈕選擇檔案,但是在選擇檔案之前,請先把剛剛存的新的 CSV 檔(不是原本下載的「全國AED位置資訊.csv」),副檔名從「.csv」改成「.wkt」。

改完檔名之後,您就可以選取這個檔案了。您可以選擇直接上傳 wkt 檔,也可以壓縮成 ZIP 檔之後上傳,結果會是一樣的,只是上傳 ZIP 檔可以節省一些時間。

接著請在 Key 輸入「zipfile」,完成後會像這樣。

接著就可以按下「Send」來上傳,等個幾秒鐘之後就會上傳完畢了。如果一切步驟正確,您會看到以下的回傳訊息,那就是上傳完成了。

{
 "storedTilesCount": 10892,
 "response_code": "201 Created"
}

接著我們來檢驗一下我們上傳的成果,請在分頁標籤列右側按下「+」來新增一個分頁。

接著在網址列填入「https://fleet.ls.hereapi.com/2/layers/list.json? 」,然後新增一個參數「apiKey」,填入您的 HERE API KEY,完成後按下「Send」,您會看到下方的 layers 裡面已經有一個 TW_AED_2020 圖層,這就是您剛剛上傳的 wkt 檔。

我們來看看我們上傳的 wkt 檔現在變成什麼格式,請新增一個 Postman 分頁,接著在網址列填入「https://fleet.ls.hereapi.com/2/search/all.json? 」,並新增兩個參數,一個是「apiKey」填入您的 HERE API KEY,另一個則是「layer_id」,填入「TW_AED_2020」,接著按下「Send」。

回傳的是一串 JSON 格式的文字,「geometries」裡面就是這個圖層裡面所有的圖徵(其實也不能說是所有的,因為最多只會回傳 500 筆而已)。

我們可以檢視一下第一筆資料,「attributes」裡面是我們剛剛看過的 CSV 檔的屬性資料,只是欄位名稱都被改成大寫,而且緯度的「lat」也被改成「_LAT」。「layerId」是這個圖層的 ID,而「geometry」就是 WKT 格式的點位經緯度。

這並不是標準的 GeoJSON 格式,但也算是淺顯易懂。

{
    "attributes": {
        "PLACENAME": "交通部臺灣鐵路管理局宜蘭運務段瑞芳站",
        "COUNTY": "新北市",
        "CITY": "瑞芳區",
        "ADDRESS": "龍潭里明燈路3段82號",
        "PLACECATEGORY": "交通要衝",
        "PLACESUBCATEGORY": "台鐵車站",
        "PLACEADDITIONALCATEGORY": "",
        "PLACEDESCRIPTION": "",
        "AEDLOCATION": "前站候車大廳無障礙入口右側",
        "AEDLOCATIONDESCRIPTION": "前站候車大廳無障礙入口右側",
        "_LAT": "25.108928",
        "LNG": "121.806149",
        "OPENFORPUBLICATALLTIMES": "X",
        "OPENFORWEEKDAYS": "05:59",
        "CLOSEFORWEEKDAYS": "23:33",
        "OPENFORSATURDAY": "04:13",
        "CLOSEFORSATURDAY": "23:59",
        "OPENFORSUNDAY": "04:13",
        "CLOSEFORSUNDAY": "23:59",
        "OPENHOURSDESCRIPTION": "星期五跨星期六及星期六跨星期日及星期日跨星期一延長上班營業時間至凌晨00:14",
        "TELEPHONENUMBER": "02-24972033",
        "GEOMETRY_ID": "0"
    },
    "layerId": "TW_AED_2020",
    "geometry": "POINT (121.806149 25.108928)"
}

使用網頁上傳地圖資料

HERE Custom Location 的網頁版介面是:Custom Locations Dashboard,開啟之後,請先選擇下方的「App Id / API Key」,接著填入您的 HERE APP ID 與 API KEY。

如果不清楚您的 HERE APP ID,或忘記了,請開啟此網頁 https://developer.here.com/projects/ ,並登入您的 HERE 帳號,就可以看到了,如下圖:

但是這裡請務必要使用您自己的 HERE APP ID 與 API KEY,完成後請按下「Sign in」來登入。

登入後您會看到一個「TW_AED_2020」的圖層,這就是我們剛剛用 API 上傳的資料集。

按下「TW_AED_2020」之後,會進到圖層的內容,格式基本上就跟我們剛剛製作的 CSV 檔一樣,有欄位屬性與值,但您可以點下「GEOMETRY TYPE」中的「POINT」,就可以看到這個點的位置。

在這裡,您是可以直接修改經緯度來移動這個點位的,雖然跟 Data Hub 比起來沒那麼好用,但也聊備一格。

按下右上角的「Open map editor」,則會進到一個地圖介面,您可以在上面查閱每一個圖徵,但是最多也只會顯示 500 筆資料。

按下「Download layer」則會把這個圖層下載下來,格式跟我們上傳的一樣都是 TAB 分隔的文字檔,最後一個欄位是 WKT 格式的向量資料。

每個圖徵右側的垃圾桶圖示,按下後也可以刪除圖徵。

按下「Back」回到主畫面,接著按下「Import layer from file」,這邊的操作簡單很多,先在「Short Name」的文字框中輸入一個簡短的圖層 ID,接著按下「Browse...」並選取我們剛剛使用 Postman 上傳的那個壓縮檔(或 WKT 文字檔),然後按下「Upload and Import」就可以了。

等個幾秒鐘,就會跳回主畫面,並且多了一個新的圖層,就這樣完成了,是不是非常簡單?

Custom Locations 對圖徵的新增、修改與刪除

Custom Locations 並沒有簡單易用的網頁介面,也沒有現成的 GIS 整合功能,基本上絕大部分的操作都要使用 API 呼叫的方式進行。

如果要在既有的圖層中新增紀錄,您可能會注意到網頁版上面有「Add entry」,不過,千萬要小心,因為如果您的資料大於 500 筆,可能會複寫到原本不該複寫的資料(我沒測試過,不保證沒風險)。建議資料量少的時候再使用。

如果要用 API 的形式來修改或新增紀錄,其實也有點麻煩,因為也必須寫成跟您上傳的時候一模一樣的 WKT 格式。我建議您先下載這個圖層的 WKT 檔,然後依照欄位的格式填入新的資料,然後再上傳,因為要修改既有的資料跟新增資料都會用到裡面的一個欄位「GEOMETRY_ID」,這個欄位在原本上傳之前是不存在的,而是上傳了之後 Custom Locations 的後台加上去的,因此您必須要先知道「GEOMETRY_ID」的值,才有辦法去做修改。而產生 WKT 格式的經緯度座標,用手動的也頗繁瑣,因此比較建議用程式的方式去進行。

例如我現在把「GEOMETRY_ID」為 0,「PLACENAME」為「交通部臺灣鐵路管理局宜蘭運務段瑞芳站」的「WKT」改成「POINT (121.950847 24.842117)」,這是一個在龜山島上面的經緯度:

PLACENAME	COUNTY	CITY	ADDRESS	PLACECATEGORY	PLACESUBCATEGORY	PLACEADDITIONALCATEGORY	PLACEDESCRIPTION	AEDLOCATION	AEDLOCATIONDESCRIPTION	_LAT	LNG	OPENFORPUBLICATALLTIMES	OPENFORWEEKDAYS	CLOSEFORWEEKDAYS	OPENFORSATURDAY	CLOSEFORSATURDAY	OPENFORSUNDAY	CLOSEFORSUNDAY	OPENHOURSDESCRIPTION	TELEPHONENUMBER	GEOMETRY_ID	WKT
交通部臺灣鐵路管理局宜蘭運務段瑞芳站	新北市	瑞芳區	龍潭里明燈路3段82號	交通要衝	台鐵車站			前站候車大廳無障礙入口右側	前站候車大廳無障礙入口右側	25.108928	121.806149	X	05:59	23:33	04:13	23:59	04:13	23:59	星期五跨星期六及星期六跨星期日及星期日跨星期一延長上班營業時間至凌晨00:14	02-24972033	0	POINT (121.950847 24.842117)

接著使用 Postman 上傳,API 網址為 https://fleet.ls.hereapi.com/2/layers/modify.json,必須加上一個參數「action」,值為「update」,代表這次操作是要更新一個現有的圖徵。

跟上傳時一樣,我們要把「zipfile」指定到我們要上傳的檔案,完成後按下「Send」。如果您收到回傳 200 OK 就代表成功了。

回到剛剛的 Custom Locations Dashboard檢查 TW_AED_2020 圖層,會發現第一筆紀錄確實被移動到龜山島上面了!

我也可以用同樣的方法,建立一個「GEOMETRY_ID」為「99999」,位在與那國島上面的圖徵。

PLACENAME	COUNTY	CITY	ADDRESS	PLACECATEGORY	PLACESUBCATEGORY	PLACEADDITIONALCATEGORY	PLACEDESCRIPTION	AEDLOCATION	AEDLOCATIONDESCRIPTION	_LAT	LNG	OPENFORPUBLICATALLTIMES	OPENFORWEEKDAYS	CLOSEFORWEEKDAYS	OPENFORSATURDAY	CLOSEFORSATURDAY	OPENFORSUNDAY	CLOSEFORSUNDAY	OPENHOURSDESCRIPTION	TELEPHONENUMBER	GEOMETRY_ID	WKT
假的	假的	假的	假的	假的	假的	假的	假的	假的	假的	假的	假的	假的	假的	假的	假的	假的	假的	假的	假的	假的	99999	POINT (122.982513 24.453786)

跟剛剛的 request 一樣,只是把「action」改成「append」。

回到剛剛的 Custom Locations Dashboard檢查 TW_AED_2020 圖層,在上方的「Search」文字框輸入「99999」按下「Enter」,就會看到我們剛剛新增的「GEOMETRY_ID」為「99999」的那一筆紀錄已經出現了。

除了用 POST 來上傳 WKT 文字檔之外,也可以用 GET 的方式,不過您要先產生一個 WKT 文字檔的字串,轉成 URL 格式之後再上傳。

例如我們就來示範用 GET 的方式來刪除我們剛剛新增的紀錄。要刪除一筆紀錄,只要把所有欄位清空,留下「GEOMETRY_ID」就可以了。

GEOMETRY_ID
99999

但是要使用 GET,我們必須要把這個字串編碼成 URL 格式,因此換行字元為「%0A」,也就是說,我們實際會使用的字串是:

GEOMETRY_ID%0A99999

我們新增一個 request,並且把剛剛那個 URL 直接複製貼上過來,但是要新增一個參數「changes」,值為GEOMETRY_ID%0A99999,完成後按下「Send」。

這樣我們剛剛新增的圖徵就被刪掉了,重新搜尋「99999」,已經不見「GEOMETRY_ID」為「99999」的圖徵。

以上就是 Custom Location 的上傳、新增、修改、刪除的操作,事實上 Custom Location 能夠使用的查詢功能不少,例如常用的有:

  • 圓形範圍查詢,要定義圓心跟半徑:https://developer.here.com/documentation/custom-location/dev_guide/topics/resource-search-proximity.html
  • 方形查詢,要定義左上角與右下角的經緯度:https://developer.here.com/documentation/custom-location/dev_guide/topics/resource-search-bounding-box.html
  • 走廊查詢,可以用經緯度定義出線段,或使用 Routing API 所計算出的路徑,加上搜尋半徑進行查詢:https://developer.here.com/documentation/custom-location/dev_guide/topics/resource-search-corridor.html
  • 屬性查詢:https://developer.here.com/documentation/custom-location/dev_guide/topics/resource-search-all.html

概念跟 Data Hub 其實是類似的,因此就先略過這部份。不過我覺得最關鍵的,還是依照使用場景跟目的來決定要使用 Data Hub 或 Custom Locations,目的清楚了,技術就不是太大問題。

「快速建構地圖服務」系列文章

快速建構地圖服務(一) - 認識 HERE Studio / Data Hub
快速建構地圖服務(二) - 認識 HERE Data Hub CLI / API
快速建構地圖服務(三) - 使用 QGIS 玩轉 HERE Data Hub
快速建構地圖服務(四) - 當 Leaflet JS 遇見 Data Hub
快速建構地圖服務(五) - 整合 HERE 地點搜尋 API
快速建構地圖服務(六)- HERE Waypoints Sequence 路徑最佳排序
快速建構地圖服務(七)- 認識 HERE Routing API - 路徑規劃
快速建構地圖服務(八)- 認識 Matrix Routing
快速建構地圖服務(九)- Isoline Routing
快速建構地圖服務(十)- HERE Tour Planning 物流路徑預排與成本精算
快速建構地圖服務(十一)- HERE Route Matching GPS 軌跡分析
快速建構地圖服務(十二)- HERE Custom Locations 地圖資料倉儲與查詢
快速建構地圖服務(十三)- HERE Geofencing 地理圍籬
快速建構地圖服務(十四)- HERE Custom Routes 自建路網 + Vector Tile 向量圖磚 + Map Image API 靜態地圖
快速建構地圖服務(十五)- HERE Positioning 網路定位服務


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言