屋内地図を統合します
HERE Indoor Map には、マップ上でプライベート施設 を読み込んで表示し、操作する機能があります。 HERE Indoor Map の詳細については、『HERE Indoor Map ガイド』を参照してください。
カスタマイズされたフロアスイッチャーを備えた空港の施設 。 現在、 HERE SDK は プライベート 施設 のみをサポートしているため、施設 データはアプリ にのみ表示されます。デフォルトでは、マップに施設 は表示されません。 各施設 には、 HERE SDK 資格情報 に関連付けられた一意の施設 ID が割り当てられます。
VenueEngine を初期化
HERE Indoor Map API の使用を開始する前 に、インスタンスVenueEngine
を作成して開始する必要があります。 これは、マップの初期化後に行うことができますが、VenueEngine
を作成する最適なタイミングは 、マップがシーンをロードした後です。
private void loadMapScene() {
private func onLoadScene(mapError: MapError?) {
guard mapError == nil else {
print("Error: Map scene not loaded, \(String(describing: mapError))")
return
}
mapView.mapScene.disableFeatures([MapFeatures.extrudedBuildings])
do {
try venueEngine = VenueEngine { [weak self] in self?.onVenueEngineInit() }
} catch {
print("SDK Engine not instantiated: \(error)")
}
}
}
VenueEngine
が初期化されると、完了ハンドラが呼び出されます。 この時点から VenueService
、との両方にアクセスできます VenueMap
。 は VenueService
施設 の読み込みに使用 VenueMap
され、はマップ上の施設 を制御します。 完了ハンドラ内で、必要なすべてのデリゲートを追加してから VenueEngine
、を開始する必要があります。 プラットフォーム マップカタログ HRN
は、の VenueEngine
起動後に設定する必要があります。
注
HERE リソースネーム の設定は任意です。 ユーザーが HERE リソースネーム を設定していない場合は、デフォルトのコレクション HERE リソースネーム が自動的に選択されます。 ユーザーが他のコレクションを使用する場合は、それぞれの HERE リソースネーム を設定できます。 HERE リソースネーム 値が見つからないか、または無効であることを示すエラーログが生成されます。 プロジェクトで有効な HERE リソースネーム文字列を受け取る方法の詳細については、『HERE Indoor Map ガイド』を参照してください。
private func onVenueEngineInit() {
let venueMap = venueEngine.venueMap
let venueService = venueEngine.venueService
venueService.addServiceDelegate(self)
venueService.addVenueDelegate(self)
venueMap.addVenueSelectionDelegate(self)
venueEngine.start(callback: {
error, data in if let error = error {
print("Failed to authenticate, reason: " + error.localizedDescription)
}
})
if (hrn != "") {
venueService.setHrn(hrn: hrn)
}
}
VenueEngine
が開始されると、現在の資格情報 を使用して認証され、が開始 VenueService
されます。 VenueService
が初期化されると、メソッド VenueServiceDelegate.onInitializationCompleted()
が呼び出されます。
extension ViewController: VenueServiceDelegate {
func onInitializationCompleted(result: VenueServiceInitStatus) {
if (result == .onlineSuccess) {
print("Venue Service initialize successfully.")
} else {
print("Venue Service failed to initialize!")
}
}
func onVenueServiceStopped() {
print("Venue Service has stopped.")
}
}
トークン を使用して VenueEngine の起動
VenueEngine
は 、有効な HERE 屋内プラットフォーム プロジェクトトークン を使用して開始できます。 HERE platform プロジェクト管理およびプロジェクトワークフローの詳細については 、「 HERE platform プロジェクト管理」を参照してください
private func onVenueEngineInit() {
let venueMap = venueEngine.venueMap
let venueService = venueEngine.venueService
venueService.addServiceDelegate(self)
venueService.addVenueDelegate(self)
venueMap.addVenueSelectionDelegate(self)
venueEngine.start(token:"TOKEN_GOES_HERE")
}
すべての屋内地図を一覧表示します
HERE Indoor Maps API では、アカウントおよび選択したコレクションでアクセス可能なすべてのプライベート施設 を一覧表示できます。 VenueMap
VenueInfo
施設 識別子、施設 ID 、および施設 名を含む要素を保持するリストが含まれています。
let venueInfo:[VenueInfo]? = venueEngine?.venueMap.getVenueInfoList()
if let venueInfo = venueInfo {
for venueInfo in venueInfo {
print("Venue Identifier: \(venueInfo.venueIdentifier)." + " Venue Id: \(venueInfo.venueId)." + " Venue Name: \(venueInfo.venueName).")
}
}
施設をロードして表示します
HERE Indoor Map API を使用すると、 ID によって施設 をロードおよび表示できます。現在の資格情報 セットの施設 ID を知っている必要があります。 施設 をロードして表示する方法はいくつかあります。 VenueService
で、新しい施設 ロードキューを開始する方法があります。
venueEngine.venueService.startLoading(venueIds: )
既存のロードキューに施設 ID を追加することもできます。
venueEngine.venueService.addVenueToLoad(venueId: );
VenueMap
には、施設 をマップに追加するための 2 つの方法があります: selectVenueAsync()
および addVenueAsync()
。 どちらの方法も getVenueService().addVenueToLoad()
、 ID で施設 を読み込み、それをマップに追加するために使用します。 このメソッドで selectVenueAsync()
は、施設 も選択されます。
venueEngine.venueMap.selectVenueAsync(venueId:/*VENUE_ID*/);
venueEngine.venueMap.addVenueAsync(venueId:/*VENUE_ID*/);
施設がロードされると、VenueService
は次の VenueDelegate.onGetVenueCompleted()
メソッドを呼び出します。
extension ViewController: VenueDelegate {
func onGetVenueCompleted(venueId: Int32, venueModel: VenueModel?, online: Bool, venueStyle: VenueStyle?) {
if venueModel == nil {
print("Loading of venue \(venueId) failed!")
}
}
}
施設 が正常にロードされると addVenueAsync()
、メソッドを使用している場合 VenueLifecycleDelegate.onVenueAdded()
は、メソッドのみがトリガーされます。 selectVenueAsync()
メソッドを使用している場合 VenueSelectionDelegate.onSelectedVenueChanged()
は、メソッドもトリガーされます。
extension ViewController: VenueSelectionDelegate {
func onSelectedVenueChanged(deselectedVenue: Venue?, selectedVenue: Venue?) {
if let venueModel = selectedVenue?.venueModel {
if moveToVenue {
let center = GeoCoordinates(latitude: venueModel.center.latitude,
longitude: venueModel.center.longitude,
altitude: 500.0)
mapView.camera.lookAt(point: center)
}
}
}
}
Venue
からVenueMap
を削除することもでき ます。この場合 、メソッドVenueLifecycleDelegate.onVenueRemoved()
がトリガーされます。
venueEngine.venueMap.removeVenue(venue: venue)
ラベルテキストの設定
施設 のデフォルトのラベルテキスト設定を上書きできます。
VenueEngine
が初期化されると、コールバック が呼び出されます。 この時点から、VenueService
へのアクセス権があり ます。 オプションのメソッドsetLabeltextPreference()
を呼び出して、レンダリング時のラベルテキストの設定を指定できます。 既定のスタイルラベルのテキスト設定を上書きすると、次のオプションを並べ替え順によって設定が定義される一覧として設定できます。
- "occupant _name "
- "space_name"
- "internal_address"
- "space_type_name"
- "space_category_name"
これらは任意の順序で設定できます。 たとえば、ラベルテキストの環境設定に「occupant _name 」が含まれていない場合、リストの順序に基づいて「 space_name 」などに切り替わります。 設定が見つからない場合は、何も表示されません。
private func onVenueEngineInit() {
let venueMap = venueEngine.venueMap
let venueService = venueEngine.venueService
venueService.addServiceDelegate(self)
venueService.addVenueDelegate(self)
venueMap.addVenueSelectionDelegate(self)
venueEngine.start(callback: {
error, data in if let error = error {
print("Failed to authenticate, reason: " + error.localizedDescription)
}
})
if (hrn != "") {
venueService.setHrn(hrn: hrn)
}
venueService.setLabeltextPreference(labelTextPref: LabelPref)
}
施設図面とレベルを選択します
Venue
オブジェクトを使用すると、施設 の状態を制御できます。
このプロパティ Venue.selectedDrawing
を使用すると、地図に表示される図面を取得および設定できます。 新しい図面を選択すると VenueDrawingSelectionDelegate.onDrawingSelected()
、メソッドがトリガーされます。
UITableView
でアイテムをクリックしたときに図面を選択する方法の例を次に示します。
extension DrawingSwitcher: UITableViewDelegate {
public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let drawingIndex: Int = indexPath.row
if let venue = venueMap?.selectedVenue {
let drawing: VenueDrawing = venue.venueModel.drawings[drawingIndex]
venue.selectedDrawing = drawing
...
}
}
}
プロパティ Venue.selectedLevel
、 Venue.selectedLevelIndex
および Venue.selectedLevelZIndex
を使用すると、マップに表示されるレベルを取得および設定できます。 新しいレベルを選択する VenueLevelSelectionDelegate.onLevelSelected()
と、メソッドがトリガーされます。
次の例では、UITableView
から反転したレベルリストに基づいてレベルを選択する方法を示します。
extension LevelSwitcher: UITableViewDelegate {
public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
currentLevelIndex = Int32(levels.count - indexPath.row - 1)
updateLevel(currentLevelIndex)
}
}
func updateLevel(_ levelIndex: Int32) {
if let venue = venueMap?.selectedVenue {
venue.selectedLevelIndex = currentLevelIndex
}
}
描画とレベルを制御する UI スイッチャーの完全な例については、GitHub で利用できる IndoorMap Example アプリを参照してください。
施設のスタイルをカスタマイズします
VenueGeometry
オブジェクトの表示スタイルを変更できます。 ジオメトリスタイルオブジェクトまたはラベルスタイルオブジェクト、またはそのいずれかを作成し Venue.setCustomStyle()
、メソッドに提供する必要があります。
geometryStyle = VenueGeometryStyle(
mainColor: selectedColor, outlineColor: selectedOutlineColor, outlineWidth: 1)
labelStyle = VenueLabelStyle(
fillColor: selectedTextColor, outlineColor: selectedTextOutlineColor, outlineWidth: 1, maxFont: 28)
venue.setCustomStyle(geometries: [geometry], style: geometryStyle, labelStyle: labelStyle)
識別子でスペースを選択します
スペース、レベル、および図面の ID は、 スペースのspaces.getIdentifier()
呼び出しの場合などに、getIdentifier()
を使用して抽出できます。。 次に、これらの ID 値を使用するために、レベルまたはgetGeometryById(id:)
を使用して図面で特定のスペースを検索できます。
var geometriesID : [String] = [];
var geometries : [VenueGeometry] = [];
for id in geometriesID
{
VenueGeometry geometry = selectedVenue?.getSelectedDrawing().getGeometryById(id);
geometries.append(geometry);
}
geometryStyle = VenueGeometryStyle(
mainColor: selectedColor, outlineColor: selectedOutlineColor, outlineWidth: 1)
labelStyle = VenueLabelStyle(
fillColor: selectedTextColor, outlineColor: selectedTextOutlineColor, outlineWidth: 1, maxFont: 28)
selectedVenue.setCustomStyle(geometries: geometries, style: geometryStyle, labelStyle: labelStyle)
施設でタップジェスチャを処理します
施設 オブジェクトをタップして選択できます。 まず、 TAP デリゲートを設定します。
mapView.gestures.tapDelegate = VenueTapHandler(venueEngine: venueEngine,
mapView: mapView,
geometryLabel: geometryNameLabel)
TAP デリゲート内では、タップされた地理座標を VenueMap.getGeometry()
メソッドおよび VenueMap.getVenue()
メソッドのパラメーターとして使用できます。
public func onTap(origin: Point2D) {
deselectGeometry()
let venueMap = venueEngine.venueMap
if let position = mapView.viewToGeoCoordinates(viewCoordinates: origin) {
if let selectedVenue = venueMap.selectedVenue, let geometry = venueMap.getGeometry(position: position) {
onGeometryPicked(venue: selectedVenue, geometry: geometry)
} else if let venue = venueMap.getVenue(position: position) {
venueMap.selectedVenue = venue
}
}
}
func deselectGeometry() {
if let currentMarker = marker {
mapView.mapScene.removeMapMarker(currentMarker)
}
}
func onGeometryPicked(venue: Venue,
geometry: VenueGeometry) {
if geometry.lookupType == .icon {
if let image = getMarkerImage() {
marker = MapMarker(at: geometry.center,
image: image,
anchor: Anchor2D(horizontal: 0.5, vertical: 1.0))
if let marker = marker {
mapView.mapScene.addMapMarker(marker)
}
}
}
}
HERE では、選択した施設 、図面、またはレベルが変更されたときに、タップされたジオメトリを選択解除することをお勧めします。
public init(venueEngine: VenueEngine, mapView: MapView, geometryLabel: UILabel) {
...
let venueMap = venueEngine.venueMap
venueMap.addVenueSelectionDelegate(self)
venueMap.addDrawingSelectionDelegate(self)
venueMap.addLevelSelectionDelegate(self)
}
deinit {
let venueMap = venueEngine.venueMap
venueMap.removeVenueSelectionDelegate(self)
venueMap.removeDrawingSelectionDelegate(self)
venueMap.removeLevelSelectionDelegate(self)
}
extension VenueTapHandler: VenueSelectionDelegate {
public func onSelectedVenueChanged(deselectedVenue: Venue?, selectedVenue: Venue?) {
self.deselectGeometry()
}
}
extension VenueTapHandler: VenueDrawingSelectionDelegate {
public func onDrawingSelected(venue: Venue, deselectedDrawing: VenueDrawing?, selectedDrawing: VenueDrawing) {
self.deselectGeometry()
}
}
extension VenueTapHandler: VenueLevelSelectionDelegate {
public func onLevelSelected(venue: Venue, drawing: VenueDrawing, deselectedLevel: VenueLevel?, selectedLevel: VenueLevel) {
self.deselectGeometry()
}
}
施設 でのマップタップイベントの使用方法を示す完全な例については 、GitHub で利用できる IndoorMapExample アプリ を参照してください。