geocoderの話が予想以上にうけてびっくりしたので、ジオコーディングのくだらない話を一つ。
ジオコーディングに関するコードを書いているとたいていハマる問題が一つあって、それは緯度経度をどういう変数で表すか。
geo – Longitude の略し方。lng 派と lon 派の終わらない争い – Qiita
によると、だいたい世界には6つの派閥が存在するらしいです。
- Lng派: lat,lng
- Lon派: lat,lon
- Long派: lat,long
- Longitude(略さない)派: latitude,longitude
- 緯度経度ペアに名前付けちゃう派: “34.12345,135.98765”
- x,y派: latlngじゃなくてxとyで済ませちゃう人たち
個人的には、上記の他に、
[34.12345,135.98765]
とArrayで表す派閥が存在すると思っています。
例のRubyGeocoderは、もともと文字列を受け取ることになっていたのですが、最近Arrayも受け取るように修正が入ったようです。
ついでなので、Ruby界から、
{lat:34.12345,lng:135.98765}
と表す新Ruby派と、
{"lat"=>34.12345,"lng"=>135.98765}
と表す旧Ruby派なんかも参戦していただくと、問題が混沌としてきて、より宗教戦争らしくなってきますね。
戦争を煽るばかりでは申し訳ないので、みんな仲良くできるコードを用意してみました。
緯度経度を表す多様なフォーマットを全部受け入れて任意のフォーマットで出力する試み
https://gist.github.com/mogya/6978002
これをつかえば、上記で上げたようなパターンをすべて扱うことが出来ます。
irb> GeoUtils::coordinates([34.12345, 135.98765]) => [34.12345, 135.98765] irb> GeoUtils::coordinates(["34.12345", "135.98765"]) => [34.12345, 135.98765] (以下、戻り値は略) irb> GeoUtils::coordinates("34.12345", "135.98765") irb> GeoUtils::coordinates(34.12345, 135.98765) irb> GeoUtils::coordinates( {lat:34.12345, lng:135.98765} ) irb> GeoUtils::coordinates( {lat:34.12345, lon:135.98765} ) irb> GeoUtils::coordinates( {'lat'=>34.12345, 'long'=>135.98765} ) irb> GeoUtils::coordinates( {'x'=>34.12345, 'y'=>135.98765} )
出力側はgeocoderにあわせてarrayにしてあるけど、これも指定可能
irb> GeoUtils::coordinates([34.12345, 135.98765],:lat_lng) => {:lat=>34.12345, :lng=>135.98765} irb> GeoUtils::coordinates([34.12345, 135.98765],:lat_long) => {:lat=>34.12345, :long=>135.98765} irb> GeoUtils::coordinates([34.12345, 135.98765],:latitude_longitude) => {:latitude=>34.12345, :longitude=>135.98765}
こんなこともできます
irb> GeoUtils::coordinates( [34.12345, 135.98765], [:lat_lng,:lat_long,:lat_lon,:latitude_longitude,:x_y]) => { :lat=>34.12345, :lng=>135.98765, :long=>135.98765, :lon=>135.98765, :latitude=>34.12345, :longitude=>135.98765}
使わなくて済んだはずのCPU時間を横着のために使うのはどうかという気もするのですが、気にならない方は自由に利用してください。