屋内マップを統合

HERE Indoor Map には、マップ上でプライベート施設 を読み込んで表示し、操作する機能があります。 HERE Indoor Map の詳細については、『HERE Indoor Map ガイド』を参照してください。

施設 の所有者で、 HERE Indoor Map と HERE SDK の併用に関心がある場合は、に連絡してください

venues.support@here.com

カスタマイズされたフロアスイッチャーを備えた空港の施設 。

現在、 HERE SDK は プライベート 施設 のみをサポートしているため、施設 データはアプリ にのみ表示されます。デフォルトでは、マップに施設 は表示されません。 各施設 には、 HERE SDK 資格情報 に関連付けられた一意の施設 ID が割り当てられます。

VenueEngine を初期化

HERE Indoor Map API の使用を開始する前 に、インスタンスVenueEngineを作成して開始する必要があります。 これは、マップの初期化後に行うことができますが、VenueEngineを作成する最適なタイミングは 、マップがシーンをロードした後です。

private void loadMapScene() {
    // Load a scene from the HERE SDK to render the map with a map scheme.
    mapView.getMapScene().loadScene(MapScheme.NORMAL_DAY, mapError -> {
        if (mapError == null) {
            // Hide extruded buildings layer, so it will not overlaps with venues.
            List<String> mapFeatures = new ArrayList<>();
            mapFeatures.add(MapFeatures.EXTRUDED_BUILDINGS);
            mapView.getMapScene().disableFeatures(mapFeatures);        

            // Create a venue engine object. Once an initialization is done, the callback
            // will be called.
            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 が初期化されると、コールバック が呼び出されます。 この時点から 、 VenueServiceVenueMapの両方にアクセスできます 。 VenueService は施設 の読み込みに使用 され、VenueMap はマップ上の施設 を制御します。 コールバック 内では、必要なすべてのリスナーを追加してから VenueEngine 、を開始する必要があります。 ユーザーが既定のコレクション HERE リソースネームを使用しない場合、プラットフォーム マップカタログ HRN は、VenueEngine の起動後に設定できます。

HERE リソースネーム の設定は任意です。 ユーザーが HERE リソースネーム を設定していない場合は、デフォルトのコレクション HERE リソースネーム が自動的に選択されます。 ユーザーが他のコレクションを使用する場合は、それぞれの HERE リソースネーム を設定できます。 HERE リソースネーム 値が見つからないか、または無効であることを示すエラーログが生成されます。 プロジェクトで有効な HERE リソースネーム文字列を受け取る方法の詳細については、『HERE Indoor Map ガイド』を参照してください。

private void onVenueEngineInitCompleted() {
    // Get VenueService and VenueMap objects.
    VenueService service = venueEngine.getVenueService();
    VenueMap venueMap = venueEngine.getVenueMap();

    // Add needed listeners.
    service.add(serviceListener);
    service.add(venueListener);
    venueMap.add(venueSelectionListener);

    // Start VenueEngine. Once authentication is done, the authentication callback
    // will be triggered. Afterwards, VenueEngine will start VenueService. Once VenueService
    // is initialized, VenueServiceListener.onInitializationCompleted method will be called.
    venueEngine.start((authenticationError, authenticationData) -> {
        if (authenticationError != null) {
            Log.e(TAG, "Failed to authenticate, reason: " + authenticationError.value);
        }
    });

    if(HRN != "") {
        // Set platform catalog HRN
        service.setHrn(HRN);
    }
}

VenueEngine が開始されると、現在の資格情報 を使用して認証され、が開始 VenueServiceされます。 VenueService が初期化されると、メソッド VenueServiceListener.onInitializationCompleted() が呼び出されます。

// Listener for the VenueService event.
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() {
    // Get VenueService and VenueMap objects.
    VenueService service = venueEngine.getVenueService();
    VenueMap venueMap = venueEngine.getVenueMap();

    // Add needed listeners.
    service.add(serviceListener);
    service.add(venueListener);
    venueMap.add(venueSelectionListener);

    // Start VenueEngine by replacing TOKEN_GOES_HERE with token you have in String data type.
    // Afterwards, VenueEngine will start VenueService. Once VenueService
    // is initialized, VenueServiceListener.onInitializationCompleted method will be called.
    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(/*VENUE_ID_LIST*/);

既存のロードキューに施設 ID を追加することもできます。

venueEngine.getVenueService().addVenueToLoad(/*VENUE_ID*/);

VenueMap には、施設 をマップに追加するための 2 つの方法があります: selectVenueAsync() および addVenueAsync()。 どちらの方法も getVenueService().addVenueToLoad() 、 ID で施設 を読み込み、それをマップに追加するために使用します。 このメソッドで selectVenueAsync() は、施設 も選択されます。

venueEngine.getVenueMap().selectVenueAsync(/*VENUE_ID*/);
venueEngine.getVenueMap().addVenueAsync(/*VENUE_ID*/);

施設がロードされると、VenueService は次の VenueListener.onGetVenueCompleted() メソッドを呼び出します。

// Listener for the venue loading event
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()もトリガーされます。

// Listener for the venue selection event.
private final VenueSelectionListener venueSelectionListener =
    (deselectedVenue, selectedVenue) -> {
        if (selectedVenue != null) {
            // Move camera to the selected venue.
            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() {
    // Get VenueService and VenueMap objects.
    VenueService service = venueEngine.getVenueService();
    VenueMap venueMap = venueEngine.getVenueMap();

    // Add needed listeners.
    service.add(serviceListener);
    service.add(venueListener);
    venueMap.add(venueSelectionListener);

    // Start VenueEngine. Once authentication is done, the authentication callback
    // will be triggered. After, VenueEngine will start VenueService. Once VenueService
    // is initialized, VenueServiceListener.onInitializationCompleted method will be called.
    venueEngine.start((authenticationError, authenticationData) -> {
        if (authenticationError != null) {
            Log.e(TAG, "Failed to authenticate, reason: " + authenticationError.value);
        }
    });

    if(HRN != "") {
        // Set platform catalog HRN
        service.setHrn(HRN);
    }

    // Set label text preference
    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();
    // Set the selected drawing when a user clicks on the item in the list.
    venue.setSelectedDrawing(venueModel.getDrawings().get(position));
}

メソッド getSelectedLevelIndex() および setSelectedLevelIndex() を使用すると、レベルのリスト内の場所に基づいてレベルを取得および設定できます。 新しいレベルを選択する VenueLevelSelectionListener.onLevelSelected() と、メソッドがトリガーされます。

次の例では、ListViewから反転したレベルリストに基づいてレベルを選択する方法を示します。

listView.setOnItemClickListener((parent, view, position, id) -> {
    if (venueMap.getSelectedVenue() != null) {
        // Revers an index, as levels in LevelSwitcher appear in a different order
        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();

    // Get geo position of the tap.
    GeoCoordinates position = mapView.viewToGeoCoordinates(origin);
    if (position == null) {
        return;
    }

    VenueMap venueMap = venueEngine.getVenueMap();
    // Get VenueGeometry under the tapped position.
    VenueGeometry geometry = venueMap.getGeometry(position);

    if (geometry != null) {
        // If there is a geometry, put a marker on top of it.
        marker = new MapMarker(position, markerImage, new Anchor2D(0.5f, 1f));
        mapView.getMapScene().addMapMarker(marker);
    } else {
        // If no geometry was tapped, check if there is a not-selected venue under
        // the tapped position. If there is one, select it.
        Venue venue = venueMap.getVenue(position);
        if (venue != null) {
            venueMap.setSelectedVenue(venue);
        }
    }
};

private void deselectGeometry() {
    // If marker is already on the screen, remove it.
    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;
    }

    // Remove old venue map listeners.
    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 アプリ を参照してください。

」に一致する結果は 件です

    」に一致する結果はありません