2017年12月にリリースされたconcrete5 バージョン8.3 で、Geoロケーション機能が追加されたので、使ってみたメモです。
Geoロケーション機能
concrete5 の管理画面の【システムと設定 > サーバー設定一覧 > ジオロケーション】 index.php/dashboard/system/environment/geolocation と進むと、下記のような画面が表示されます。
【テスト】ボタンを押すと、IPアドレスの情報から緯度経度の情報を取得できます。
どう使うのか
記事作成時点(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 のアドオンとして、公式サイトで公開に向けて準備中です。しばらくお待ちください。
アドオンの実際の活用例は、伏見駅から名古屋広小路伏見中駒ビルへの道のりです。