SDK for Android 開発者ガイド

カスタム位置情報拡張 2.

Custom Location Extension 2 ( CLE2 )を使用すると、カスタム地理空間情報をモバイルアプリケーションに簡単に配布できます。 CLE2 を使用すると、空間コンテンツをローカルデータベースにプログラム的に挿入し、データ共有のためにサーバーにアップロードできます。 オンライン検索またはオフライン検索を実行することもできます。 これらの機能により、 SDK for Android は、最適化されたアルゴリズムを使用して地理空間情報の挿入およびクエリを可能にする軽量空間ストレージソリューションに効果的になります。

この機能をサポートするクラスは、にあり com.here.android.mpa.customlocation2ます。 CLE2 では、位置およびジオメトリのリクエストに特定のインタフェースを使用する代わり CLE2PointGeometryに、すべてのユースケースを 1 つの柔軟なアプローチで統合します。返される値には、常に 0 ~ N のユーザー定義属性のセットとともに、任意の情報を表すジオメトリタイプ(など)が含まれます。 これらの属性には暗黙的な構造はありません。 これらの属性は Map 、キー値および属性値の 1 つとして使用できます。

これらの CLE2 機能の使用例を次に示します。

  • 半径 2 km 以内のすべてのユーザーのカスタム POI を表示します。
  • 多角形で定義されたエリアを使用して、ドイツ国内のすべての顧客オフィスをオンラインまたはオフラインで検索し、オフィスの受付の電話番号、従業員数、およびその他の詳細情報を表示します。
  • リアルタイムまたはオフライン モードで図形を編集し、それらの図形に対するクエリを実行して、その図形が他の既存の固定図形やその他の基本的な仮想的なフェンスソリューションと交差する場合に通知を受け取ります。 たとえば、位置が GPS の動きに関連する船が船乗り場の近くにある場合など、これを「移動中のプラットフォーム」とすることができます。
  • 都市の施設や屋外のバスケットボールコートなど、 HERE Map Data の一部として公式には利用できないジャンル別施設を共有できます。
  • ハイキングトレイルなどの任意のデータに関連付けられている GPS データを、オフライン モード中であっても高速で保持します。
  • 特定のルートに近い特定のタイプのオブジェクトを検索します。

レイヤーとフィルタリング

すべてのデータがレイヤーの形式で整理されます。 情報をアップロード、保存、または検索する場合、レイヤー名の文字列が指定され、関連する情報をより適切にフィルタリングするために使用できます。

形状の属性を確認することで、さらにフィルタリングできます。 これらの属性は、などのジオメトリにリンクされたユーザー定義のフィールド CLE2PointGeometryで、テキストフィールドまたは数値フィールドにすることができます。

注 : CLE2 の検索は、アプリ資格情報によってレイヤーごとに制限されます。 カスタム位置情報レイヤーのアクセス制限を管理するには、カスタム位置情報管理者に連絡してください。 お持ちでない場合は、サービスサポート連絡 して詳細を確認してください

データの挿入とアップロード

To upload data to the CLE2 servers, you can use the web interface or REST APIs. Refer to the following User Guide for more details: https://here-tech.skawa.fun/documentation .

SDK for Android を使用して、ローカルおよびサーバーにデータを挿入することもできます。 HERE SDK を使用すると、ローカルでオフラインで保存している場合でも、場所を参照するデータを簡単に生成できます。また、接続が確立されたときに、その情報を順次他のデバイスに共有できます。

空間検索を実行しています

検索を実行するには、次のように検索タイプのいずれかを選択します。 すべてのリクエストに共通の入力パラメータは、レイヤー名です。

表 1. クラスを検索します
検索タイプ 説明 クラス名
近接性 指定した半径内にある形状を中心から取得します。 CLE2ProximityRequest
Corridor 一連の座標で指定されたルートに沿って形状を取得します。 CLE2CorridorRequest
Bounding Box 指定した長方形の地理的領域内のジオメトリを取得します。 CLE2BoundingBoxRequest
quadkey 指定した quadkey 内にあるジオメトリを取得します。 CLE2QuadkeyRequest
属性 指定したクエリーに一致するすべてのジオメトリを取得します。 このタイプの検索はオンラインでのみ利用できます。 CLE2AttributeRequest

各検索リクエストタイプでは、次に示すような共通のパラメータがサポートされています。

表 2. 共通 CLE2Request メンバー
setter メソッド 説明 値の例
setGeometry(CLE2GeometryType) 結果として指定する形状タイプを指定します(オンラインのみ)。以下の「検索結果について」の詳細を参照してください。
  • CLE2GeometryType.FULL
  • CLE2GeometryType.LOCAL
  • CLE2GeometryType.NONE
setCachingEnabled(boolean) デフォルトはです false。 有効にすると、このようなオンライン検索リクエストから受信したジオメトリがローカルに保存されます。  
setQuery(String) 現在、オンラインリクエストでのみ利用できます。 この変数を使用すると、ユーザーのジオメトリ属性にクエリーフィルタを指定して、フィルタを通過するジオメトリのみが返されるようにできます。 簡単な等価演算子と比較演算子を使用した自由形式のテキスト。  

検索リクエストオブジェクトを作成し、必要に応じて設定したら execute(CLE2ResultListener) 、そのメソッドを呼び出します。 検索の結果が、指定されたリスナーに配信されます。 CLE2Result を呼び出し getGeometries()て、検索条件に一致するジオメトリをオブジェクトから取得できます。 この形状結果のリストには、次のタイプのオブジェクトが含まれている可能性があります。

表 3. ジオメトリの戻り値のタイプ
クラス ジオメトリの説明 関連する取得メソッド
CLE2Geometry 他のすべてのジオメトリのベースクラスは、ユーザー定義の属性を含む値を返します。 Map<String, String> getAttributes()
CLE2PointGeometry 座標内の点を表します。 Point WKT の A に関連します。 GeoCoordinate getPoint()
CLE2MultiPointGeometry 複数のポイントを座標配列として表します。 MultiPoint WKT の A に関連します。 List<GeoCoordinate> getMultiPoint()
CLE2PolylineGeometry ポリラインをとして表し GeoPolylineます。 WKT LineString オブジェクトに関連付けられます。 GeoPolyline getPolyline()
CLE2MultiPolylineGeometry 複数の折れ線をの配列として表し GeoPolylineます。 WKT MultiLineString オブジェクトに関連付けられます。 List<GeoPolyline> getPolylines()
CLE2PolygonGeometry GeoPolygon 外側のリングにはが、 GeoPolygon 内側の穴にはの配列を持つ多角形を表します。 このジオメトリのすべてのリングを含む WKT ポリゴンオブジェクトに関連付けられます。 GeoPolygon getOuterRing(), List<GeoPolygon> getInnerRings()
CLE2MultiPolygonGeometry 複数のポリゴンをの配列として表し CLE2GeometryPolygonます。 MultiPolygon WKT のオブジェクトに関連付けられます。 List<CLE2PolygonGeometry> getPolygons()

OpenGIS ( 地理情報の実装標準 ) および WKT 表現形式では、ポリゴンの概念は、 1 つの外側のリングポリゴンに 0 個以上の内側の穴のポリゴンを加えたもので定義されます。 CLE2PolygonGeometry このため、クラスに GeoPolygon はとセカンダリ GeoPolygon アレイが含まれています。

プロキシミティ検索要求の例

カスタムの場所検索を実行するには、CLE2ProximityRequest(String layerId, GeoCoordinate center, int radius)またはCLE2ProximityRequest(List<String> layerIds, GeoCoordinate center, int radius)コンストラクタのメソッドを使用してCLE2ProximityRequestを作成する必要があります。

近接検索では GeoCoordinate 、特定の場所の指定した半径内にあるカスタムの場所のリストが返されます。 たとえば、次のコードは、フランクフルト中央駅から半径 8 km 以内に存在する、前述の Stores レイヤー内のすべての場所を検索する方法を示しています。

String layerId = "HERE_SITES";
int radius = 8000; // 8 km
GeoCoordinate location = new GeoCoordinate(49.196261, -123.004773);
CLE2ProximityRequest req = new CLE2ProximityRequest(layerId, location, radius);
req.execute(new CLE2Request.CLE2ResultListener() {
  @Override
  public void onCompleted(CLE2Result result, String error)
  {
    // if CLE2Error.NONE.equals(error) is true, the request was successful
    if (error.equals(CLE2Error.NONE)) {
      List<CLE2Geometry> gemetry = result.getGeometries();
      for (CLE2Geometry geo : gemetry) {
        java.util.Map<String, String> attributeMap = geo.getAttributes();
        String name = attributeMap.get("NAME1");
        double distance = geo.getDistance();
      }
    }
  }
});

layerId このパラメータは、カスタムの場所のセットを表します。 たとえば、layerID="HERE_SITES" ドイツの HERE の場所を含むサンプルレイヤーを表します。 また、異なるレイヤーで近接検索を同時に実行することもできます。


List<String> layerIds = new ArrayList<String>();
layerIds.add("LAYER_1");
layerIds.add("LAYER_2");
int radius = 500; // 500 meters
GeoCoordinate location = new GeoCoordinate(50.113905,8.677608);
CLE2ProximityRequest req = new CLE2ProximityRequest(layerIds, location, radius);
req.execute(new CLE2Request.CLE2ResultListener() {
  @Override
  public void onCompleted(CLE2Result result, String error)
  {
    // if CLE2Error.NONE.equals(error) is true, the request was successful
    if (error.equals(CLE2Error.NONE)) {
      List<CLE2Geometry> gemetry = result.getGeometries();
      for (CLE2Geometry geo : gemetry) {
        java.util.Map<String, String> attributeMap = geo.getAttributes();
        String name = attributeMap.get("NAME1");
        double distance = geo.getDistance();
      }
    }
  }
});

リクエストオブジェクトを作成した後 execute(ResultListener) 、メソッドを呼び出して検索リクエストを起動し、検索結果をリッスンできます。

リクエストにフィルタを追加することもできます。 フィルターは、位置一致の検索クエリごとに評価される、 JavaScript に似た式です。 指定する true と、式が評価される場所のみが返されます。 たとえば、カスタムの location パラメータが rating greater than 3 および name である場所の結果をフィルタリングする場合 "MyPlace23"は、次の手順を実行します。


String layerId = "HERE_SITES";
int radius = 8000; // 8 km
GeoCoordinate location = new GeoCoordinate(49.196261, -123.004773);
CLE2ProximityRequest req = new CLE2ProximityRequest(layerId, location, radius);
String filter = "CITY == 'Burnaby' && NAME1 != 'MyPlace'";
req.setQuery(filter);
req.execute(new CLE2Request.CLE2ResultListener() {
  @Override
  public void onCompleted(CLE2Result result, String error)
  {
    // if CLE2Error.NONE.equals(error) is true, the request was successful
    if (error.equals(CLE2Error.NONE)) {
      List<CLE2Geometry> gemetry = result.getGeometries();
      for (CLE2Geometry geo : gemetry) {
        java.util.Map<String, String> attributeMap = geo.getAttributes();
        String name = attributeMap.get("NAME1");
        double distance = geo.getDistance();
      }
    }
  }
});

結果を反復処理しています

CLE2Result オブジェクトには、検索結果のジオメトリのリストが含ま getGeometries() れ、メソッドで使用できるようになります。 さまざまな種類のジオメトリを返すことができるため、使用する前にタイプをテストすることをお勧めします。 たとえば CLE2ResultListener 、次の例のような方法でを使用できます。


CLE2ResultListener resultListener = new CLE2Request.CLE2ResultListener() {
  @Override
  public void onCompleted(CLE2Result result, String error) {
    if (!error.equals(CLE2Request.CLE2Error.NONE)) {
      // process search results
      for (CLE2Geometry geometry : result.getGeometries()) {
        if (geometry instanceof CLE2PointGeometry) {
          CLE2PointGeometry point = (CLE2PointGeometry) geometry;
          // work with point geometry data
        }
      }
    } else {
      // handle error
    }
  }
};