【javascript】Google MapのAPIについて調べた
以前、Salesforceで位置情報を扱う方法を調べました。
http://www.subnetwork.jp/blog/?p=180
実際にはVisualforce上でMapを表示するという動きが必要となるため、Google Map Apiついても少しだけ調べてみました。
https://developers.google.com/maps/documentation/javascript/3.exp/reference
世の中には賢い人というのはいるもので、とても上手にまとめてあるサイトを見つけました。
https://syncer.jp/google-maps-javascript-api-matome
APIキーの取得や使用方法については省略します。
Mapを使用するにはjavascriptを読み込む必要があります。
<script src="https://maps.googleapis.com/maps/api/js?key={APIキー}" type="text/javascript"></script>
「key」というパラメータがありますね。
「key」はgoogleから貰えるAPIキーを指定するそうです。
以前は「sensor」というパラメータが必要だったそうですが、現在は必要ないそうです。
むしろ、記述されているとwarningが返ってきます。
javascriptを読み込んだら、まずは位置情報が使用できるかを確認します。
https://developer.mozilla.org/ja/docs/WebAPI/Using_geolocation
navigatorの中にgeolocationが存在するか調べるようです。
https://developer.mozilla.org/ja/docs/JavaScript/Reference/Operators/in
function getGeolocation(){
// geolocationは使用可能か
if("geolocation" in navigator) {
// 使用可
} else {
// 使用不可
}
}
geolocationが使用可能な場合は現在地を取得することができます。
第一引数が成功時のコールバックで、第二引数が失敗時のコールバックだそうです。
第三引数は省略可能で、最大試行回数、要求待ち時間、高精度の位置情報を求めるかを指定するオブジェクトらしいです。
成功時に渡される引数から、経度・緯度が取得できるようです。
function getLocation(){
// 位置情報を取得する
navigator.geolocation.getCurrentPosition(
function(position) {
// 成功時の処理
var latitude = position.coords.latitude;
var longitude = position.coords.longitude;
alert('緯度:' + latitude + ' / 経度:' + longitude);
},function(error) {
// 失敗時の処理
alert('エラー:' + error);
});
}
これで位置情報を取得することができるようになりました。
位置情報だけでは場所が分からないため、次はMapを表示する方法を確認します。
Mapを表示する場所と、Mapのオプションを指定するそうです。
表示する場所は「一般的にはdiv」となっています。
また、optionの「center」と「zoom」は必須なんだとか。
function displayMap(){
var map;
var canvas;
var options;
var latlng;
// 表示先のタグを取得する
canvas = document.getElementById("DivName");
// 中心の座標を設定する(緯度, 経度)
latlng = new google.maps.LatLng(35.632896, 139.880394);
// オプションを設定する
options = {
center: latlng, // 中心座標
zoom: 15 // ズーム値
};
// canvasにMapを表示する
map = new google.maps.Map(canvas, options);
}
座標はディズニーランドです。
取得したdivに、ディズニーランドを中心としたMapが作成されるかと思います。
google Mapでよく見るマーカーも作成することができます。
こちらもオプションを指定するタイプですね。
引数に上で作成したmapがあります。
function createMarker(map){
var marker;
var options;
var latlng
// マーカーの座標を作成する(緯度, 経度)
latlng = new google.maps.LatLng(35.632896, 139.880394);
// オプションを設定する
options = {
map: map,
position: latlng
}
// Mapにマーカーを作成する
marker = new google.maps.Marker(options);
}
座標から住所を取得することもできるようです。
オプションとコールバックが必要なようです。
function getArea(){
var geocoder;
var latlng
var options;
// 住所を取得する座標を設定する(緯度, 経度)
latlng = new google.maps.LatLng(35.632896, 139.880394);
// オプションを設定する
options = {
location: latlng
}
// 座標と住所を紐づけるオブジェクト
geocoder = new google.maps.Geocoder();
// 座標から住所名を取得する
geocoder.geocode(options, function(results, status){
// 戻り値を確認する
if(status == google.maps.GeocoderStatus.OK){
// 成功した場合は住所を表示する
// resultは配列です。
alert(results[0].formatted_address);
} else {
// エラーの場合
alert('住所の取得に失敗しました。');
}
});
}
これらを少しずつ修正することで、現在地を中心としたMapを作成することができます。
現在地を取得し、周辺の地図を表示しています。
現在地が取得できない場合はディズニーランドの周辺を表示しています。
APIキーの部分を差し替えれば動くかと思います。
<html>
<body>
<div id="ErrorMessage" style="padding: 10px 0px;"></div>
<div id="Address" style="padding: 10px 0px;"></div>
<div id="MapCanvas" style="height: 600px;"></div>
</body>
<script src="https://maps.googleapis.com/maps/api/js?key={APIキー}" type="text/javascript"></script>
<script>
window.onload = function(){
// 地図を作成する
createMap();
}
// 現在地を中心とした地図を表示する
function createMap(){
var canvas;
var map;
var marker;
var latlng;
// 表示するタグを取得する
canvas = document.getElementById("MapCanvas");
// 位置情報の初期値を設定する
latlng = new google.maps.LatLng(35.632896, 139.880394);
// 現在地を取得できる場合は取得する
if("geolocation" in navigator){
// 現在地の取得を行う
getLocation(function(nowLocation){
// 現在地を取得できた場合、位置座標を現在地とする
if(nowLocation != null){
latlng = nowLocation;
}
// google mapの作成を行う
map = displayMap(canvas, latlng);
// マーカーを作成する
marker = createMarker(map, latlng);
// マーカーを作成する
getArea(latlng);
});
}else{
// google mapの作成を行う
map = displayMap(canvas, latlng);
// マーカーを作成する
marker = createMarker(map, latlng);
// マーカーを作成する
getArea(latlng);
}
}
// 現在地を取得する
function getLocation(func){
var latlng;
// 位置情報を取得する
navigator.geolocation.getCurrentPosition(
function(position) {
// 成功時の処理
var latitude = position.coords.latitude;
var longitude = position.coords.longitude;
// 位置情報を作成する
latlng = new google.maps.LatLng(latitude, longitude);
// 処理を呼び出す
func(latlng);
},function(error) {
// 失敗時の処理
// 処理を呼び出す
document.getElementById("ErrorMessage").innerHTML = error.message;
func(latlng);
});
}
// Mapを表示する
function displayMap(canvas, latlng){
var map;
var options;
// オプションを設定する
options = {
center: latlng, // 中心座標
zoom: 15 // ズーム値
};
// canvasにMapを表示する
map = new google.maps.Map(canvas, options);
return map;
}
// マーカーを作成する
function createMarker(map, latlng){
var marker;
var options;
var latlng
// オプションを設定する
options = {
map: map,
position: latlng
}
// Mapにマーカーを作成する
marker = new google.maps.Marker(options);
return marker;
}
// 住所を表示する
function getArea(latlng){
var geocoder;
var options;
// オプションを設定する
options = {
location: latlng
}
// 座標と住所を紐づけるオブジェクト
geocoder = new google.maps.Geocoder();
// 座標から住所名を取得する
geocoder.geocode(options, function(results, status){
// 戻り値を確認する
if(status == google.maps.GeocoderStatus.OK){
// 成功した場合は住所を表示する
// resultは配列です。
document.getElementById("Address").innerHTML = results[0].formatted_address;
} else {
// エラーの場合
document.getElementById("Address").innerHTML = '住所の取得に失敗しました。';
}
});
}
</script>
</html>
VisualForceでも確認しないといけませんね。
No comments.