地圖服務是行動apps最常提供的功能。本文介紹如何在Ionic Apps裡使用
Google Maps API顯示地圖。
|
圖1. 顯示Google Map |
前置動作:產生Google API Key
Google API的使用方式如下:
http://maps.googleapis.com/maps/api/js?key=[你的API金鑰]&sensor=true
因此必須先取得API金鑰,步驟如下:
- 前往Google Developers Console (https://console.developers.google.com/)。
- 以gmail帳號登入後,點選「建立專案」,並輸入專案名稱。
- 進到專案頁面,選取左側選單「API和驗證」項目下的「API」,從右邊各種API列表中選取Google Maps JavaScript API,並在下一個畫面啟動之。
- 在「API和驗證」項目下的「憑證」頁面,點選「建立新的金鑰」,選擇「瀏覽器金鑰」,並輸入http:/localhost:8100/*。
- 將「API 金鑰」複製起來,放到index.html引用Google Maps API的地方,例如:
<script src="http://maps.googleapis.com/maps/api/js?key=[你的API 金鑰]&sensor=true"></script>
此外,如果需要行動平台的目前位置資訊,則需要安裝Apache Cordova Geolocation外掛。
cordova plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-geolocation.git
建立Ionic 專案
ionic start GoogleMap blank
cd GoogleMap
ionic platform add android
cordova plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-geolocation.git
加入Google Maps API
Google Maps API無法下載放進專案內,必須直接加入index.html:
<!-- your app's js -->
<script src="js/app.js"></script>
<script src="js/services.js"></script>
<script src="http://maps.googleapis.com/maps/api/js?key=[API金鑰]&sensor=true"></script>
將前置動作取得的API key置換上去,便完成設定。
程式碼說明
如圖1所示,範例程式有兩個頁面:清單頁面templates/list.html與細節瀏覽頁面templates/detail.html,Google地圖置於後頁。資料部份與地圖呼叫服務放在js/services.js(請在index.html內加入js/services.js的設定,並於js/app.js注入js/services.js內的自訂模組),方便後續擴充。
js/services.js
angular.module('starter.services', [])
.factory('MAP', function () {
var self = this;
self.initialize = function (id) {
var LatLng = navigator.geolocation.getCurrentPosition(function (pos) {
return new google.maps.LatLng(pos.coords.latitude,
pos.coords.longitude)
}) // 目前位置
var mapOptions = {
center: LatLng,
zoom: 15,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById(id), mapOptions);
return map;
}
self.setLocation = function (map, pos) {
var marker = new google.maps.Marker({
position: new google.maps.LatLng(pos.lat, pos.lng),
map: map,
title: pos.title
});
map.setCenter(marker.getPosition());
return map;
}
return self
})
.value('POIs', [{
"entrance": "宜蘭縣南澳鄉",
"level": "國家級步道",
"manager": "羅東林區管理處",
"name": "蘇花古道:大南澳越嶺段",
"number": "1",
"second_system": "無",
"system": "蘇花-比亞毫國家步道系統",
"latlng": [24.26467, 121.740875]
}, {
...[略]...
}]);
- 第4-16行:定義initialize()。其中第5行使用Cordova Geolocation外掛,取得現在位置的經緯度,做為地圖的預設位置。其餘都是根據Google Maps API的文件說明,建立地圖。詳情可參考Google Maps API官網。
- 第18-26行:定義setLocation()。同樣根據Google Maps API的文件說明,建立marker,並以marker為中心顯示地圖。
- 第29行以後:步道資料部份。
主程式js/app.js
var map=null;
angular.module('starter', ['ionic', 'starter.services'])
.config(function ($stateProvider, $urlRouterProvider) {
$stateProvider
.state('list', {
url: '/list',
templateUrl: 'templates/list.html',
controller: 'listCtrl'
})
.state('detail', {
url: '/list/:id',
templateUrl: 'templates/detail.html',
controller: 'detailCtrl'
})
$urlRouterProvider.otherwise('/list')
})
.controller('listCtrl', function ($scope, POIs, $location) {
$scope.pois = POIs;
$scope.detail = function (id) {
$location.path('/list/' + id);
}
})
.controller('detailCtrl', function ($scope, MAP, $stateParams, POIs, $filter) {
$scope.poi = $filter('filter')(POIs, {number: $stateParams.id})[0];
map = MAP.initialize('map'); // 載入地圖 'map'是顯示地圖區塊的id
var marker = {lat: ($scope.poi.latlng)[0], lng: ($scope.poi.latlng)[1], title: $scope.poi.name};
MAP.setLocation(map, marker);
})
templates/list.html, templates/detail.html與css/style.css
list.html檔
<ion-view title="步道系統">
<ion-content>
<ion-list ng-repeat="item in pois">
<ion-item ng-click="detail({{item.number}})">
{{item.name}}
</ion-item>
</ion-list>
</ion-content>
</ion-view>
detail.html檔
<ion-view title="{{poi.name}}">
<ion-content>
<div class="card list">
<div class="item item-avatar-left">
<img src="img/ionic.png">
<h2>{{poi.name}}</h2>
<p class="row">
<span class="col-20">地點</span><span class="col-80">{{poi.entrance}}</span>
</p>
<p class="row">
<span class="col-20">等級</span><span class="col-80">{{poi.level}}</span>
</p>
<p class="row">
<span class="col-20">系統</span><span class="col-80">{{poi.system}}</span>
</p>
</div>
<div class="item item-body">
<div class="row">
<div class="col col-center">
<div style="width:250px;height:250px;" id="map" data-tap-disabled="true"></div>
</div>
</div>
</div>
</div>
</ion-content>
</ion-view>
自訂CSS:css/style.css,由於ionic的
加了許多css設定,此檔覆蓋一些css設定,讓google地圖能正常顯示。
.scroll {
height: 100%;
}
#map {
width: 100%;
height: 100%;
}
完整程式可參考
GitHub Gist專案。
沒有留言:
張貼留言