• このエントリーをはてなブックマークに追加


2012-07-29 11:07 追記

GeoHex バージョン3 がとっくに出てますね.

CPAN に上がっている Geo::Hex はバージョン2 までのサポートのため,バージョン3 に対応したものはないものか,と探していたら,GitHub にありました!モジュール名は Geo::Hex3

% perl -MData::Dumper -MGeo::Hex3 -e 'print Dumper getZoneByLocation(35.181446, 136.906488, 8)'
$VAR1 = bless( {
                 'y' => -11766,
                 'lat' => '35.1823554502528',
                 'lon' => '136.9059594574',
                 'x' => 33146,
                 'code' => 'XM53766231'
               }, 'Geo::Hex::Zone' );

これを使うのがよさげです.

はじめに

昨日参加した ジオメディアサミット名古屋(ハッシュタグ: #gms2012)で気になった「GeoHex」,これを Perl で使うためのモジュールがあるかどうかを探したら,すぐに見つかりました:

以下,このモジュール Geo::Hex をインストールするにあたり,ちょこっとだけつまずいたので,その経緯と解決を図ってみたお話です.

地図投影変換ライブラリ「PROJ.4」 をインストールする

これが必要っぽいので,まずインストールします.

% brew install proj

Geo::Hex をインストールする

% cpanm Geo::Hex
--> Working on Geo::Hex
Fetching http://www.cpan.org/authors/id/K/KO/KOKOGIKO/Geo-Hex-v0.0.2.tar.gz ... OK
Configuring Geo-Hex-v0.0.2 ... OK
==> Found dependencies: Geo::Proj4
--> Working on Geo::Proj4
Fetching http://www.cpan.org/authors/id/M/MA/MARKOV/Geo-Proj4-1.03.tar.gz ... OK
Configuring Geo-Proj4-1.03 ... N/A
! Configure failed for Geo-Proj4-1.03. See /Users/issm/.cpanm/build.log for details.
! Bailing out the installation for Geo-Hex-v0.0.2. Retry with --prompt or --force.

Geo::Proj4 をインストールするところで失敗していますねぇ.

Geo::Proj4 のインストールを詳しく見てみる

% cpanm -v Geo::Proj4
...
Checking dependencies from MYMETA.json ...
Checking if you have ExtUtils::MakeMaker 0 ... Yes (6.62)
Building and testing Geo-Proj4-1.03 ... cp lib/Geo/Proj4.pm blib/lib/Geo/Proj4.pm
cp lib/Geo/Proj4.pod blib/lib/Geo/Proj4.pod
/Users/issm/perl5/perlbrew/perls/perl-5.12.4/bin/perl /Users/issm/perl5/perlbrew/perls/perl-5.12.4/lib/5.12.4/ExtUtils/xsubpp  -typemap /Users/issm/perl5/perlbrew/perls/perl-5.12.4/lib/5.12.4/ExtUtils/typemap -typemap typemap  Proj4.xs > Proj4.xsc && mv Proj4.xsc Proj4.c
cc -c  -I./include -fPIC -fno-common -DPERL_DARWIN -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include -O3   -DVERSION=\"1.03\" -DXS_VERSION=\"1.03\"  "-I/Users/issm/perl5/perlbrew/perls/perl-5.12.4/lib/5.12.4/darwin-2level/CORE"   Proj4.c
Proj4.xs:5:10: fatal error: 'projects.h' file not found
#include <projects.h>
         ^
1 error generated.
make: *** [Proj4.o] Error 1
FAIL
! Installing Geo::Proj4 failed. See /Users/issm/.cpanm/build.log for details.

ヘッダファイル projects.h が存在しないことが原因のようです.

% find /usr/local/include -name projects.h
%

うーん,たしかに存在しない.

ちなみに,proj_api.h というヘッダファイルは次のように見つかります:

% find /usr/local/include -name proj_api.h
/usr/local/include/proj_api.h
%

PROJ.4 を手動でインストールしてみる

% curl -LO "http://download.osgeo.org/proj/proj-4.8.0.tar.gz"
% tar zxvf proj-4.8.0.tar.gz
% cd proj-4.8.0
% find . -name projects.h
./src/projects.h
%

あ,ダウンロードしたソースコードパッケージには入ってますね.続いてビルド&インストール.

% ./configure --prefix=$HOME/local
% make
% make install

インストール完了.さて,projects.h は?

% find ~/local/include -name proj_api.h
/Users/issm/local/include/proj_api.h
% find $HOME/local/include -name projects.h
%

...インストールされていません.

この件についてググってみる

次のページにたどり着きました:

これによると,

projects.h is intentionally private. If a package needs it then that package is “special” and should either be co-built with PROJ.4, or do something special to get access to projects.h.

#159 (projects.h not installed) – PROJ.4

とのこと.ざっと訳すと次のような感じになりましょうか:

projects.h は意図的に private なんだ.もしパッケージがそれを必要とするのなら,そのパッケージは「特別」で,PROJ.4 と co-build されるか projects.h にアクセスできる特別な何かをすべきだね.

projects.h をソースコードパッケージからもってくる

そんなわけで,ソースコードパッケージにある src/projects.h を,/usr/local/include 下に置くことで解決を図ってみます.

% cp src/projects.h /usr/local/Cellar/proj/4.8.0/include/
% cd /usr/local/include
% ln -s ../Cellar/proj/4.8.0/include/projects.h
% find /usr/local/ -name projects.h
/usr/local//Cellar/proj/4.8.0/include/projects.h
/usr/local//include/projects.h
%

改めて Geo::Proj4 モジュールをインストールする

% cpanm -v Geo::Proj4
...
Checking dependencies from MYMETA.json ...
Checking if you have ExtUtils::MakeMaker 0 ... Yes (6.62)
Building and testing Geo-Proj4-1.03 ... cp lib/Geo/Proj4.pm blib/lib/Geo/Proj4.pm
cp lib/Geo/Proj4.pod blib/lib/Geo/Proj4.pod
/Users/issm/perl5/perlbrew/perls/perl-5.12.4/bin/perl /Users/issm/perl5/perlbrew/perls/perl-5.12.4/lib/5.12.4/ExtUtils/xsubpp  -typemap /Users/issm/perl5/perlbrew/perls/perl-5.12.4/lib/5.12.4/ExtUtils/typemap -typemap typemap  Proj4.xs > Proj4.xsc && mv Proj4.xsc Proj4.c
cc -c  -I./include -fPIC -fno-common -DPERL_DARWIN -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include -O3   -DVERSION=\"1.03\" -DXS_VERSION=\"1.03\"  "-I/Users/issm/perl5/perlbrew/perls/perl-5.12.4/lib/5.12.4/darwin-2level/CORE"   Proj4.c
Running Mkbootstrap for Geo::Proj4 ()
chmod 644 Proj4.bs
rm -f blib/arch/auto/Geo/Proj4/Proj4.bundle
LD_RUN_PATH="/usr/local/lib" env MACOSX_DEPLOYMENT_TARGET=10.3 cc  -bundle -undefined dynamic_lookup -L/usr/local/lib -L/usr/lib -fstack-protector Proj4.o  -o blib/arch/auto/Geo/Proj4/Proj4.bundle 	\
	   -L/Users/issm/.cpanm/work/1343471544.33778/Geo-Proj4-1.03/lib -lproj  	\
 
chmod 755 blib/arch/auto/Geo/Proj4/Proj4.bundle
cp Proj4.bs blib/arch/auto/Geo/Proj4/Proj4.bs
chmod 644 blib/arch/auto/Geo/Proj4/Proj4.bs
Manifying blib/man3/Geo::Proj4.3
PERL_DL_NONLAZY=1 /Users/issm/perl5/perlbrew/perls/perl-5.12.4/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t
t/10utm.t ...... ok     
t/20clark80.t .. ok     
t/99pod.t ...... skipped: Test::Pod 1.00 required for testing POD
All tests successful.
Files=3, Tests=64,  0 wallclock secs ( 0.03 usr  0.02 sys +  0.09 cusr  0.01 csys =  0.15 CPU)
Result: PASS
Files found in blib/arch: installing files in blib/lib into architecture dependent library tree
Installing /Users/issm/perl5/perlbrew/perls/perl-5.12.4/lib/site_perl/5.12.4/darwin-2level/auto/Geo/Proj4/Proj4.bs
Installing /Users/issm/perl5/perlbrew/perls/perl-5.12.4/lib/site_perl/5.12.4/darwin-2level/auto/Geo/Proj4/Proj4.bundle
Installing /Users/issm/perl5/perlbrew/perls/perl-5.12.4/lib/site_perl/5.12.4/darwin-2level/Geo/Proj4.pm
Installing /Users/issm/perl5/perlbrew/perls/perl-5.12.4/lib/site_perl/5.12.4/darwin-2level/Geo/Proj4.pod
Installing /Users/issm/perl5/perlbrew/perls/perl-5.12.4/man/man3/Geo::Proj4.3
Appending installation info to /Users/issm/perl5/perlbrew/perls/perl-5.12.4/lib/5.12.4/darwin-2level/perllocal.pod
OK
Successfully installed Geo-Proj4-1.03
Installing /Users/issm/perl5/perlbrew/perls/perl-5.12.4/lib/site_perl/5.12.4/darwin-2level/.meta/Geo-Proj4-1.03/install.json
Installing /Users/issm/perl5/perlbrew/perls/perl-5.12.4/lib/site_perl/5.12.4/darwin-2level/.meta/Geo-Proj4-1.03/MYMETA.json
1 distribution installed

XSのコンパイル部分も無事パスし,Geo::Proj4 がインストールされました!

% cpanm Geo::Hex
--> Working on Geo::Hex
Fetching http://www.cpan.org/authors/id/K/KO/KOKOGIKO/Geo-Hex-v0.0.2.tar.gz ... OK
Configuring Geo-Hex-v0.0.2 ... OK
Building and testing Geo-Hex-v0.0.2 ... OK
Successfully installed Geo-Hex-v0.0.2
1 distribution installed

Geo::Hex のインストールも問題ないですね!

% perl -MGeo::Hex -le 'print latlng2geohex(35.181446, 136.906398, 16)'
quh0pot

おぉ,GeoHexだーw

おわりに

以上,Geo::Hex モジュールをインストールするにあたり,その依存モジュール Geo::Proj4 のインストールでつまずき,解決を図ってみたお話でした.

さて,GeoHex 使って何かアプリとか作ってみたいなー.