
だいぶ再発明感があるのですが、緯度経度データを簡単に変換出来るモジュールを作りました。
Geo::Coordinates::Converter CPANにうp済みです。
既存で似た者は結構あったのですが、どれも変換処理がdatumのメソッド名直書きとか値がハードコードされてたりで、自由度低めだったので新しく作りました。
測地系/フォーマット等をプラグインっぽく簡単に追加出来る様にして座標周りのフレームワークとして使える様に実装しました。
使い方は
use strict;のような感じです。
use warnings;
use Geo::Coordinates::Converter;my $geo = Geo::Coordinates::Converter->new( lat => '35.65580', lng => '139.65580', datum => 'wgs84' );
my $point = $geo->convert( tokyo => 'dms' );print $point->lat;
print $point->lng;
変換精度が物を言うような所も有り、実装はだいぶ悩みました。
測地系の変換方法やフォーマット等もユーザー側で変更出来るように作ってあるので物好きな人が変換エンジンを公開してくれれば面白そうです。
標準ではdegree/dms変換とtokyo測地系/wgs84/世界測地系(jgd2000)等の相互変換が可能です。
東経134度27分9秒9867″みたいなフォーマットは入れてませんが、簡単に作れます。
どっちにしろ日本人くらいしか使わなさそうなので、入れちゃっても良かったかもです。
tokyo測地系はメッシュ情報を使わない簡易的な方法なので、メッシュ使って厳密にやる場合は各自実装する必要が有ります。
Web用途に限れば添付してる物だけで十分っぽいです。
内部的にはdegreeで値を持って相互変換するようにしてあります。
測地系の追加はGeo::Coordinates::Converter::Datum以下にWgs84とかを参考にしながら新しくパッケージを置けば自動的に使える様になります。
測地系変換は三次元直交座標に変換する方法をとってます。
フォーマットはG::C::Converter::Format以下に作って
Geo::Coordinates::Converter->add_default_formats('locapoint');とすれば追加出来ます。こんだけカスタマイズ出来るって所が自信の無さの現れですが。
Posted by Yappo at 2006年11月07日 20:42 | TrackBack | Perl新モジュール乙です。
ちなみに、Location::GeoToolは一応formatもdatumも新しいメソッドを追加する仕組みはあったのですが...。
(というかデフォルトのメソッド自体その仕組みで追加してます)
ついでに言えば測地系変換のエンジン自体置き換えられるようになってたので、(それでXSとPPのエンジン交換可能だった)三次元直交座標に変換するエンジンへの置き換えも可能だったのではないかと思います。
(ただし、楕円体の扁平率と地球中心のシフトパラメータは共用でしたが)
作ったのがごっつい前なので、全体の作りが古臭いのは否めませんが...。
ソースみますた。
なるほど、測地系変換で持つパラメータ数がLocation::GeoToolより多いのですね...。