たたみラボ

  • about
  • member
  • r&d
  • blog
  • tatamicast

blog

RSS

Where2.0:空間DBのPostGISおよびGeoRSSとKMLについて

icon June 15, 2006 4:47 PM by funami このエントリーを含むはてなブックマーク

Where2.0参加中のフナミタカオです。 15分刻みのプレゼンテーションで1日目から、もう濃密な内容。僕自身地図に関してはまだまだ初心者なのですが、つわものの皆様にいろいろ教えてもらいました。
有用な情報ということで、2つほど紹介させていただきます。

  1. SQLで緯度経度を用いて、検索するにはどうするか?
  2. GeoRSSとKMLはどう違う?

SQLで緯度経度を用いて、検索するにはどうするか?

今、たたみラボはデータベースとして、MySQLを利用しています。
たとえば宿引きというじゃらんnetに掲載されているホテル・宿の情報をGoogleMaps上にマッピングしているデモがありますが、このデモでは、各ホテル・宿ごとに、名称、住所、緯度経度を保持しています。フィールドは簡略していますがこのテーブルをYadoとしましょう。

  名称(name) 住所(address) 緯度(latitude) 経度(longitude)
  たたみホテル 東京都千代田区丸の内1-1 35.68546583314841 139.76240158081055
  かちどき旅館 東京都中央区勝どき1-13-1 35.66092259369664 139.77527618408203

イメージは↑このようになります。
さて、ここで問題はある特定の位置から、近い順に10件宿を抽出したいときにどうするかです。

現状の実装

現状では、どうやって、この問題を解決しているかというと、特定の点からの距離を、緯度、経度に換算して、緯度と経度をそれぞれ、範囲指定でクエリをしています。ことばでいうと難しいですが、SQL的には

SELECT * FROM Yado Where latitude> 35.685 and latitude < 35.686 and longitude>139.762 and longitude<139.777 
dist.jpg

このようにすることで、(ほぼ)正方形の領域内にある、ホテル・宿が抽出できますが、距離順にはソートできていません。ある範囲に入っているだけ。なので、検索結果を1件づつ、ループをまわして距離を測定し、その距離をもって、ソートしています。
検索結果が少ないうちはこれでもいいのですが、近い順で10件とりたいとか、近い順でページングしたいとかになると、どんどん距離を広げていく必要があり、パフォーマンス的にも、コーディング的にも負荷が高いなあと思っていました。

解決の方法

では、そうすればいいかということで、オライリーの本の販売コーナーがあったのですが、Web Mapping Illustrated の本の前に座っていた、その本のTyler Mitchellさんに大胆にも質問しました。(聞いたときは著者だとおもっていなかった)。お答えは、「PostGISを使うといいよ」とのこと。だれもが考えることらしく、解決法はWeb Mappingにも書かれていました。
MySQLで何とかならないのかと聞いてみたのですが、できなくはないがたいへんとのことで、どうも地図をやるなら、データベースはPostGISというのがスタンダードのようです。そして、その直後、この本を翻訳した森さんに会場でお会いし、なんと、日本語版=入門Webマッピング―自分で作るオリジナルのデジタル地図 はできたてのほやほやということをお伺いしました。

Web Mapping Illustrated 入門Webマッピング―自分で作るオリジナルのデジタル地図
PostGISを使用すると、フィールドにストアする形式として空間オブジェクトが利用できるようなる。そして、この空間オブジェクトに対して、検索やインデックスの生成ができるようになるようです。
たとえば

 SELECT * FROM GEOTABLE WHERE GEOM && Distance(GeometryFromText('POINT(1000 1000)',-1),GEOM) < 100;

こんな感じ(本当に感じなので、まだためせていません)入門Webマッピング―自分で作るオリジナルのデジタル地図を読んでから試してみようとおもいます。

GeoRSSとKMLはどう違う?

どちらも場所を記述するためのXMLベースのフォーマットですが、両者の違いはなにかを一言でいうと

  • GeoRSS:場所の座標をあらわすシンプルなフォーマット。
  • KML:座標のみならず、付加情報(オーバーレイ、モデリング、関連情報等々)なんでもはいる。

ということ。KMLはGMLを素にKeyhole社が作成したフォーマット。今ではGoogleがMapsとEearthで採用しているため、デファクトスタンダードを目指しているようです。

Google Maps も Google Earth も Google 社内でスクラッチから作られたわけではなく、元々はそれぞれ買収した Where 2 Technologies(2004年8月)、Keyhole(2004年10月)のプロダクトだ。
http://earthhopper.seesaa.net/article/5904152.html

KMLのKはKeyholeのKということですね。
このKML何人かの方にお伺いしたのですが、結構受け入れら手いる印象でした。なんといっても、Googleが推進しているわけですので、デファクトとして安心してとかってもよさそうです。
あと、GeoTagというのがりますが、これはGeoRSSよりももっシンプル(XMLでさえない)ので、記述が簡単です、Flikerで採用されています。

GeoRSSサンプル

Simple

<georss:point>45.256 -71.92</georss:point>
GML
<georss:where>
	<gml:Point> 
      <gml:pos>45.256 -71.92</gml:pos>
    </gml:Point> 
</georss:where>

引用元 :http://georss.org/

KMLサンプル

<?xml version="1.0" encoding="UTF-8"?>
 <kml xmlns="http://earth.google.com/kml/2.0">
 <Placemark>
   <description>Tethered to the ground by a customizable tail</description>
   <name>Tethethed placemark</name>
   <LookAt>
     <longitude>-122.0856375356631</longitude>
     <latitude>37.42240551227282</latitude>
     <range>305.8880792294568</range>
     <tilt>46.72425699662645</tilt>
     <heading>49.06133439171233</heading>
   </LookAt>
   <visibility>0</visibility>
   <Style>
     <IconStyle>
       <Icon>
         <href>root://icons/palette-3.png</href>
         <x>96</x>
         <y>160</y>
         <w>32</w>
         <h>32</h>
       </Icon>
     </IconStyle>
   </Style>
   <Point>
     <extrude>1</extrude>
     <altitudeMode>relativeToGround</altitudeMode>
     <coordinates>-122.0856204541786,37.42244015321688,50</coordinates>
   </Point>
 </Placemark>
 </kml>
引用元:http://www.keyhole.com/kml/kml_tut.html#placemarks


GeoTagサンプル

<geo:lat>46.1</geo:lat>
<geo:long>124</geo:long> 

 

 

COMMENTS

PostGISというのは
http://www.postgis.org/
のことですよね?

PostgreSQLの最新版では、
幾何データ型と幾何データ演算子が普通に実装されてます
のでもはやPostGISに頼る必要もないと思います。

June 15, 2006 7:22 PM by watanabe  

watanabeさんコメントどうもありがとうございます。

幾何学演算子幾何データ型
http://www.postgresql.jp/document/pg803doc/html/datatype-geometric.html#DATATYPE-GEO-TABLE

幾何関数と演算子
http://www.postgresql.jp/document/pg803doc/html/functions-geometry.html

とかを眺めています。
PostgreSQL自体、初めてなので、いろいと試してみます。使い方のサンプルとか載っているページがあれば、ぜひご紹介ください。

June 16, 2006 4:37 AM by フナミタカオ  

POST COMMENT




(書式を変更するような一部のHTMLタグを使うことができます)

必ず利用規約に同意いただいた上で送信ください。

ページトップへ



(C) RECRUIT MEDIA COMMUNICATIONS CO., LTD.