米国 Esri 社より、これから ArcGIS を用いたアプリの開発に携わる人の学習用にオープンソースのスターターアプリが提供されています。
スターターアプリは、以下の5種類があります。
Data Collection については、2019年8月に開催した「ArcGIS 開発者のための最新アプリ開発塾 2019」で紹介しています。
また、Maps App の ArcGIS API for JavaScript 版については、「すぐに使える! オープンソースのスターターアプリ: Maps App developed by ArcGIS API for JavaScript 編」で紹介しています。
今回は、この中から Nearby Places (Android 版) の機能の拡張を行ったので、その方法を紹介します。※Nearby Places には Android 版の他にも、JavaScript 版も公開されています。
Nearby Places の機能や使い方の詳細に関しては、こちらのリポジトリをご覧ください。
このリポジトリは、米国 Esri 社の Nearby Places の Readme.md を ESRI ジャパンにて翻訳したものです。
Nearby Places は、利用者が表示している地図の表示範囲にある興味のある場所を検索して表示します。また、表示された場所を選択することで、現在地からのルートを表示することができます。
Nearby Places は ArcGIS 開発ツールである ArcGIS Runtime SDK for Android を使用して開発されています。そのため、地図の機能拡張をするには ArcGIS Runtime SDK for Android を用いります。ArcGIS Runtime SDK for Android には、様々な機能を実現するためのクラスおよびメソッドが用意されています。アプリには予め用意されたカテゴリ(Food や Hotel 等)から場所を検索する機能があったため、今回はキーワードを自由に入力して検索できる機能を拡張しましたので、自由検索機能を実装するにあたっての要点を紹介します。
自由検索を実装する主な流れとしては、
① 検索するキーワードを入力し、実行処理を行う画面の作成
② 入力されたキーワードを元に検索を行い、対象のデータを取得
③ 取得されたデータを編集し、画面上に表示する
というものになります。
今回は機能の中心となる②について紹介していきます。
検索機能を実装するために、LocatorTask クラス内にある geocodeAsync メソッドを使用します。
geocodeAsync メソッドはオーバーロードされて条件によって使い分け可能な同一名のメソッドが複数存在します。今回は Nearby Places の設計思想である、「表示している地図の表示範囲から興味のある場所を表示する」という仕様と合わせるため、引数に検索文字列と GeocodeParameters クラス(検索範囲を指定可能)のインスタンスを設定するメソッドを使用します。
① はじめに引数1で設定するキーワードを取得します。
// LayoutInflater にてキーワード入力画面を取得
View view = LayoutInflater .inflate(検索画面のファイル名, container,false);
// キーワード入力欄情報の取得
SearchView searchView = view.findViewById(画面の検索欄に設定されたid);
// キーワード入力欄の入力値を取得
CharSequence charSequence = searchView.getQuery();
// キーワードを String 型で取得
String keyword = CharSequence.toString();
② 画面の表示範囲情報を取得します。
// MapFragment のインスタンス作成までの過程は割愛
MapFragment mapFragment;
// MapFragment から MapView クラスのプロパティを取得
MapView mapView = mapFragment.getMapView();
// 画面で表示されている中心の位置情報を取得
Point g = mapView.getMapView().getVisibleArea().getExtent().getCenter();
③ 引数2で設定する GeocodeParameters クラスのインスタンスを作成します。
// GeocodeParameters クラスのインスタンスを作成
final GeocodeParameters parameters = new GeocodeParameters();
// ②で取得した表示範囲情報を設定
parameters.setPreferredSearchLocation(g);
// 検索結果の最大取得件数を設定
parameters.setMaxResults(10);
// 全てのカテゴリを検索対象とするためパラメータ:カテゴリコレクションに “POI” を設定
parameters.getCategories().add(“POI”);
④ ①、③で設定した値を引数に検索します。
// 実際に検索をしに行く Web サービスの URL
String locatorUrl = "https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer";
// LocationTask クラスのインスタンスを作成
LocatorTask sLocatorTask = new LocatorTask(locatorUrl);
// ロードが可能なリスナーの追加(※引数は複雑なため省略)
sLocatorTask.addDoneLoadingListener(~);
// ロード対象のリソースのメタデータを読み込み
sLocatorTask.loadAsync();
// キーワードを元に検索を実行
//(引数1=①のキーワード、引数2=③のGeocodeParameters クラスのインスタンス)
ListenableFuture<List<GeocodeResult>> results =
sLocatorTask.geocodeAsync(searchText, parameters);
このような手順を追うことによって自由検索を実装できます。
今回の機能を追加するにあたっては、Find Place というサンプルを一部参考にして構築しました。
自由検索の他にも多くのサンプルコードが提供されていますので、ArcGIS Runtime SDK for Android を用いて構築される方はご参考にしてください。
今回は 米国 Esri 社が提供しているオープンソースのスターターアプリの中から、ArcGIS Runtime SDK for Android で構築された Nearby Places というアプリのご紹介をしました。 これから ArcGIS を使った Android アプリの開発を始める方や、新しくアプリを作る際の参考などにしていただけたらと思います。初めに紹介しましたが、他にもスターターアプリが公開されていますので、ご興味がある方は「Open source starter apps」をご参照ください。
ArcGIS 関連ページ
・ArcGIS for Developers(ESRIジャパン製品ページ)
・ArcGIS for Developers 開発リソース集
・ArcGIS Runtime SDK for Android(ESRIジャパン製品ページ)
・ArcGIS Runtime SDK for Android(米国Esri ページ(英語))