在 Delphi Seattle 之後,TMapView總算出現了,但一直沒有實際的機會可以拿來用,最近有個機會,需要在 App 當中提供標示地點、路線的功能,因此正好把多年以前在 iOS 上面製作過的桃園福利地圖App當中的導航跟標示地點的功能拿來複習一下。
在 Delphi 上面要製作具備有 Google Map功能的地圖,請先服用官方說明:http://docwiki.embarcadero.com/CodeExamples/Tokyo/en/FMX.Map_Sample
如果您懶得看,我整理一下懶人包(如何設定你的專案,讓它具備Android平台上能顯示地圖的功能),只有幾點而已:
第一大項:建立 Google Map API 的 Key:
1. 連線到 Google API Console: https://code.google.com/apis/console/?noredirect2. 在專案列表中,建立一個新的專案
3. 把 App 的 id 跟名字輸入進去
4. 完成,畫面上會出現 Google API Key,這是一長串的字。
第二大項:設定專案的權限:
1. 先把專案切換到 Android 平台2. 點選 Project Manager 上的專案,滑鼠右鍵點擊,選擇 Project > Options > Uses Permissions
3. 確定以下三個權限有勾選起來:
- Access coarse location
- Access fine location
- Access network state
4. 點選 Project Manager 上的專案,滑鼠右鍵點擊,選擇 Project > Options > Entitlement List 確定 Map Service 有勾選起來
5. 點選 Project Manager 上的專案,滑鼠右鍵點擊,選擇 Project > Options > Version Info 把 Google API Key 貼到apikey 欄位上,也確認 id 跟在 Google API Console 輸入的一致
這樣就設定完成了。
設定 TMapView
接著就可以從元件盤上面拉一個 TMapView 到 Form 上面了,MapView 要放多大都可以,但放太小的話使用者操作起來會不方便,所以盡量能留個半邊螢幕給它比較恰當。使用了 TMapView,第一個需要操作的行為,一定是把地圖的中心點拉到我們想要顯示的地方,並且把地圖放大到『適當的大小』。
以上兩個需求,可以透過設定 TMapView 的兩個 Property 來達成,一個是設定大小用的 Zoom,另一個則是設定中心點的 Location。
先介紹 Zoom,它比較單純,是一個 Single 型別的數字,跟 Google Map 的網頁版一樣,數字越大,街道越大,數字越小,街道越小,我自己習慣的大小,是設定在 16.0,這個大小很適合作為導航之用。
只需一行指令:
Self.MapView1.Zoom := 16;
中心點就稍微麻煩一點,因為 Location 屬性的型別是 TMapCoordinate,所以我們得先建立出一個 TMapCoordinate 實體:
var
mapCenter: TMapCoordinate;
begin
.....
Self.MapView1.Zoom := 16;
mapCenter := TMapCoordinate.Create(23.459567, 120.323351);
self.MapView1.Location := mapCenter;
.....
end;
透過這段程式碼,就能夠把地圖的中心點拉到嘉義高鐵站,並且把大小調整為適合導航的大小。
加一個標示點在 TMapView 上
如果您使用過 Google Map網頁版進行開發,這裡就會很熟悉了,在Google Map網頁版上,要加一個標示點,是以 Marker 元件來加的,但只能以 Javascript 或後端工具在網頁上添加。在 Delphi 程式中,則提供了對應的元件 TMapMarker,要建立 TMapMarker,則需透過 TMapMarkerDescriptor 這個 record,當中包含了 Marker 的座標、文字描述,如果我們想要自定圖示,也可以直接透過 TMapMarkerDescriptor 來指定:
var
mapCenter: TMapCoordinate;
MyMarker: TMapMarkerDescriptor;
begin
.....
Self.MapView1.Zoom := 16;
mapCenter := TMapCoordinate.Create(23.459567, 120.323351);
self.MapView1.Location := mapCenter;
MyMarker := TMapMarkerDescriptor.Create(mapCenter, '嘉義高鐵站');
MyMarker.Visible := true;
MapView1.AddMarker(MyMarker);
.....
end;
這樣就能在 MapView 上面,把地圖中心點拉到嘉義高鐵站、在上面插個標示了,如果想要自定圖示,只需指定一個 TBitMap 給 MyMarker.Icon 即可。
第一段有錯字 土法煉鋼來提供首機上的地圖功能。
回覆刪除感謝您的提醒, 已更正.
刪除請問 確認 id 跟在 Google API Console 輸入的一致 ,是指把 google 的【專案ID】複製貼上 Project Options / Version Info / Package 的 Value嗎?
回覆刪除不是的.
回覆刪除是跟 Project Options/Version Info/apiKey 的 Value 一樣, 如果您專案裡面沒有這個 Key-Value pair, 就需要手動加入喔.
通常比較容易忽略的地方, 是會忘記每個平台 (該畫面上有個 Target 下拉選單, 可以列出所有平台)的設定裡面都要加入 apikey, 這一點需要留意一下喔.