とある経緯度から半径1キロの所にあるもの

やりたい事は、まず、「経緯度を使った点の座標から半径1キロのところにあるものをリスト化」するという命題。

これが思った以上に簡単にできるのがPostGISです。

25756 | 南陽郵便局                   | 140.162193 |  38.05075 |   311.2796898711
 26529 | 花見児童遊園                 | 140.161999 | 38.049111 | 473.659944924118
 25641 | 赤湯幼稚園                   | 140.164721 | 38.048722 | 621.461738381496
 24455 | 南陽市結城豊太郎記念館     | 140.165224 | 38.048773 | 644.531730550616
 24559 | 山形地方検察庁赤湯区検察庁   | 140.162749 | 38.047417 | 672.693579686628
 24494 | 南陽市立図書館               | 140.166596 |  38.04917 | 699.114893204092
 24649 | 山形家庭裁判所赤湯出張所     | 140.162749 | 38.047139 | 702.228254185821
 24650 | 山形地方裁判所赤湯簡易裁判所 | 140.162749 | 38.047139 | 702.228254185821
 26829 | 赤湯乳幼児保育センター       | 140.162305 | 38.046861 |  722.24623981089
 25413 | 市立赤湯中学校               |  140.16136 | 38.046306 | 769.758428840306
 26382 | 南陽市老人いこいの家         | 140.165443 | 38.047389 | 778.829898166033
 26533 | 桜木児童遊園                 | 140.151166 | 38.050389 | 875.335122740613
 26830 | 赤湯保育園                   | 140.159499 |    38.045 | 914.913923312114
 26097 | 赤湯駅前簡易郵便局           | 140.151639 | 38.047972 | 969.441393534143
 26534 | 赤湯児童遊園                 | 140.169359 | 38.047806 | 983.097675472704

ほらね。select文一つでこれ。折角なので距離をはじき出し、近い順にソートしてみました

私が知る限りmysqlのgiometory形式でやるには、対角線の両端から範囲にしてこの中にあるものという検索は可能です。確かに今のご時世でだと、Google Map APIで引っ張ってきた地図でえいやっとプロットしてやればそれで事足りるし、同様にAndroidSQL Liteでもそれをやる程度であればいいのだけれども、とりあえずのデータを作っていくにあたり、国土数値情報ダウンロードサービスなるものを使う事にしました。

 

手順としては、postgresqlをインストールして、postgisをインストールして、db作って、extensionを読み込み、shapeファイルをsqlに変換して流し込むという事なわけですが、これだけで半日かかると思います。

全く技術者が読んでも意味がないとは思いますが、非技術者の方々が無理難題ではないということをまず知って頂きたいのもありますので、提示してみました。この程度の情報であればどこぞのAPIで、ぴやーっとJSONで返してきそうではありますが、私のポリシーとしてインターネットは分散してなんぼの世界とも思いもあるのでそれもちょいと頭に入れておきます。

まずは点としての情報を取り扱う

グローバルポジショニングシステムってなんぞや?それはどう動くの?と言う話は、割愛しまして、降りてきた経緯度の取り扱いではまった話からします。

これは全くの偶然で私が実体験として得てしまったお話から。

私が所有しているGPSの情報を取り扱える道具といえば、PSPGPSロガー、無線機、Androidの端末と既にこんなに種類があったりします。原理的には同じといえどPSPの「みんなの地図3」だけが、全く違う値を出すんです。とは言っても北緯が南緯で出てくるほどでもなく、秒オーダーで10秒強の差。これはたいした事がないようではあるものの、実際地図上では数百メートルの差となります。この差はどこかで最近身にしみて感じた人もいると思いますが、測地系の違いから来るもので一応日本でももう10年以上前から廃止されているもので、一応は使わない事が原則になってはいるものの、街中の壁地図や路線なんとかの測定点、記念碑など未だに存在します。いわゆるTokyo Datumというもので実際に携帯電話のGPSと値が違う事を目の当たりにするかもしれません。このあたりは一応そういうものがあると覚えておく事をお奨めします。現在使用されているのはWGS 84です。他にもあることはありますが、測地系というものがある事だけは覚えて下さい。と言う話を知っていれば、林檎マークの地図があんな事にならなかったんだろうな・・・

 このあたりの変換ライブラリはCPANにもPEARにもあります。但し自動判別は無理なので、ごちゃ混ぜの表を拾ってしまったら諦めて手作業分類するしかないのが現状です。

 

もう一つ数値的に気にするものというと、度・分・秒の表記と○○○.△△△△△△の表記です。このぐらいなら分から下は切り捨てられない気になってしまうものですが、世の中の情報としてこのあたりもゴチャゴチャに存在します。

まずは、WGS84で北緯35°40'19"東経139°40'30”を変換していきます。

これがGPSのチップから出てくる情報では、N35.6719444 E139.675278というふうに出てきます。単純に60進法なので時刻と計算方法は同じで分を60、秒を3600で割って全部足せばよい事になります。こういうのをよく使うのは表計算でとりあえず試してみると分かりやすいと思いますが、マクロ書いてグリグリやるほどの者でもないのでこれまた省略。

 

まずは、測地系というものがあって、分とか秒とか小数点で扱う事に慣れるというところで今回は終了。これを実際使う事は次回の講釈で。

位置情報関係について語りたいと思います

人の書いた情報でメシ食ってる奴って気に入らない。といいつつ、思った以上に他人の情報を頼りにしてメシを食ってるのは私です。

毎度の如くいろんなところでブログやってるものの、技術的文書というとhatenaが圧倒的に多くなってきたのでここで述べてみたいと思います。

 

さてと、位置情報といえど私は地理だの土地勘だの疎いほうであるからに、やる事となればGPSだのと地図サービスだのと駆使しちゃうわけですが、こういうものを扱うとなると数学的な知識や、プログラミングと本来ごちゃ混ぜで知識を仕入れる必要があり、はたまたRDBを使って処理したりとか、このご時世なんでノートPCにシリアルポート経由で測位しての話はもう不要だけどこういう技術というものも継承しなければならないので書くことになるでしょう。

 

ということで、何がしたいかわからない前書きですが、そういう事を述べる領域ということで、こちらに記したいと思います。