位置に関するメタデータとその応用

ウェブ上の様々なリソースは、「位置」に関する情報と組み合わせることで、リアルな世界と結びつきます。緯度経度データをRDFやmeta要素として提供したり、そのデータを地図上に表現するなど、位置に関するメタデータを記述する方法とその応用について検討してみます。

This page is an introduction to RDF Geo vocabulary and its applications. Most parts are written in Japanese, but you'll find a short summary at the beginning of each section.

場所の表記とメタデータ

The location is very important data to describe real world things, along with date/time information. Latitudes and longitudes are ideal for location metadata, which could be related to photo-GPS or events, restaurants and others.

現実の世界の事象を記述するにあたっては、日時と並んで場所に関する情報が重要です。場所の表現には、住所表記、郵便番号、最寄り駅やランドマークなどさまざまな方法があり、状況によって使い分けられます。メタデータとして機械処理しやすく、グローバルな指標として一番確実な場所の表記法は、緯度・経度でしょう。

GPSや地図サービスの普及で、ある場所の緯度・経度情報は比較的簡単に入手できるようになってきました。これをウェブ上のリソースにメタデータとして付加すれば、さまざまな情報を現実世界に結びつけることが可能になります。たとえばレストラン情報、コンサートやイベント情報が位置データを備えていれば、催しに出かけたあとで食事をする場所を探すといった検索をエージェントに任せられそうです。写真に撮影場所のGPSデータが加われば、地図と連動した豊富な情報サービスが考えられます。

(地理情報を利用した応用は、GISを始め非常にたくさんの試みがあります。ここでは、RDFを中心としたメタデータによるものに絞って紹介します)

RDF-IGのGeo vocabulary

One of the most useful and handy vocabularies for location data is RDF Interest Group's Geo vocabulary.

緯度・経度といった位置データを記述するボキャブラリはいろいろありますが、RDFでメタデータを記述するために最も手軽で一般的なのは、W3CのRDF Interest GroupによるGeo vocabularyでしょう[GEOVOCAB]

名前空間URI
http://www.w3.org/2003/01/geo/wgs84_pos#
よく使われる接頭辞
geo:

Geo vocabularyのクラス

クラス内容
SpatialThing 場所、物体、人間など、空間的に存在してサイズや形、位置をもつもの
Point 緯度経度で示される地点。SpatialThingのサブクラス

この語彙では、人間などにも位置情報を与えるためのSpatialThingクラスと、「地点」として緯度経度を与えるためのPointクラスが定義されており、位置との関連が曖昧なリソースと厳密な場所の両方に利用できるようになっています。

Geo vocabularyのプロパティ

プロパティ働きdomainrange
lat 緯度。度分秒形式ではなく百分率を用い、北緯を正数、南緯を負数として記述する。 SpatialThing -
long 経度。百分率を用い、東経を正数、西経を負数として記述する。 SpatialThing -
alt 高度 SpatialThing -
lat_long カンマで区切った緯度・経度(削除予定) - -

※プロパティの値はいずれも世界測地系で記述する。

位置を示すのに緯度・経度を用いるというのは、誰でも考えつくアイデアです。逆にそれだけ使う機会も多いので、シンプルな標準語彙を共有するメリットは大きいと言えます。

位置情報の利用例

FOAFのbased_near

The based_near property of FOAF is a good example to use the geo: vocabulary.

人がどのあたりを拠点にしているかを示すFOAFbased_nearプロパティは、この語彙を使って次のように表記できます。

(例)

<foaf:Person>
 <foaf:name>Masahide Kanzaki</foaf:name>
 <foaf:based_near>
  <geo:Point>
   <geo:lat>35.678</geo:lat>
   <geo:long>139.770</geo:long>
  </geo:Point>
 </foaf:based_near>
</foaf:Person>

このメタデータは、この人物が北緯35.678、東経139.770という地点の近くに出没するといった情報を示しているわけです。この例は、ノード要素(geo:Point)を省略して次のように簡単に書くこともできます。

(例) <foaf:based_near geo:lat="35.678" geo:long="139.770"/>

度分秒表記と百分率表記

The 'decimal' format of the latitude and longitude are better suited to metadata than 'dms' format. 'decimal fraction' = 'm' / 60 + 's' / 3600.

Geo vocabularyを始めメタデータでは通常、緯度・経度を百分率で表記します。一方、世の中で入手できる位置情報は、度分秒形式になっていることが少なくありません。これらはごく簡単な計算式で相互変換できます。度分秒から百分率への換算は次のとおりです。

[百分率の小数点以下] = [分] / 60 + [秒] / 3600

百分率から度分秒への換算はこの逆を行えばよいわけで、上記の例は北緯35度40分40.8秒、東経139度46分12秒を示すことになります。また、度分秒では東経/西経などはE/Wといった識別子を用いることが多いですが、百分率では西経/南緯はマイナスの値として表すことに注意してください。

nearestAirport

Another example is nearestAirport from 'contact:' vocab, together with DAML Airport vocab..

FOAFのbased_near同様の考えは、'contact:'と呼ばれる実験的なPIM用語彙に含まれるnearestAirportと、DAMLのAiport語彙を用いて、以前から試みられてきました[MILLER]

(例)

<rdf:RDF
  xmlns:contact="http://www.w3.org/2000/10/swap/pim/contact#"
  xmlns:air="http://www.daml.org/2001/10/html/airport-ont#"
  xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:foaf="http://xmlns.com/foaf/0.1/">
 <foaf:Person>
  <foaf:name>Masahide Kanzaki</foaf:name>
  ...
  <contact:nearestAirport>
   <air:Airport rdf:about="http://www.daml.org/cgi-bin/airport?HND">
    <air:iataCode>HND</air:iataCode>
    <air:name>Haneda, Tokyo International Airport, Japan</air:name>
    <geo:lat>35.55</geo:lat>
    <geo:long>139.78</geo:long>
   </air:Airport>
  </contact:nearestAirport>
 </foaf:Person>
</rdf:RDF>

空港はデータベースが整備されているので、その位置情報を調べるのは簡単であり、ICAOもしくはIATAの空港コードさえあれば、座標を具体的に指定しなくても理解可能というメリットもあります[AIRPORTLOC]。上の例では緯度・経度はgeo:を用いて示しましたが、Aiport語彙に含まれるair:latitudeなどを用いることもできます。また、これらの値はリテラルなので、Aiprot要素の属性として簡単に記述しても構いません。

(例)

  <contact:nearestAirport>
   <air:Airport air:icaoCode="RJTT" air:iataCode="HND"
        air:latitude="35.55" air:longitude="139.78" air:elevation="35">
    <air:name>Haneda, Tokyo International Airport, Japan</air:name>
   </air:Airport>
  </contact:nearestAirport>

このnearestAirportは、「近くの空港」という比較的アバウトな指標を使って位置を示すことで、住所を特定してしまうというプライバシーの懸念を回避しつつ、広域的なレベルでその人物がどのあたりにいるのかが分かるという点が興味深いところです。

Jim Ley's FOAF People Map will show who's where in the world from their FOAF metadata.

Jim LeyのつくったFOAF People Mapは、収集したFOAFデータからnearestAirportを抜き出し、世界のどこ(どの空港周辺)に誰がいるかを、SVGを用いて下図のように示してくれます。

世界地図上に、空港の位置を示す丸印が示され、そこをクリックするとその空港をnearestAirportと指定したPersonが示される

位置データと精細度

Sometimes the precision of the lat/long matters. A hint is: 0.01 degree of latitude is about 1.11 kilometers, while 0.01 deg. of long. is about 0.91 km.

緯度・経度データの小数点以下を何桁示しておくのがよいかは、データをどんなスケールで利用するかによって違ってきます。特定の場所にカーナビなどを使ってたどり着くためにはかなりの精細度が必要である一方、世界地図の中でおよその位置をプロットするのであれば、低精細度の値で十分です。また対象となるデータによっては、プライバシーとの兼ね合いも精細度に関係するでしょう。

大まかに言って、緯度の0.01度は約1.11km、経度の0.01度は約0.91kmの距離に相当します。従って、10m単位の精細度が必要な場合は小数点以下4桁、10km単位でもよければ小数点以下1桁といった形でデータを提供すればよいわけです。

カレンダーと位置情報

iCalendar format defines GEO property. Although it is not yet determined how to encode it in RDFical, it will be a good place to use geo: vocab.

iClarendarにはGEOというプロパティがあり、ここに緯度・経度をセミコロンで区切って記述することになっています。iClarendarのRDF版、RDFicalでこの値をどう扱うかについては、まだ確定していませんが、geo:語彙を持いて構造化した記述が有力候補になっています(次の例では、RDFicalの名前空間をデフォルトとしてVevent要素のみを記述します)。

(例)

<Vevent>
 <dtstart rdf:parseType="Resource">
  <dateTime>2004-02-11T18:15:00</dateTime>
  <tzid>Asia/Tokyo</tzid>
 </dtstart>
 <dtend rdf:parseType="Resource">
  <dateTime>2004-02-11T21:00:00</dateTime>
  <tzid>Asia/Tokyo</tzid>
 </dtend>
 <summary>オーケストラ・ダスビダーニャ第11回演奏会</summary>
 <location>東京芸術劇場</location>
 <geo rdf:parseType="Resource">
  <geo:lat>35.7297</geo:lat>
  <geo:long>139.7080</geo:long>
 </geo>
</Vevent>

(場所の名前を示すlocationプロパティと緯度・経度のgeoプロパティが別々になっているのがイマイチなので、この辺りの構文は変更されるかも知れません)

Followings are the examples to use geo: vocab in RDFical, and their representations with RDFmapper. Note RDFmapper requires Flash6.

イベント情報に緯度・経度を結びつければ、カレンダーをクリックするとその場所の地図が表示されるといった応用が簡単に実現します。例:

[RDFMapper]での地図生成にはFlash6が必要です。これについては別途解説の予定…

GeoURL

GeoURL is an interesting database of web sites based on their locations, though it does not take RDF format yet.

今のところRDFベースではありませんが、緯度・経度情報に基づいて世界のホームページを収集しているデータベースが[GeoURL]です。自分のサイトをGeoURLに登録するには、まず次のようなmetaタグをホームページのhead要素内に記述します。

(例)

 <meta name="ICBM" content="35.678, 139.770" />
 <meta name="DC.title" content="The Web KANZAKI" />
 <link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" />

name属性値がICBMとなっているのは、インターネット以前のUsenet時代のプロジェクトの呼び名にちなんでいるそうです。content属性には、百分率の緯度・経度をカンマで区切って記述します。サイトの名前は、なぜかHTMLのtitle要素から取得されず、改めてもうひとつのmetaタグを用意してDC.titleとして記述することになっています。最後のlink要素は、GeoURL用ではありませんが、Dublin Coreの語彙をHTMLに記述するための約束です。

これらのタグを記述してアップロードした上で、GeoURLのページからリクエストPINGを送ると、指定URLのタグをチェックしてデータベースに加えてくれます。


(GeoURLの地図インターフェイスの縮小版。地図上の赤点は、ある1日に登録されたサイト)

データベースからは、地図をクリックしたり、北緯35.678度・東経139.770度から半径100マイルにあるホームページ、あるいは自分のURLの近所にあるサイトといった具合に指定して、「ご近所さん」を見つけることができるようになっています。

GeoURL, on the other hand, supports RDF as an output. RFDmapper can draw a map based on its output.

GeoURLは、出力データとしてはRDFをサポートしています。これを使うと、RDFMapperでご近所さん地図を描くなど、面白い試みが可能になります。

〔補足〕

2004年の夏頃からGeoURLのサービスは停止していますが、2004年末から、別のドメインhttp://geourl.infoで類似のサービスが始まっています。ただしこちらの機能は限定的で、今のところRDFの出力もない模様。当サイトのメモ「GeoURLふたたび?」を参照してください。

2005年2月にはGeoURL 2.0として元祖も復活しました。当サイトのメモ「GeoURLふたたび?」を参照してください。

〔以上補足〕

GPSとデジタル写真

Digital photo and GPS is a good combination. Exif format has directory and tags for GPS data.

デジタル写真の撮影データなどを記録するExifフォーマットには、GPSの緯度経度情報などのためのディレクトリ・タグも定義されています。GPS付きの携帯電話カメラも登場しており、写真に位置情報を追加するのはずいぶん身近になってきました。これを利用すると、地図と写真を組み合わせたサービスなどが簡単に提供できます。

Exifでは、緯度・経度情報を(1)北緯/南緯を示すGPSLatitudeRef、(2)緯度の数値を示すGPSLatitude、(3)東経/西経を示すGPSLongitudeRef、(4)緯度の数値を示すGPSLongitudeの4つのタグを使って表します(GPSデータとしては、高度、衛星のIDや位置、測地系なども記録できます)。緯度・経度の数値は度分秒形式で、Exif特有の表記法を用います。例えば、北緯35度41分7.74秒、東経139度48分7.74秒というGPSの緯度経度は、Exifでは次のような具合です(実際はバイナリ形式ですが、仕様書の説明形態に合わせて示します)。

(例)

GPSLatitudeRef : N
GPSLatitude    : 35/1,41/1,774/100
GPSLongitudeRef: E 
GPSLongitude   : 139/1,48/1,774/100

With Exif data description vocabulary in this site, Exif GPS data can be encoded as an RDF...

当サイトの定義しているExif data description vocabularyでは、今のところこのデータをRDFとして次のように表しています。

(例)

<IFD rdf:ID="Primary_Image">
 ...
 <gpsInfo_IFD_Pointer>
  <IFD>
   <gpsLatitudeRef>N</gpsLatitudeRef>
   <gpsLatitude>35/41/7.74</gpsLatitude>
   <gpsLongitudeRef>E</gpsLongitudeRef>
   <gpsLongitude>139/48/7.74</gpsLongitude>
  </IFD>
 </gpsInfo_IFD_Pointer>
</IFD>

... but the native Exif format is not compatible with geo: vocab, my Exif2rdf also generates geo: properties.

元のExifデータの形をあるていど尊重しているわけですが、汎用性に劣るので、当サイトのツールExif2rdfは、合わせてこのデータをGeo vocabularyのプロパティに変換して出力します。

(例)

<foaf:Image>
 ...
 <foaf:topic rdf:parseType="Resource">
  <geo:lat>35.685483333333</geo:lat>
  <geo:long>139.80215</geo:long>
 </foaf:topic>
</foaf:Image>

デジタル写真からExifデータをRDFとして抽出すれば、例えばXSLTを使って簡単に地図サービスへのリンクなどを加えることができます。

携帯電話デジカメ/メールによるウェブログ(moblog)のサービスにはGPSデータを扱う機能を備えたものがあるようですし、これらを地図上に表示したりする試みもいくつか登場しています。これらの多くはRSSを提供しているので、緯度・経度情報をgeo:で表現してここに含めてくれると(例えば次のように)面白いのですが。

(例)

<item rdf:about="http://www.kanzaki.com/works/2003/imagedesc/0817.jpg">
 <title>Summer Fest</title>
 <description>江東区森下のお祭り。御輿の行列が練習会場の前で…</description>
  ...
 <foaf:topic rdf:parseType="Resource">
  <geo:lat>35.685483333333</geo:lat>
  <geo:long>139.80215</geo:long>
 </foaf:topic>
</item>

位置データとデジタル画像とRSSを組み合わせて地図連動型アルバムをつくる実験を行っています(ここでは[Blogmapper]も利用しています)。また、画像のメタデータ表現については、以下のページも参照してください。

GPSのトラック・ログ

The GPStrack by Matt Biddulph is another example to utilize GPS data as RDF.

ハンディGPSを使って移動ポイントを記録しているアウトドア派なら、Matt Biddulphの[GPSTRACK]も面白いかも知れません。xmlns:gps="http://hackdiary.com/ns/gps#" と名前空間URIを宣言した上で、gps:Tracklogクラスとgps:trackpointプロパティを使ってGPSが記録した日時と緯度経度を記述していきます。

(例)

<gps:Tracklog>
 <gps:trackpoint
   dc:date='2003-08-08T06:58:47Z'
   rdf:type='http://www.w3.org/2003/01/geo/wgs84_pos#Point'
   geo:lat='52.5816178322'
   geo:long='13.6952733994'/>
 <gps:trackpoint>
  <geo:Point>
   <dc:date>2003-08-08T06:59:15Z</dc:date>
   <geo:lat>52.5815534592</geo:lat>
   <geo:long>13.6953377724</geo:long>
  </geo:Point>
 </gps:trackpoint>
  ...
</gps:Tracklog>

この例では2通りのgps:trackpointの記述方法を挙げていますが、どちらもRDFとしては同じモデルです。1番目の、すべてをgps:trackpoint要素の属性にするのが、MattによるPythonプログラムgarmin2rdf.pyの出力です。

位置情報と距離

With lat/long data of two points, the distance between those points can be calculated.

2つの地点の緯度と経度が分かれば、2点間の直線距離を算出することができます。GeoURLの「ご近所さん」は、緯度・経度情報をもつメタデータを集積し、「近くにあるリソース」を見つける好例です。イベントカレンダーで好みの演奏会を探し、そこから近隣のレストラン情報をリストアップするといった応用が考えられます。

距離の計算