この記事は1年以上前に書かれました。
内容が古くなっている可能性がありますのでご注意下さい。
内容が古くなっている可能性がありますのでご注意下さい。
前回までに、地理空間情報を活用したモバイルWebアプリケーションのサーバー環境を構築し、サーバー側プログラムを開発しました。
そこで今回は、簡単なクライアント側プログラムを開発します。
今回開発するプログラムは、現在地を中心としたOpenStreetMap上に、近くの応急給水拠点をマーカーで表示するというものです。
HTMLファイルの完全なリストは以下の通りです。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>現在地近くの応急給水拠点</title> <style> html, body { padding: 0; margin: 0; height: 100%; } #mapdiv { height: 100%; width: 100%; } </style> <script type="text/javascript" src="openlayers/OpenLayers.js"></script> <script type="text/javascript" src="openlayers4jgsi/Crosshairs.js"></script> <script type="text/javascript" src="jquery-2.1.1.min.js"></script> <script type="text/javascript"> var map; var markers; $(function(){ map = new OpenLayers.Map('mapdiv'); map.addLayer(new OpenLayers.Layer.OSM()); markers = new OpenLayers.Layer.Markers('Markers'); map.addLayer(markers); map.events.register( 'moveend', map, showWaterSites ); if(navigator.geolocation) { navigator.geolocation.getCurrentPosition( function(pos) { var lonLat = new OpenLayers.LonLat(pos.coords.longitude, pos.coords.latitude ).transform( new OpenLayers.Projection('EPSG:4326'), map.getProjectionObject() ); map.setCenter(lonLat, 15); var center = new OpenLayers.Pixel( map.getCurrentSize().w / 2, map.getCurrentSize().h / 2 ); var cross = new OpenLayers.Control.Crosshairs( { imgUrl: "openlayers4jgsi/crosshairs.png", size: new OpenLayers.Size(32, 32), position: center }); map.addControl( cross ); }); } }) function showWaterSites() { var lonLat = map.getCenter().transform( map.getProjectionObject(), new OpenLayers.Projection('EPSG:4326') ); var param = {'lon' : Math.round(lonLat.lon * 100000) / 100000, 'lat' : Math.round(lonLat.lat * 100000) / 100000, 'dist' : 1000}; $.getJSON('api', param, function(data){ markers.clearMarkers(); for(i=0 ; i<data.length ; i++) { switch(data[i].type) { case '配水池' : color = '-blue'; break; case '災害用地下給水タンク' : color = '-gold'; break; case '緊急給水栓' : color = ''; break; } var mkIcon = new OpenLayers.Icon('openlayers/img/marker' + color + '.png', { w: 21, h: 25 }, { x: -10.5, y: -25 } ); var lonLat = new OpenLayers.LonLat(data[i].longitude, data[i].latitude).transform( new OpenLayers.Projection('EPSG:4326'), map.getProjectionObject() ); var marker = new OpenLayers.Marker(lonLat, mkIcon); markers.addMarker(marker); } }) } </script> </head> <body> <div id="mapdiv"></div> </body> </html>
スクリプトは、DOMの構築が完了したときに初期処理を行なう $(function(){ で始まる無名関数と、地図をドラッグしたときに実行するshowWaterSites()関数から成ります。
初期処理では、OpenLayersを使用してOpenStreetMapを表示するレイヤとマーカーを表示するレイヤを作成し、ドラッグ終了イベントのハンドラとしてshowWaterSites()関数を登録します。
さらに、Geolocation APIで取得した現在位置を中心として地図を表示し、中心に十字線(cross hair)を表示します。
showWaterSites()関数では、前回作成したNode.jsのプログラムをjQueryのgetJSON()関数で呼び出し、地図の中心座標から1,000m以内にある応急給水拠点を取得してマーカーを表示します。マーカーの色は応急給水拠点のtypeによって変えています。
ブラウザでは以下のように表示されます。
地図をドラッグすると、1,000mより離れてしまった応急給水拠点のマーカーは消え、新たに1,000m以内に見つかった応急給水拠点のマーカーが表示されます。