屋内マップを統合
HERE Indoor Map には、マップ上でプライベート施設 を読み込んで表示し、操作する機能があります。 HERE Indoor Map の詳細については、『HERE Indoor Map ガイド』を参照してください。
カスタマイズされたフロアスイッチャーを備えた空港の施設 。 現在、 HERE SDK は プライベート 施設 のみをサポートしているため、施設 データはアプリ にのみ表示されます。デフォルトでは、マップに施設 は表示されません。 各施設 には、 HERE SDK 資格情報 に関連付けられた一意の施設 ID が割り当てられます。
VenueEngine を初期化
HERE Indoor Map API の使用を開始する前 に、インスタンスVenueEngine
を作成して開始する必要があります。 これは、マップの初期化後に行うことができますが、VenueEngine
を作成する最適なタイミングは 、マップがシーンをロードした後です。
private void loadMapScene() {
mapView.getMapScene().loadScene(MapScheme.NORMAL_DAY, mapError -> {
if (mapError == null) {
List<String> mapFeatures = new ArrayList<>();
mapFeatures.add(MapFeatures.EXTRUDED_BUILDINGS);
mapView.getMapScene().disableFeatures(mapFeatures);
try {
venueEngine = new VenueEngine(this ::onVenueEngineInitCompleted);
} catch (InstantiationErrorException e) {
Log.e(TAG, "SDK Engine instantiation failed");
e.printStackTrace();
}
} else {
Log.d(TAG, "Loading map failed: mapError: " + mapError.name());
}
});
}
VenueEngine
が初期化されると、コールバック が呼び出されます。 この時点から 、 VenueService
とVenueMap
の両方にアクセスできます 。 VenueService
は施設 の読み込みに使用 され、VenueMap
はマップ上の施設 を制御します。 コールバック 内では、必要なすべてのリスナーを追加してから VenueEngine
、を開始する必要があります。 ユーザーが既定のコレクション HERE リソースネームを使用しない場合、プラットフォーム マップカタログ HRN
は、VenueEngine
の起動後に設定できます。
注
HERE リソースネーム の設定は任意です。 ユーザーが HERE リソースネーム を設定していない場合は、デフォルトのコレクション HERE リソースネーム が自動的に選択されます。 ユーザーが他のコレクションを使用する場合は、それぞれの HERE リソースネーム を設定できます。 HERE リソースネーム 値が見つからないか、または無効であることを示すエラーログが生成されます。 プロジェクトで有効な HERE リソースネーム文字列を受け取る方法の詳細については、『HERE Indoor Map ガイド』を参照してください。
private void onVenueEngineInitCompleted() {
VenueService service = venueEngine.getVenueService();
VenueMap venueMap = venueEngine.getVenueMap();
service.add(serviceListener);
service.add(venueListener);
venueMap.add(venueSelectionListener);
venueEngine.start((authenticationError, authenticationData) -> {
if (authenticationError != null) {
Log.e(TAG, "Failed to authenticate, reason: " + authenticationError.value);
}
});
if(HRN != "") {
service.setHrn(HRN);
}
}
VenueEngine
が開始されると、現在の資格情報 を使用して認証され、が開始 VenueService
されます。 VenueService
が初期化されると、メソッド VenueServiceListener.onInitializationCompleted()
が呼び出されます。
private final VenueServiceListener serviceListener = new VenueServiceListener() {
@Override
public void onInitializationCompleted(@NonNull VenueServiceInitStatus result) {
if (result == VenueServiceInitStatus.ONLINE_SUCCESS) {
Log.d(TAG, "VenueService initialization is successful.");
} else {
Log.e(TAG, "Failed to initialize venue service.");
}
}
@Override
public void onVenueServiceStopped() {}
};
トークン を使用して VenueEngine の起動
VenueEngine
は 、有効な HERE 屋内プラットフォーム プロジェクトトークン を使用して開始できます。 HERE platform プロジェクト管理およびプロジェクトワークフローの詳細については 、「 HERE platform プロジェクト管理」を参照してください
private void onVenueEngineInitCompleted() {
VenueService service = venueEngine.getVenueService();
VenueMap venueMap = venueEngine.getVenueMap();
service.add(serviceListener);
service.add(venueListener);
venueMap.add(venueSelectionListener);
venueEngine.start("TOKEN_GOES_HERE");
}
すべての屋内マップの一覧を表示
HERE Indoor Maps API では、アカウントおよび選択したコレクションでアクセス可能なすべてのプライベート施設 を一覧表示できます。 VenueMap
VenueInfo
施設 識別子、施設 ID 、および施設 名を含む要素を保持するリストが含まれています。
List<VenueInfo> venueInfo = venueEngine.getVenueMap().getVenueInfoList();
for (int i = 0; i< venueInfo.size(); i++) {
Log.d(TAG, "Venue Identifier: " + venueInfo.get(i).getVenueIdentifier() + " Venue Id: "+venueInfo.get(i).getVenueId() + " Venue Name: "+venueInfo.get(i).getVenueName());
}
施設を読み込んで表示
HERE Indoor Map API を使用すると、 ID によって施設 をロードおよび表示できます。現在の資格情報 セットの施設 ID を知っている必要があります。 施設 をロードして表示する方法はいくつかあります。 VenueService
で、新しい施設 ロードキューを開始する方法があります。
venueEngine.getVenueService().startLoading();
既存のロードキューに施設 ID を追加することもできます。
venueEngine.getVenueService().addVenueToLoad();
VenueMap
には、施設 をマップに追加するための 2 つの方法があります: selectVenueAsync()
および addVenueAsync()
。 どちらの方法も getVenueService().addVenueToLoad()
、 ID で施設 を読み込み、それをマップに追加するために使用します。 このメソッドで selectVenueAsync()
は、施設 も選択されます。
venueEngine.getVenueMap().selectVenueAsync();
venueEngine.getVenueMap().addVenueAsync();
施設がロードされると、VenueService
は次の VenueListener.onGetVenueCompleted()
メソッドを呼び出します。
private final VenueListener venueListener = (venueId, venueModel, online, venueStyle) -> {
if (venueModel == null) {
Log.e(TAG, "Failed to load the venue: " + venueId);
}
};
施設 が正常にロードされると 、メソッドaddVenueAsync()
を使用している場合 は、メソッドVenueLifecycleListener.onVenueAdded()
のみがトリガーされます。 メソッド selectVenueAsync()
を使用している場合 は、メソッドVenueSelectionListener.onSelectedVenueChanged()
もトリガーされます。
private final VenueSelectionListener venueSelectionListener =
(deselectedVenue, selectedVenue) -> {
if (selectedVenue != null) {
GeoCoordinates venueCenter = selectedVenue.getVenueModel().getCenter();
final double distanceInMeters = 500;
MapMeasure mapMeasureZoom = new MapMeasure(MapMeasure.Kind.DISTANCE, distanceInMeters);
mapView.getCamera().lookAt(
new GeoCoordinates(venueCenter.latitude, venueCenter.longitude),
mapMeasureZoom);
}
};
Venue
からVenueMap
を削除することもでき ます。この場合 、メソッドVenueLifecycleListener.onVenueRemoved()
がトリガーされます。
venueEngine.getVenueMap().removeVenue(venue);
ラベルテキストの設定
施設 のデフォルトのラベルテキスト設定を上書きできます。
VenueEngine
が初期化されると、コールバック が呼び出されます。 この時点から、VenueService
へのアクセス権があり ます。 オプションのメソッドsetLabeltextPreference()
を呼び出して、レンダリング時のラベルテキストの設定を指定できます。 既定のスタイルラベルのテキスト設定を上書きすると、次のオプションを並べ替え順によって設定が定義される一覧として設定できます。
- "occupant _name "
- "space_name"
- "internal_address"
- "space_type_name"
- "space_category_name"
これらは任意の順序で設定できます。 たとえば、ラベルテキストの環境設定に「occupant _name 」が含まれていない場合、リストの順序に基づいて「 space_name 」などに切り替わります。 設定が見つからない場合は、何も表示されません。
private void onVenueEngineInitCompleted() {
VenueService service = venueEngine.getVenueService();
VenueMap venueMap = venueEngine.getVenueMap();
service.add(serviceListener);
service.add(venueListener);
venueMap.add(venueSelectionListener);
venueEngine.start((authenticationError, authenticationData) -> {
if (authenticationError != null) {
Log.e(TAG, "Failed to authenticate, reason: " + authenticationError.value);
}
});
if(HRN != "") {
service.setHrn(HRN);
}
service.setLabeltextPreference(LabelPref);
}
施設の図と階数を選択
Venue
オブジェクトを使用すると、施設 の状態を制御できます。
getSelectedDrawing()
および setSelectedDrawing()
メソッドを使用すると、マップに表示される図面を取得して設定できます。 新しい図面を選択すると 、メソッドVenueDrawingSelectionListener.onDrawingSelected()
がトリガーされます。
ListView
でアイテムをクリックしたときに図面を選択する方法の例を次に示します。
@Override
public void onItemClick(AdapterView<?> parent, final View view, int position, long id) {
VenueModel venueModel = venue.getVenueModel();
venue.setSelectedDrawing(venueModel.getDrawings().get(position));
}
メソッド getSelectedLevelIndex()
および setSelectedLevelIndex()
を使用すると、レベルのリスト内の場所に基づいてレベルを取得および設定できます。 新しいレベルを選択する VenueLevelSelectionListener.onLevelSelected()
と、メソッドがトリガーされます。
次の例では、ListView
から反転したレベルリストに基づいてレベルを選択する方法を示します。
listView.setOnItemClickListener((parent, view, position, id) -> {
if (venueMap.getSelectedVenue() != null) {
venueMap.getSelectedVenue().setSelectedLevelIndex(maxLevelIndex - position);
}
});
描画とレベルを制御する UI スイッチャーの完全な例については、GitHub で利用できる IndoorMap Example アプリを参照してください。
施設のスタイルをカスタマイズ
VenueGeometry
オブジェクトの表示スタイルを変更できます。 ジオメトリスタイルオブジェクトまたはラベルスタイルオブジェクト、またはそのいずれかを作成し Venue.setCustomStyle()
、メソッドに提供する必要があります。
private final VenueGeometryStyle geometryStyle = new VenueGeometryStyle(
SELECTED_COLOR, SELECTED_OUTLINE_COLOR, 1);
private final VenueLabelStyle labelStyle = new VenueLabelStyle(
SELECTED_TEXT_COLOR, SELECTED_TEXT_OUTLINE_COLOR, 1, 28);
ArrayList<VenueGeometry> geometries =
new ArrayList<>(Collections.singletonList(geometry));
venue.setCustomStyle(geometries, geometryStyle, labelStyle);
識別子でスペースを選択
スペース、レベル、および図面の ID は、 スペースのspaces.getIdentifier()
呼び出しの場合などに、getIdentifier()
を使用して抽出できます。。 次に、これらの ID 値を使用するために、レベルまたはgetGeometryById(String id)
を使用して図面で特定のスペースを検索できます。
ArrayList<String> geometriesID;
ArrayList<VenueGeometry> geometries;
for(String id : geometriesID)
{
VenueGeometry geometry = selectVenue.getSelectedDrawing().getGeometryById(id);
geometries.add(geometry);
}
private final VenueGeometryStyle geometryStyle = new VenueGeometryStyle(
SELECTED_COLOR, SELECTED_OUTLINE_COLOR, 1);
private final VenueLabelStyle labelStyle = new VenueLabelStyle(
SELECTED_TEXT_COLOR, SELECTED_TEXT_OUTLINE_COLOR, 1, 28);
selectVenue.setCustomStyle(geometries, geometryStyle, labelStyle);
施設でタップジェスチャを処理
施設 オブジェクトをタップして選択できます。 まず、 TAP リスナーを設定します。
mapView.getGestures().setTapListener(tapListener);
TAP リスナー内では、メソッド VenueMap.getGeometry()
および VenueMap.getVenue()
メソッドのパラメーターとしてタップされた地理座標を使用できます。
private final TapListener tapListener = origin -> {
deselectGeometry();
GeoCoordinates position = mapView.viewToGeoCoordinates(origin);
if (position == null) {
return;
}
VenueMap venueMap = venueEngine.getVenueMap();
VenueGeometry geometry = venueMap.getGeometry(position);
if (geometry != null) {
marker = new MapMarker(position, markerImage, new Anchor2D(0.5f, 1f));
mapView.getMapScene().addMapMarker(marker);
} else {
Venue venue = venueMap.getVenue(position);
if (venue != null) {
venueMap.setSelectedVenue(venue);
}
}
};
private void deselectGeometry() {
if (marker != null) {
mapView.getMapScene().removeMapMarker(marker);
}
}
HERE では、選択した施設 、図面、またはレベルが変更されたときに、タップされたジオメトリを選択解除することをお勧めします。
private final VenueSelectionListener venueSelectionListener =
(deselectedController, selectedController) -> deselectGeometry();
private final VenueDrawingSelectionListener drawingSelectionListener =
(venue, deselectedController, selectedController) -> deselectGeometry();
private final VenueLevelSelectionListener levelChangeListener =
(venue, drawing, oldLevel, newLevel) -> deselectGeometry();
void setVenueMap(VenueMap venueMap) {
if (this.venueMap == venueMap) {
return;
}
removeListeners();
this.venueMap = venueMap;
if (this.venueMap != null) {
this.venueMap.add(venueSelectionListener);
this.venueMap.add(drawingSelectionListener);
this.venueMap.add(levelChangeListener);
deselectGeometry();
}
}
private void removeListeners() {
if (this.venueMap != null) {
this.venueMap.remove(venueSelectionListener);
this.venueMap.remove(drawingSelectionListener);
this.venueMap.remove(levelChangeListener);
}
}
施設 でのマップタップイベントの使用方法を示す完全な例については 、GitHub で利用できる IndoorMapExample アプリ を参照してください。