カスタム位置情報拡張 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
で、テキストフィールドまたは数値フィールドにすることができます。
データの挿入とアップロード
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 を使用すると、ローカルでオフラインで保存している場合でも、場所を参照するデータを簡単に生成できます。また、接続が確立されたときに、その情報を順次他のデバイスに共有できます。
空間検索を実行しています
検索を実行するには、次のように検索タイプのいずれかを選択します。 すべてのリクエストに共通の入力パラメータは、レイヤー名です。
検索タイプ | 説明 | クラス名 |
---|---|---|
近接性 | 指定した半径内にある形状を中心から取得します。 | CLE2ProximityRequest |
Corridor | 一連の座標で指定されたルートに沿って形状を取得します。 | CLE2CorridorRequest |
Bounding Box | 指定した長方形の地理的領域内のジオメトリを取得します。 | CLE2BoundingBoxRequest |
quadkey | 指定した quadkey 内にあるジオメトリを取得します。 | CLE2QuadkeyRequest |
属性 | 指定したクエリーに一致するすべてのジオメトリを取得します。 このタイプの検索はオンラインでのみ利用できます。 | CLE2AttributeRequest |
各検索リクエストタイプでは、次に示すような共通のパラメータがサポートされています。
setter メソッド | 説明 | 値の例 |
---|---|---|
setGeometry(CLE2GeometryType) | 結果として指定する形状タイプを指定します(オンラインのみ)。以下の「検索結果について」の詳細を参照してください。 |
|
setCachingEnabled(boolean) | デフォルトはです false 。 有効にすると、このようなオンライン検索リクエストから受信したジオメトリがローカルに保存されます。 | |
setQuery(String) | 現在、オンラインリクエストでのみ利用できます。 この変数を使用すると、ユーザーのジオメトリ属性にクエリーフィルタを指定して、フィルタを通過するジオメトリのみが返されるようにできます。 簡単な等価演算子と比較演算子を使用した自由形式のテキスト。 |
検索リクエストオブジェクトを作成し、必要に応じて設定したら execute(CLE2ResultListener)
、そのメソッドを呼び出します。 検索の結果が、指定されたリスナーに配信されます。 CLE2Result
を呼び出し getGeometries()
て、検索条件に一致するジオメトリをオブジェクトから取得できます。 この形状結果のリストには、次のタイプのオブジェクトが含まれている可能性があります。
クラス | ジオメトリの説明 | 関連する取得メソッド |
---|---|---|
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
アレイが含まれています。
ローカルおよび完全な検索結果について
ユーザーがアップロードしたデータの処理中に CLE2 は、ジオメトリを内部固定グリッドで分割するルックアップインデックスを作成します。 ジオメトリが複数のグリッドタイルにまたがる場合、検索インデックスには、アップロードされたジオメトリのより小さなスライスが含まれている可能性があります。 この動作では、最初に送信されたジオメトリの関連する部分のみを返すことができるため、応答サイズと処理時間を削減できるため、検索パフォーマンスの向上と最適化された戻り値を実現できます。
検索を実行する前に、検索領域の周囲のタイル内にある形状の一部のみに関心があるか(つまり、タイル状の「ローカル」形状)、または元々アップロードされた完全な形状を受け取るかを指定できます。
次の 3 つのオプションを使用して、すべての結果を要求するか、ローカルの結果を要求するかを定義できます。 次のオプションは、すべての検索タイプで使用できます。
CLE2GeometryType の値 | 意味 |
---|---|
FULL | 結果には、アップロードされた元の形状が含まれます。 |
LOCAL | 結果には、到達可能なタイルの検索領域内にある処理済みの形状が含まれています。 |
NONE | 形状はまったく返されません。指定した検索に一致する形状のプロパティ / 属性のみが返されます。 |
プロキシミティ検索要求の例
カスタムの場所検索を実行するには、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
}
}
};