Where2.0:空間DBのPostGISおよびGeoRSSとKMLについて
June 15, 2006 4:47 PM by funami
Where2.0参加中のフナミタカオです。
15分刻みのプレゼンテーションで1日目から、もう濃密な内容。僕自身地図に関してはまだまだ初心者なのですが、つわものの皆様にいろいろ教えてもらいました。
有用な情報ということで、2つほど紹介させていただきます。
- SQLで緯度経度を用いて、検索するにはどうするか?
- 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
このようにすることで、(ほぼ)正方形の領域内にある、ホテル・宿が抽出できますが、距離順にはソートできていません。ある範囲に入っているだけ。なので、検索結果を1件づつ、ループをまわして距離を測定し、その距離をもって、ソートしています。
検索結果が少ないうちはこれでもいいのですが、近い順で10件とりたいとか、近い順でページングしたいとかになると、どんどん距離を広げていく必要があり、パフォーマンス的にも、コーディング的にも負荷が高いなあと思っていました。
解決の方法
では、そうすればいいかということで、オライリーの本の販売コーナーがあったのですが、Web Mapping Illustrated
の本の前に座っていた、その本のTyler Mitchellさんに大胆にも質問しました。(聞いたときは著者だとおもっていなかった)。お答えは、「PostGISを使うといいよ」とのこと。だれもが考えることらしく、解決法はWeb Mappingにも書かれていました。
MySQLで何とかならないのかと聞いてみたのですが、できなくはないがたいへんとのことで、どうも地図をやるなら、データベースはPostGISというのがスタンダードのようです。そして、その直後、この本を翻訳した森さんに会場でお会いし、なんと、日本語版=入門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>

