latlngの宗教問題

1406390_59235278.jpg

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派なんかも参戦していただくと、問題が混沌としてきて、より宗教戦争らしくなってきますね。

609407_23691178.jpg

戦争を煽るばかりでは申し訳ないので、みんな仲良くできるコードを用意してみました。

緯度経度を表す多様なフォーマットを全部受け入れて任意のフォーマットで出力する試み
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時間を横着のために使うのはどうかという気もするのですが、気にならない方は自由に利用してください。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です