2008年01月26日

PostGISで1点からの半径検索は、UTMなりに変換してから検索するのがベストプラクティス?

Posted by nene2001 at 11:20 / Tag(Edit): postgis sql utm / 0 Comments: Post / View / 4 TrackBack / Google Maps このエントリーを含むはてなブックマーク

PostGISで半径x m内の地物を検索する場合、latlong(経緯度)で入っているデータだと空間インデックスが効かないので、どうするかと言う問題ですが。
以前、こんな記事を書いて、むりくりlatlong上で「半径x mの円」を内包する(内接ではない)矩形をざっくり計算し、それを空間インデックスと引き当てて、その後distance_sphere(latlongで入っているテーブルに対し、地球を球体近似した上での表面距離を算出する関数)の実行結果と比較する検索方法を紹介しました。
が、これは別にこれが常道というわけではなくて、GIS素人がちょっとずつ独学して、どんなやり方をすればいいかと試行錯誤した結果の産物です。
まあ言うなれば、ISSEIと同レベルのもの。

が、最近ひょんな事からGISを専門に開発しているらしい人のソースを見せてもらう機会があったのですが、そこではTransform関数を使ってlatlongをUTM(ユニバーサル横メルカトル図法。m単位の直角座標系)に変更し、その上でdistance関数を使って範囲検索を行っていました。
具体的には、記憶頼りですが確かこんな感じ(Zone 53N、東経132-138での場合。SRIDは32653。範囲10km検索)。

SELECT * FROM geomtable WHERE ST_Expand(ST_Transform(ST_GeomFromText('POINT(135 35)',4326),32653),10000) && ST_Transform(geom_column, 32653) AND ST_Distance(ST_Transform(geom_column, 32653), ST_Transform(ST_GeomFromText('POINT(135 35)',4326), 32653)) < 10000;

なるほど、PostgreSQLは関数インデックスも張れるので、ST_Transform(geom_column, 32653)した値について空間インデックスを張るようにしておけば、これで距離半径検索できますね。
多分、単に三平方計算してるだけだと思われるdistance関数の方が、球面距離計算するdistance_sphereより計算早そうだし。
さすが専門家の技。

問題があるとすれば、UTMは経緯度範囲で適用する座標系が異なるので、複数の座標系をまたがるような範囲に対してサービス提供するアプリケーションの場合、その範囲の座標系毎に関数インデックスを張っておかないといけないので、データ挿入・更新の多いアプリケーションだと遅くなるのかも。
また座標系を大きくまたがるような範囲の距離計算は不正確になるので、検索半径も見合った範囲に抑えておく必要がありそうです...まあ、経度6°を上回るような検索は誰もしないと思うけど。

あと、マニュアルを見ると、DWithinというような関数もできているようです。
説明文を読むとこれは空間インデックス使ってくれるそうなので、これまでの「ExpandでMBRの重なりをインデックスチェックしふるいをかけてから、Distanceをチェック」という形じゃなくても、

SELECT * FROM geomtable WHERE ST_DWithin(ST_Transform(ST_GeomFromText('POINT(135 35)',4326),32653), ST_Transform(geom_column, 32653),10000 );

みたいなSQLで、最初のSQLと同じ結果が得られるのかなと。

Related query words in Google & Yahoo
Related Books from Amazon
Trackback to this entry
TrackBack URL :
Trackbacks
[geotools.rb] 1点からの半径検索は、Google 投影に変換してから検索するのがベストプラクティス? -- 第1回: Google 投影にふれる --
Excerpt: 1点からの半径検索は、データを単純なメルカトル投影 (例えばいわゆる Google 投影)に投影しておいて、検索点を検索距離だけ高緯度にずらした所の縮尺...
Weblog: Geographic/Photogrammetric/Cartographic
Tracked: 2008年01月28日 15:22
[GIS]昨日の続き…は一休み
Excerpt: 昨日の続きをGeos側から追ってみようと思ったのですが、ちょっと疲れているので一休み。 それよりも空間検索の定番であるポイントからの半径検索に関するここ...
Weblog: 飛べない日々
Tracked: 2008年01月29日 08:48
[GIS][PostGIS]2点間距離(1点からの距離)による検索方法
Excerpt: via: ここギコ!:PostGISで1点からの半径検索は、UTMなりに変換してから検索するのがベストプラクティス?, ここギコ!:PostGISのGe...
Weblog: MugeSoの日記
Tracked: 2008年09月20日 15:07
UTM上での半径検索は、検索まで全部UTM上で行ってから経緯度に戻す
Excerpt: 久しぶりに位置情報系記事にレスがつきました。 PostGISで...
Weblog: ここギコ!
Tracked: 2008年09月20日 19:18
Comments
コメントはありません。
Post a comment












Remember personal info? 
2008年01月
Su Mo Tu We Th Fr Sa
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

About Me

Navigation

Search
Google
Web
kokogiko.net
Archives
Recent Entries
Recent Comments
Recent Trackbacks
GoogleマップやMaps APIが韓国地図に対応(GOGA - 毎日走る社長のブログ)
韓国の地図が世界のGoogle Mapsで見られるようになってた
韓国の地図が世界のGoogle Mapsで見られるようになってた(ここギコ!)
韓国に行ってきました(出来事編・2日目)
京都外国人排斥カウンターデモの「反日上等」「日の丸ウンコ」とかについて(ここギコ!)
フリーチベットデモ参加してきました
ワンコリアフェスティバルDay2009行ってきました(ここギコ!)
トゥルソリ追加写真
ワンコリアフェスティバルDay2009行ってきました(ここギコ!)
入院しまつた
目的と手段の取り違えが、お役所仕事/お役所体質を生む(ここギコ!)
嫡出推定の意義は判ったがそれにより切り捨てられる部分を救うことにも意義を認めないとな
39サーチ/掃除機/「掃除機」:最新情報(39サーチ)
掃除機ホースに詰まったハンカチの取り出し方
京都通り名ジオコーダー「ジオどす」(ぱらめでぃうす)
京都の通り名に対応したジオコーディングサービス「ジオどす」
アイヌ 叙事詩(最新ブログニュース)
Google未オルソ衛星画像にぶった切られた我が母校
有象無象系ケータイ公式サイトの世界は、恐ろしい虚業の世界かもしれない(ここギコ!)
思った以上にマスはでかい、だからマーケッターが強くなる
Hatena bookmarked
My Hatebu

Banners

Syndication
Powered by
Get it!!