Work > 標高値API

標高値API

2007年12月8日公開
2009年1月14日再公開

はじめに

アメリカのNASAが公開している全世界の標高値(単位はメートル)のデータを APIとして公開することにしました。このデータは, Shuttle Radar Topographic Missionと呼ばれるミッションで作成されたもので, スペースシャトルにより,リモートセンシングの技術を用いて作成されたデータです。 詳しくは Wikipediaを参照してください。

SRTMのデータはいくつかあり,90m四方のメッシュデータであるSRTM3や, 約900m四方のメッシュデータであるSRTM30があります。 ほぼ全世界のデータが整備されて公開されていますが, 使用しているサーバーの都合上,日本周辺を含めたSRTM30の値を返すAPIとして公開します。

データはデジカメの画像と同じで,メッシュの形式で各メッシュにSRTM30の標高値が 格納されています。0.05度(30秒)で区切られたメッシュとなっており,各メッシュでその場所の もっとも割合の高い土地被覆のカテゴリが決定されています(空間解像度が0.05度といいます。) 赤道付近では0.05度は1000m程度の距離,北緯40度では750m程度の距離となります。 南北方向は1000m程度で変わりません。

SRTM30は,上記のように約900m四方のメッシュ内の平均値をほぼ示しているため, 細かい地形を表現した標高の値ではありませんので,ご注意ください。 また,SRTMは観測原理上,地盤の上の地物(例えば,樹木や建物)が含まれた 高さとなっている場合があります。したがって,このAPIで取得できる標高値は だいたいの値であると考える方が良いと言えます。

APIの使い方

APIが使用できる緯度経度の範囲は,南緯10度から北緯90度,東経60度から東経180度 の範囲となります。それ以外の箇所は-9999mとなります。SRTMで海と判別された箇所も, -9999mとなります。

以下のようなURLを入力します。

http://tagchan.sakura.ne.jp/program/srtm30/code.php?lon=139.645&lat=35.659

すると以下のような結果が返ってきます。

elevationApi({ "elevation" : "46", "latitude" : "35.659000", "longitude" : "139.645004", "data" : "SRTM30" });

JSONの形式で,引数として指定したlon(経度),lat(緯度)の標高値とデータ名(今回はSRTM30)が 返ってくるようにしました。Callback関数はelevationAPIです。

Google Maps APIとのマッシュアップ

Google Maps APIとのマッシュアップを行ってみました。 以下の地図の青枠内をクリックすると,その箇所の標高値が表示されます。

Result

以下に,Google Maps APIのソースコードを載せます。なお,bodyタグでは, onload="load()" onunload="GUnload()"としています。

//<![CDATA[ var map; function load() { if (GBrowserIsCompatible()) { map = new GMap2(document.getElementById("map")); map.addControl(new GScaleControl()); map.addControl(new GLargeMapControl()); map.addMapType(G_PHYSICAL_MAP); map.addControl(new GMenuMapTypeControl(true, false)); map.setCenter(new GLatLng(23, 147), 1, G_PHYSICAL_MAP); map.addControl(new GScaleControl()); var icon = new GIcon(); icon.image = "http://www.google.com/intl/en_ALL/mapfiles/arrow.png"; icon.shadow = "http://www.google.com/intl/en_ALL/mapfiles/arrowshadow.png"; icon.iconSize = new GSize(39, 34); icon.shadowSize = new GSize(39, 34); icon.iconAnchor = new GPoint(10, 34); var points = []; points[0] = new GLatLng(80.0, 60.0); points[1] = new GLatLng(80.0, 180.0); points[2] = new GLatLng(-10, 180.0); points[3] = new GLatLng(-10, 60.0); points[4] = new GLatLng(80.0, 60.00); var polyline = new GPolyline(points); map.addOverlay(polyline); GEvent.addListener(map, 'click', function(marker, point){ map.clearOverlays(marker); map.addOverlay(polyline); getJSON(point.lat(), point.lng()); map.addOverlay(new GMarker(point,icon)); }); } } function getJSON(lat, lon) { var req_url = "http://tagchan.sakura.ne.jp/program/srtm30/code.php?lat="+lat+"&lon="+lon+""; var script = document.createElement('script'); script.type = 'text/javascript'; script.src = req_url; document.getElementsByTagName("head")[0].appendChild(script); return; } function elevationApi( obj ){ var lat = obj.latitude; var lon = obj.longitude; var elevation = obj.elevation; var html = "Location Lat:"+ lat +", Lon:"+ lon +"<br>Elevation: "+ elevation +"m"; document.getElementById("list").innerHTML = html; } //]]>

注意:当サービスを利用してのいかなる不利益が生じましても一切責任は負いかねます。

Return to page top