2016年09月12日
プログラミング不要、CustomObject(カスタム項目)で位置情報(Geocoding)APIを実装する
住所文字列から位置情報を取得するには Google Maps Geocoding API を使うのが一般的かと思います。
ある案件で用途が利用制限(Google Maps Geocoding API Usage Limits)に引っかかるなどの理由で別の方法を検討しなければならないケースがありました。
エリアが絞られている、あいまいな文字列への対応などを行わなくて良いケース(ユーザーの入力ではなく、予め用意されたカスタムフィールドの値などで検索するといったケース)では、PowerCMS の CustomObject を利用することで Geocoding APIを PowerCMS の DataAPIとして実装することができます。プログラミングは一切不要です。
カスタム項目のラベルを「位置情報」にカスタマイズする
この例では「標準カスタム項目」を利用します。「標準カスタム項目」とは、システムメニュー→ツール→カスタム項目画面で独自に定義するカスタム項目ではなく、PowerCMSの初期インストール段階で既に有効になっているカスタム項目を指します。「標準カスタム項目」はウェブサイト/ブログごとにラベルをカスタマイズすることができます。各ウェブサイトに設定がない場合はシステムのプラグイン設定で設定したラベルが使われます。ブログに設定がない場合は、ウェブサイト、ウェブサイトに設定がない場合はシステムのプラグイン設定で設定したラベルが使われます(常に上位オブジェクトのラベルが継承される※)。
※この機能を理解しておくと、例えば「スポーツニュース」ウェブサイトにおいて、野球ウェブサイト(ブログ)では「チーム」サッカーウェブサイト(ブログ)では「クラブ」というように、ラベルを複数使い分けることができます。
今回は、英語名(英)、項目名複数形(英)を「Location Info」、項目名(日)を「位置情報」とします。
カスタム項目にカスタムフィールドを作成する
システムオブジェクト | 種類 | 名前 | タグ名 | ベースネーム |
---|---|---|---|---|
カスタム項目 | テキスト | 緯度 | LocationLatitude | location_latitude |
カスタム項目 | テキスト | 経度 | LocationLongitude | location_longitude |
カスタムフィールドを大量に作成するケースでは、CSVからインポートする機能を利用すると便利です。以下、この例のサンプルファイルです。
今回、位置情報は国土地理院の位置参照情報ダウンロードサービスを利用します。以下のサイトから必要なCSVをダウンロードして、カスタム項目のインポート形式に修正、整形します。
以下、実際のファイルです。
DataAPIでカスタムオブジェクトを検索する
位置情報の検索にはDataAPIを使います。以下のようにGETリクエストを送ります。
https://localhost/mt/mt-data-api.cgi/v1/sites/1/customobjects?search=愛知県名古屋市千種区城山新町1丁目&searchFields=name
マッチした場合、下のようなJSONが返りますので、customFieldsから緯度、経度を取得します。
{"items":[{"modified_on":"20160912122317","keywords":null,"author":{"displayName":"Junnama Noda","userpicUrl":null},"folder":null,"id":"3967","set_period":null,"blog":{"id":"1"},"tags":[],"basename":"customobject","customFields":[{"value":"35.173186","basename":"location_latitude"},{"basename":"location_longitude","value":"136.957627"}],"authored_on":"20160912122317","body":null,"status":"Publishing","category_id":null,"name":"\u611b\u77e5\u770c\u540d\u53e4\u5c4b\u5e02\u5343\u7a2e\u533a\u57ce\u5c71\u65b0\u753a\uff11\u4e01\u76ee","period_on":"20160912122317","permalink":""}],"totalResults":"1"}
コメントを投稿する