PHP
CMS
concrete5
Geolocation

concrete5 8.3系で使えるGeoロケーション機能。これを活用した地図アドオンを公開予定

2017年12月にリリースされたconcrete5 バージョン8.3 で、Geoロケーション機能が追加されたので、使ってみたメモです。

Geoロケーション機能

concrete5 の管理画面の【システムと設定 > サーバー設定一覧 > ジオロケーション】 index.php/dashboard/system/environment/geolocation と進むと、下記のような画面が表示されます。
geoplugin.png

【テスト】ボタンを押すと、IPアドレスの情報から緯度経度の情報を取得できます。
geolocation.png

どう使うのか

記事作成時点(2018年2月2日)では、Geoロケーション機能のユーザー向けドキュメントは公開されていないので、ソースコードから調べてみます。

concrete5 のコアで使っている部分を探す

concrete5 のフォーム(問い合わせ等を作る)に、address(住所)という項目があります。addressでは、ユーザー(ホームページ閲覧者)のIPアドレスから、国や地域などを取得しています。 concrete/attributes/address/controller.phpを見ると、

                $geolocated = $this->app->make(GeolocationResult::class);
                $this->set('country', $geolocated->getCountryCode());
                $this->set('postal_code', $geolocated->getPostalCode());
                $this->set('state_province', $geolocated->getStateProvinceCode());
                $this->set('city', $geolocated->getCityName());

というコードがありました。concrete5本体でGeoロケーション機能を実行し、その結果をGeolocationResultクラスを使って活用できるようです。concrete5 はソースコードが公開されている CMS なので、このように調べる作業が楽ですね。

APIドキュメントを読む

開発者向けAPIドキュメントは公開されている(おそらく自動生成プログラムで作成されている)ので、GeolocationResultクラスのドキュメントを見てみます。
そうすると、getLatitude、getLongitudeというメソッドがあることが分かります。これらを使えば、緯度経度が取得できそうです。

書いてみたコード

    $geolocated = $this->app->make(\Concrete\Core\Geolocator\GeolocationResult::class);
    if ($geolocated) { // ジオロケーションが有効な場合
        $data_lat = $geolocated->getLatitude();
        $data_lng = $geolocated->getLongitude();
    } else { // ジオロケーションが無効な場合は、愛知県名古屋市中区栄2-2-1の緯度経度
        $data_lat = 35.16809895181293;
        $data_lng = 136.89892888069156;
    }

活用シーン

現在、オープンストリートマップの地図を表示するアドオンを作成しています。このアドオンでは、地図を新規追加するときに編集画面に地図を表示します。このときの初期位置の指定に、ジオロケーション機能を活用しています。
ジオロケーション機能を活用することで、地図の初期位置が、自分のいる位置の近辺になります。
地図を表示したい人が居る場所の近辺が、ホームページ上に表示したい地図の領域に近い場合に、地図を動かす作業が少なくて済みます。

アドオンは公開準備中

concrete5 のアドオンとして、公式サイトで公開に向けて準備中です。しばらくお待ちください。
アドオンの実際の活用例は、伏見駅から名古屋広小路伏見中駒ビルへの道のりです。