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
位置ゲー等向けオリジナルエリア分け制作(1)エリア分配案(ここギコ!)
位置ゲーをやってきて感じる難しさとアドバイス
AR視線アプリに関する一考察(ここギコ!)
すこし先のARに必要な方向性3つ
AR視線アプリに関する一考察(ここギコ!)
「ちっ、早すぎたな」と捨て台詞が言えるだけの何をお前はやったのか
目標ができれば実現は可能(ビジネス快進撃 ビジネスマナーのメルマガ)
ほどよい成果主義
コロプラが位置ゲープラットフォームを検討中?iPhone対応も?(ここギコ!)
位置ゲーの歴史をまとめてみた
すこし先のARに必要な方向性3つ(ここギコ!)
GPS高度、ジオイド高、標高の関係
すこし先のARに必要な方向性3つ(ここギコ!)
可視光通信って自位置特定にも使えるんじゃないか
考えるべきは沖縄米軍基地問題の本質!(ようこそイサオプロダクトワールドへisao-pw)
普天間基地移設が軍事的に見て県外移設はあり得ないとかの議論について
馬鹿信者の言動は確かにJSF氏に責任はないのだけれど、良識に訴えたい(ここギコ!)
京都外国人排斥カウンターデモの「反日上等」「日の丸ウンコ」とかについて
馬鹿信者の言動は確かにJSF氏に責任はないのだけれど、良識に訴えたい(ここギコ!)
三度、在特会カウンターデモについて
Hatena bookmarked
My Hatebu

Banners

Syndication
Powered by
Get it!!