【javascript】Google MapのAPIについて調べた

【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.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です