Stellaqua - TOMの技術日記 このページをアンテナに追加 RSSフィード

2010年07月07日

[]PostGISを触ってみた

ここしばらく就職活動していて色々と余裕が無かったのですが、先日無事に仕事を頂く事ができまして、7月から働き始める事と相成りました。*1 そんな訳で、またぼちぼちとブログも書いていこうと思います。

今回のネタは、先月発売のWEB+DB PRESS Vol.57を読んでいて、ちょっと興味をそそられたPostGISについてです。

PostGISのインストールと市区町村境界データのインポートに関しては、"PostGISとRailsによる位置情報iPhoneサイト"という記事をそのまま遂行しただけなので、ここでは省略…。

今回は、2つの地点の緯度と経度を与えると、2点間の距離を返すBEARリソースを作ってみました。

<?php
class App_Ro_Distance extends App_Ro
{
    protected $_table = 'areas';

    public function onInject (  )
    {
        parent::onInject();
    }

    /**
     * リソース読み込み
     *
     * @required lat1
     * @required lon1
     * @required lat2
     * @required lon2
     */
    public function onRead($values)
    {
        assert(isset($values['lat1']));
        assert(isset($values['lon1']));
        assert(isset($values['lat2']));
        assert(isset($values['lon2']));
        $sql = "SELECT ST_Distance (";
        $sql.= " ST_Transform(ST_GeomFromText(";
        $sql.= "  'POINT({$values['lat1']} {$values['lon1']})', 4326) ,2451),";
        $sql.= " ST_Transform(ST_GeomFromText(";
        $sql.= "  'POINT({$values['lat2']} {$values['lon2']})', 4326), 2451)";
        $sql.= " ) AS distance";
        $distance = $this->_db->queryOne($sql);
        $result = array('distance' => $distance);
        return $result;
    }
}
?>

これを使って、記事の中でサンプルとして挙げられていた、渋谷札幌の距離を求めてみます。

$ bear read "Distance?lat1=139.716911&lon1=35.647401&lat2=141.35358861111&lon2=43.062555"
code
200
header
n/a
body
array (
  'distance' => '835162.846670699',
)

ちゃんと算出できました! 実にさっくりとこんな計算ができて面白いですね。

地図情報って何かと面白い事に使えそうな予感もするので、もうちょっと研究してみようかなと思います。

今回はとりあえずPostGISに触ってみたところまで…。次回は別の情報と組み合わせたりして、何かやってみようかなと思っています。

*1:就職活動中、面接などでお世話になった方々に御礼申し上げます。