Archive for August, 2012

MySQLで緯度経度からの半径で円内検索する

Rails3 では、model に

  scope :origin, ->(lat,lng){
    factor=Math.cos(lat/180*Math::PI)
    select([table_name+".*", sanitize_sql_array(["111.11*GLength(LineString( point(?,?), point(x(geom)*?,y(geom)) )) AS distance", lng*factor, lat, factor])])
  }

としておいて、

  Location.origin(lat,lng).order("distance")

とか、

  Location.origin(lat,lng).where("'distance' < ?", dist)

とか。

計算式は何をしてるかというと、まず、中心地点の緯度から、その地点における緯度と経度の長さの比を算出。(緯度1度あたりの距離は地球上どこでも同じだが、経度1度あたりの距離は赤道から離れるほど小さくなる。東京では0.8倍くらい)これをfactorに保存。
GLength(LineString(point,point)) で三平方の定理を計算してくれるので、経度を補正してこれに入れ、出てきたものに111.11km(赤道における1度の長さ)を掛ける。

Google Form を古いガラケーからも使えるようにする

Google Form 大変便利で重宝しているのだが、古いガラケーからはページが大幅に崩れてしまうという問題があったので、古いガラケーが認識出来ない script 要素と style 要素を全て削り取る Web サービスを作った。

google form に入力してもらうための URL を広める際に、
http://mobile-gform.herokuapp.com/?url=[google form の url]
という URL にすると、古いガラケーからでもフォームを正常に表示、入力できるようになる。
PCやスマートフォンからのアクセスは元URLへ自動的にリダイレクトする。

それだけです。

URLがたいへん長くなるので、 inf.to をご利用ください。