2008-10-02

Aptana Jaxer から Mextractr を使ってメモから位置表現と緯度経度を抽出する(後編)

Aptana Jaxer から Mextractr を使ってメモから位置表現と緯度経度を抽出する(前編)
Golazo MA4 は Mextractr メタデータ自動抽出 API も使って、メモから位置情報を自動抽出しています。... Google Maps API を使って、位置表現から緯度経度を求めています。Google Maps API をどのように呼び出しているかは、後編で紹介しようと思います。
Golazo MA4Mextractr メタデータ自動抽出 API を使って抽出した位置表現の緯度経度を Google Maps API (Geocoding via HTTP) を使って求めています。Google Maps API というと JavaScript API のイメージが強大ですが、REST API もサポートしてたりするのです。

Golazo MA4 から Google Maps API をどう呼び出しているか、実際のソースコードを引用して紹介します。

// Google Maps API - Geocoding via HTTP
// http://code.google.com/apis/maps/documentation/services.html#Geocoding_Direct
var url = 'http://maps.google.com/maps/geo?' +
$.param({ q: text, output: 'xml', key: Golazo.GOOGLE_APIKEY });

Google Maps API の URL とクエリを準備します。クエリの URL エンコードは jQuery を使っています。text は抽出対象のテキストです。apikey は Google Maps API キー です。output は出力形式です。省略すると json になりますが、eval が好みじゃないので XML を取得してから JSON に変換するアプローチとしています。

var xml;
try {
xml = Jaxer.Web.get(url, { as: 'xml' });
} catch (e) {
throw new Error(''+e);
}

Google Maps API を GET メソッドで呼び出して、実行結果の XML を DOMDocument オブジェクトとして取得しています。as プロパティに xml を指定すると、XML をパースしてくれます。

// jQuery XML to JSON Plugin
// http://fyneworks.com/jquery/xml-to-json/
var kml = $.xml2json(xml, true);

jQuery XML to JSON Plugin を使って XML を JavaScript オブジェクトに変換しています。第2引数の true は、要素数に関わらず Array オブジェクトに変換することを意味しています。

//var code = kml
//.Response[0]
//.Status[0]
//.code[0]
//.text;

実行結果を表すコードを参照できますが、コード分類が大雑把な印象で、具体的なメッセージも付与されないため、エラーであっても処理を継続しています。ですので、コメントアウトしてあります。

var places = (kml.Response[0].Placemark || [])
.map(function(placemark) {

//var address = placemark
//.AddressDetails[0]
//.Country[0]
//.AddressLine[0]
//.text;

var coordinates = placemark
.Point[0]
.coordinates[0]
.text
.split(/,/);

return {
//address: address,
latitude: coordinates[1],
longitude: coordinates[0],
altitude: Golazo.WHERE_TOKYO.altitude
};
});

return places;

実行結果から緯度経度を取り出して、配列にまとめています。抽出対象のテキストから、さらに具体的な位置表現をも得られます。が、今回は使っていないので、コメントアウトしています。address 変数がそれです。

なお Mextractr メタデータ自動抽出 API は、代表的な地名(都市名などかな?)のとき、実行結果に緯度経度を付与して返却してくれます。ただ、すべての位置表現に対して、緯度経度が付与されるわけではないので、Google Maps API を使って、位置表現から緯度経度を求めています。

0 件のコメント: