Google Maps API V3で、google.maps.ElevationServiceクラスを使ってみるサンプルプログラム。地図上の線を何等分かした点の標高を取得します。
- プログラムに興味はなく、地図上で標高調べたいだけの場合は緯度・経度・住所・標高を取得するを。
マーカーをクリックすると、その地点の標高を表示します。
// 初期設定(地図)
var map = new google.maps.Map(document.getElementById("map"), {
zoom: 8,
center: new google.maps.LatLng(36, 138),
mapTypeId: google.maps.MapTypeId.ROADMAP
});
// 初期設定(経由地)
var path = [
new google.maps.LatLng(35.630152, 139.740440), // 品川駅
new google.maps.LatLng(35.667160, 138.568993), // 甲府駅
new google.maps.LatLng(35.170694, 136.881637) // 名古屋駅
];
// わかりやすく、線を引いておきます。
new google.maps.Polyline({
map: map,
path: path
});
// リクエストを発行
new google.maps.ElevationService().getElevationAlongPath({
path: path,
samples: 9 // 分割数
}, function(results, status) {
if (status == google.maps.ElevationStatus.OK) {
for (var i in results) {
if (results[i].elevation) {
// 標高ゲット!
var elevation = results[i].elevation;
// あとはご自由に・・・。
var marker = (new google.maps.Marker({
position: results[i].location,
map: map
});
attachMessage(marker, elevation + "m");
}
}
} else if (status == google.maps.ElevationStatus.INVALID_REQUEST) {
alert("リクエストに問題アリ!requestで渡している内容を確認せよ!!");
} else if (status == google.maps.ElevationStatus.OVER_QUERY_LIMIT) {
alert("短時間にクエリを送りすぎ!落ち着いて!!");
} else if (status == google.maps.ElevationStatus.REQUEST_DENIED) {
alert("このページでは ElevationResult の利用が許可されていない!・・・なぜ!?");
} else if (status == google.maps.ElevationStatus.UNKNOWN_ERROR) {
alert("原因不明のなんらかのトラブルが発生した模様。");
} else {
alert("えぇ~っと・・、バージョンアップ?");
}
});
// 複数のgoogle.maps.Markerに吹き出しをつける
function attachMessage(marker, msg) {
google.maps.event.addListener(marker, 'click', function(event) {
new google.maps.InfoWindow({
content: msg
}).open(marker.getMap(), marker);
});
} 複数の地点を結んだ線を何等分かした地点の標高を得るには、ElevationServiceクラスの getElevatioAlongPath() を使います。第1引数 PathElevationRequest の path プロパティにそれぞれの地点の緯度経度を配列で、samples プロパティに何か所でサンプリングするか(=何か所の標高をとるか(=何等分するか+1))を与えると、第2引数のコールバック関数に検索結果が引数として渡されます。
サンプルでは、品川駅~甲府駅~名古屋駅を9地点でサンプリングしています。この数には両端2点を含むので、全体を8等分することになります。各地点間で9地点を調べているわけではありません。全体の最高地点とか最低地点とかをとれるわけでもありません。起点~終点間を狭くしてsamplesをMAXの1024にすればかなり近似できるかとは思いますが。
サンプルでは、品川駅~甲府駅~名古屋駅を9地点でサンプリングしています。この数には両端2点を含むので、全体を8等分することになります。各地点間で9地点を調べているわけではありません。全体の最高地点とか最低地点とかをとれるわけでもありません。起点~終点間を狭くしてsamplesをMAXの1024にすればかなり近似できるかとは思いますが。