今いる場所の近くのダムを検索するスマートフォン向けサイトを作成し、公開しました。
PCブラウザからも環境によっては利用可能ですが、現在地とはならないと思います。
ちかダムの利用には位置情報の提供が必要となります。
「現在地から探す」を選択すると、位置情報取得、直線距離を計算し、近い順に最大10件表示されます。
ダムカードが配布されているダムは、詳細を開かなくてもわかるように結果リストの背景は黄色で表示されます。
結果リストを選択すると、ダムの詳細画面に移動します。
【ダム諸元】には、ダム便覧に掲載されているデータのうち、ダム巡りする時に意識して見たいと思われる項目を表示しています。
※ダム便覧のデータは無断利用が禁止されています。ちかダムは、日本ダム協会に許可を得て利用しています。
ダムカードが配布されているダムについては、【ダムカード情報】もダム諸元に続いて表示されるようになっています。
ダムカードの配布情報は国土交通省のダムカード配布施設(平成25年1月1日現在)をベースに、手作業で修正を加えたものを表示しています。
画像には表示されていませんが、Google Mapへのリンク、ダム便覧の全項目表へのリンクも表示されます。
ダム諸元の目的および形式については、カッコで略を表示するようにしたので、略の意味を分かっている方には縦長になっているので、見づらいと感じる方もいらっしゃるかも?
ダムカードの情報、手作業でデータベースに登録して表示しています。誤って違うダムのダムカード情報が表示されていたり、文字化けしている。などありましたら、ご連絡いただけると助かります。
以下、プログラム的なこと。
位置情報の取得には、Geolocation APIのgetCurrentPositionメソッドを利用しています。
最初はenableHighAccuracyのオプションの存在をわかっていなくて、使っていなかったのですが(デフォルトはfalse)、スマホのGPS機能を利用した位置情報の取得を行うにはtrueに設定する必要があるようです。
取得した位置情報の周囲にあるダムを探す手段として、MySQLであればgeometry型を利用したやり方?があるようですが、ちかダムではデータベースにSQLiteを利用しているため、高度な検索はできません。
いろいろネットで検索した結果、コードもあまり書かなくてよさそうなので、DBにGeohashテーブルを追加して、Geohashによる検索でダムデータの絞り込みを行っています。
Geohashの算出はライブラリが公開されているので、それを利用しました。
Geohashは文字数に応じてエリアが拡大しいくので、とても簡単です。
取得した位置情報のGeohashを算出して、その文字数を少なくして絞り込むことで簡単に周囲の情報を検索できます。
ハッシュ4文字、近隣エリアも含めた9マスでDBのgeohashを検索(前方一致検索)しています。
ハッシュの文字数を減らしても、実際どのくらいのエリアなのかがさっぱりわからないので、
複数のGeohashでどのようなエリアを作れるか確認できるツールを書いた
を利用させて頂いて、確認していました。
距離の計算はSQLではなく、プログラムで計算しています。
計算にはヒュベニの公式。と言うものを使いました。が、ネットで検索して出てくる情報は旧日本測地系の数値のようだったので、定数の部分を修正しました。
//2点間の距離の算出 function calc_distance( $startLatitude , $startLongitude , $endLatitude , $endLongitude ) { //始点終点ラジアン変換 $startLatitudeRad = $startLatitude * M_PI / 180; $startLongitudeRad = $startLongitude * M_PI / 180; $endLatitudeRad = $endLatitude * M_PI / 180; $endLongitudeRad = $endLongitude * M_PI / 180; //2点間平均緯度(P) $averageLatitudeRad = ( $startLatitudeRad + $endLatitudeRad ) / 2; //2点間緯度差(dP) $diffLatitudeRad = $startLatitudeRad - $endLatitudeRad; //2点間経度差(dR) $diffLongitudeRad = $startLongitudeRad - $endLongitudeRad; //子牛線曲率半径( M=6334834/sqrt((1-0.006674*sin(P)*sin(P))^3) ) $meridian = 6335439.3270839 / sqrt( pow( 1 - 0.006694 * pow( sin( $averageLatitudeRad ) , 2 ) , 3 ) ); //卯酉線曲率半径( N=6377397/sqrt(1-0.006674*sin(P)*sin(P)) ) $primeVertical = 6378137 / sqrt( 1 - 0.006694 * pow( sin( $averageLatitudeRad ) , 2 ) ); //ヒュベニの距離計算式( D=sqrt((M*dP)*(M*dP)+(N*cos(P)*dR)*(N*cos(P)*dR)) ) $distance = sqrt( pow( $meridian * $diffLatitudeRad , 2 ) + pow( $primeVertical * cos( $averageLatitudeRad ) * $diffLongitudeRad , 2 ) ); return $distance; }
プログラムを組む際、以下のサイトを参考にさせて頂きました。
緯度経度から2点間の距離を求める
二地点の緯度・経度からその距離を計算する
カシミール / 計算式
緯度・経度から平面直角座標および子午線収差角を求める計算
ちかダムはjQuery Mobileを使っています。なので、良く見かけるサイトの構成ですw
使い慣れないので、今の所はあんな表示です。知識不足で申し訳ない。
なんだか、地図を開いて戻ってくると動きが怪しい気がします。
利用中に気付いた点やこんな機能付かないの?と言う要望(ただし実装するかはわからない)などありましたら、SNSやメールなどでお気軽にどうぞ。
コメント