@maydon_tech/react-native-nitro-maps 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +20 -0
- package/NitroMap.podspec +42 -0
- package/README.md +172 -0
- package/android/CMakeLists.txt +27 -0
- package/android/build.gradle +141 -0
- package/android/gradle.properties +5 -0
- package/android/src/main/AndroidManifest.xml +3 -0
- package/android/src/main/cpp/cpp-adapter.cpp +6 -0
- package/android/src/main/java/com/margelo/nitro/nitromap/ClusterIconGenerator.kt +108 -0
- package/android/src/main/java/com/margelo/nitro/nitromap/ColorUtils.kt +63 -0
- package/android/src/main/java/com/margelo/nitro/nitromap/HybridNitroMap.kt +408 -0
- package/android/src/main/java/com/margelo/nitro/nitromap/HybridNitroMapConfig.kt +68 -0
- package/android/src/main/java/com/margelo/nitro/nitromap/MarkerIconCache.kt +176 -0
- package/android/src/main/java/com/margelo/nitro/nitromap/MarkerIconFactory.kt +252 -0
- package/android/src/main/java/com/margelo/nitro/nitromap/NitroMapPackage.kt +33 -0
- package/android/src/main/java/com/margelo/nitro/nitromap/clustering/NitroClusterEngine.kt +252 -0
- package/android/src/main/java/com/margelo/nitro/nitromap/clustering/QuadTree.kt +195 -0
- package/android/src/main/java/com/margelo/nitro/nitromap/providers/GoogleMapProvider.kt +912 -0
- package/android/src/main/java/com/margelo/nitro/nitromap/providers/MapProviderInterface.kt +70 -0
- package/cpp/ClusterEngine.hpp +411 -0
- package/cpp/KDBush.hpp +238 -0
- package/cpp/QuadTree.hpp +246 -0
- package/ios/Clustering/ClusterEngineWrapper.h +58 -0
- package/ios/Clustering/ClusterEngineWrapper.mm +142 -0
- package/ios/Clustering/ClusterIconRenderer.swift +80 -0
- package/ios/Clustering/NitroClusterEngine.swift +117 -0
- package/ios/Clustering/NitroClusterIconGenerator.swift +35 -0
- package/ios/MarkerRenderer/MarkerIconFactory.swift +322 -0
- package/ios/MarkerRenderer/PriceMarkerRenderer.swift +140 -0
- package/ios/NitroMap.swift +332 -0
- package/ios/NitroMapConfig/HybridNitroMapConfig.swift +33 -0
- package/ios/Providers/GoogleMapDelegate.swift +310 -0
- package/ios/Providers/GoogleMapProvider+Camera.swift +164 -0
- package/ios/Providers/GoogleMapProvider.swift +924 -0
- package/ios/Providers/MapProviderProtocol.swift +78 -0
- package/ios/Shared/ClusterConfig+Factory.swift +58 -0
- package/ios/Shared/ClusteringManager.swift +211 -0
- package/ios/Shared/MapStyleProvider.swift +135 -0
- package/ios/Shared/MarkerSelectionHandler.swift +116 -0
- package/ios/Utils/ColorValueExtension.swift +54 -0
- package/lib/module/components/ImageMarker.js +146 -0
- package/lib/module/components/ImageMarker.js.map +1 -0
- package/lib/module/components/NitroMap.js +320 -0
- package/lib/module/components/NitroMap.js.map +1 -0
- package/lib/module/components/PriceMarker.js +165 -0
- package/lib/module/components/PriceMarker.js.map +1 -0
- package/lib/module/context/NitroMapContext.js +15 -0
- package/lib/module/context/NitroMapContext.js.map +1 -0
- package/lib/module/hooks/useNitroMarker.js +104 -0
- package/lib/module/hooks/useNitroMarker.js.map +1 -0
- package/lib/module/index.js +21 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/modules/index.js +4 -0
- package/lib/module/modules/index.js.map +1 -0
- package/lib/module/modules/module.js +30 -0
- package/lib/module/modules/module.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/specs/NitroMap.nitro.js +4 -0
- package/lib/module/specs/NitroMap.nitro.js.map +1 -0
- package/lib/module/specs/NitroMapConfig.nitro.js +4 -0
- package/lib/module/specs/NitroMapConfig.nitro.js.map +1 -0
- package/lib/module/types/map.js +2 -0
- package/lib/module/types/map.js.map +1 -0
- package/lib/module/types/marker.js +4 -0
- package/lib/module/types/marker.js.map +1 -0
- package/lib/module/utils/colors.js +147 -0
- package/lib/module/utils/colors.js.map +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/components/ImageMarker.d.ts +70 -0
- package/lib/typescript/src/components/ImageMarker.d.ts.map +1 -0
- package/lib/typescript/src/components/NitroMap.d.ts +14 -0
- package/lib/typescript/src/components/NitroMap.d.ts.map +1 -0
- package/lib/typescript/src/components/PriceMarker.d.ts +88 -0
- package/lib/typescript/src/components/PriceMarker.d.ts.map +1 -0
- package/lib/typescript/src/context/NitroMapContext.d.ts +16 -0
- package/lib/typescript/src/context/NitroMapContext.d.ts.map +1 -0
- package/lib/typescript/src/hooks/useNitroMarker.d.ts +78 -0
- package/lib/typescript/src/hooks/useNitroMarker.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +12 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/modules/index.d.ts +2 -0
- package/lib/typescript/src/modules/index.d.ts.map +1 -0
- package/lib/typescript/src/modules/module.d.ts +22 -0
- package/lib/typescript/src/modules/module.d.ts.map +1 -0
- package/lib/typescript/src/specs/NitroMap.nitro.d.ts +227 -0
- package/lib/typescript/src/specs/NitroMap.nitro.d.ts.map +1 -0
- package/lib/typescript/src/specs/NitroMapConfig.nitro.d.ts +10 -0
- package/lib/typescript/src/specs/NitroMapConfig.nitro.d.ts.map +1 -0
- package/lib/typescript/src/types/map.d.ts +154 -0
- package/lib/typescript/src/types/map.d.ts.map +1 -0
- package/lib/typescript/src/types/marker.d.ts +248 -0
- package/lib/typescript/src/types/marker.d.ts.map +1 -0
- package/lib/typescript/src/utils/colors.d.ts +82 -0
- package/lib/typescript/src/utils/colors.d.ts.map +1 -0
- package/nitro.json +21 -0
- package/nitrogen/generated/android/c++/JCamera.hpp +74 -0
- package/nitrogen/generated/android/c++/JClusterAnimationStyle.hpp +68 -0
- package/nitrogen/generated/android/c++/JClusterConfig.hpp +121 -0
- package/nitrogen/generated/android/c++/JClusterPressEvent.hpp +86 -0
- package/nitrogen/generated/android/c++/JClusterStrategy.hpp +59 -0
- package/nitrogen/generated/android/c++/JColorValue.cpp +26 -0
- package/nitrogen/generated/android/c++/JColorValue.hpp +70 -0
- package/nitrogen/generated/android/c++/JCoordinate.hpp +61 -0
- package/nitrogen/generated/android/c++/JEdgePadding.hpp +69 -0
- package/nitrogen/generated/android/c++/JFunc_void.hpp +75 -0
- package/nitrogen/generated/android/c++/JFunc_void_ClusterPressEvent.hpp +81 -0
- package/nitrogen/generated/android/c++/JFunc_void_MapError.hpp +78 -0
- package/nitrogen/generated/android/c++/JFunc_void_MapPressEvent.hpp +81 -0
- package/nitrogen/generated/android/c++/JFunc_void_MarkerDragEvent.hpp +80 -0
- package/nitrogen/generated/android/c++/JFunc_void_MarkerPressEvent.hpp +80 -0
- package/nitrogen/generated/android/c++/JFunc_void_RegionChangeEvent.hpp +79 -0
- package/nitrogen/generated/android/c++/JHybridNitroMapConfigSpec.cpp +59 -0
- package/nitrogen/generated/android/c++/JHybridNitroMapConfigSpec.hpp +66 -0
- package/nitrogen/generated/android/c++/JHybridNitroMapSpec.cpp +593 -0
- package/nitrogen/generated/android/c++/JHybridNitroMapSpec.hpp +125 -0
- package/nitrogen/generated/android/c++/JImageMarkerConfig.hpp +86 -0
- package/nitrogen/generated/android/c++/JMapBoundaries.hpp +62 -0
- package/nitrogen/generated/android/c++/JMapError.hpp +61 -0
- package/nitrogen/generated/android/c++/JMapPressEvent.hpp +64 -0
- package/nitrogen/generated/android/c++/JMapProvider.hpp +62 -0
- package/nitrogen/generated/android/c++/JMapStyleElement.hpp +87 -0
- package/nitrogen/generated/android/c++/JMapStyler.hpp +78 -0
- package/nitrogen/generated/android/c++/JMapType.hpp +62 -0
- package/nitrogen/generated/android/c++/JMarkerAnimation.hpp +62 -0
- package/nitrogen/generated/android/c++/JMarkerColor.hpp +69 -0
- package/nitrogen/generated/android/c++/JMarkerConfig.hpp +77 -0
- package/nitrogen/generated/android/c++/JMarkerData.hpp +121 -0
- package/nitrogen/generated/android/c++/JMarkerDragEvent.hpp +63 -0
- package/nitrogen/generated/android/c++/JMarkerPressEvent.hpp +63 -0
- package/nitrogen/generated/android/c++/JMarkerStyle.hpp +62 -0
- package/nitrogen/generated/android/c++/JPoint.hpp +61 -0
- package/nitrogen/generated/android/c++/JPriceMarkerStyle.hpp +102 -0
- package/nitrogen/generated/android/c++/JRegion.hpp +69 -0
- package/nitrogen/generated/android/c++/JRegionChangeEvent.hpp +62 -0
- package/nitrogen/generated/android/c++/JVariant_String_MarkerColor.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_String_MarkerColor.hpp +70 -0
- package/nitrogen/generated/android/c++/views/JHybridNitroMapStateUpdater.cpp +144 -0
- package/nitrogen/generated/android/c++/views/JHybridNitroMapStateUpdater.hpp +49 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Camera.kt +50 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/ClusterAnimationStyle.kt +24 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/ClusterConfig.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/ClusterPressEvent.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/ClusterStrategy.kt +21 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/ColorValue.kt +59 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Coordinate.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/EdgePadding.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void_ClusterPressEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void_MapError.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void_MapPressEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void_MarkerDragEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void_MarkerPressEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void_RegionChangeEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/HybridNitroMapConfigSpec.kt +61 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/HybridNitroMapSpec.kt +342 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/ImageMarkerConfig.kt +56 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MapBoundaries.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MapError.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MapPressEvent.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MapProvider.kt +22 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MapStyleElement.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MapStyler.kt +53 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MapType.kt +22 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MarkerAnimation.kt +22 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MarkerColor.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MarkerConfig.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MarkerData.kt +71 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MarkerDragEvent.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MarkerPressEvent.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MarkerStyle.kt +22 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Point.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/PriceMarkerStyle.kt +68 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Region.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/RegionChangeEvent.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Variant_String_MarkerColor.kt +59 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/nitromapOnLoad.kt +35 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/views/HybridNitroMapManager.kt +50 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/views/HybridNitroMapStateUpdater.kt +23 -0
- package/nitrogen/generated/android/nitromap+autolinking.cmake +87 -0
- package/nitrogen/generated/android/nitromap+autolinking.gradle +27 -0
- package/nitrogen/generated/android/nitromapOnLoad.cpp +70 -0
- package/nitrogen/generated/android/nitromapOnLoad.hpp +25 -0
- package/nitrogen/generated/ios/NitroMap+autolinking.rb +60 -0
- package/nitrogen/generated/ios/NitroMap-Swift-Cxx-Bridge.cpp +130 -0
- package/nitrogen/generated/ios/NitroMap-Swift-Cxx-Bridge.hpp +793 -0
- package/nitrogen/generated/ios/NitroMap-Swift-Cxx-Umbrella.hpp +132 -0
- package/nitrogen/generated/ios/NitroMapAutolinking.mm +41 -0
- package/nitrogen/generated/ios/NitroMapAutolinking.swift +40 -0
- package/nitrogen/generated/ios/c++/HybridNitroMapConfigSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridNitroMapConfigSpecSwift.hpp +84 -0
- package/nitrogen/generated/ios/c++/HybridNitroMapSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridNitroMapSpecSwift.hpp +410 -0
- package/nitrogen/generated/ios/c++/views/HybridNitroMapComponent.mm +206 -0
- package/nitrogen/generated/ios/swift/Camera.swift +80 -0
- package/nitrogen/generated/ios/swift/ClusterAnimationStyle.swift +52 -0
- package/nitrogen/generated/ios/swift/ClusterConfig.swift +268 -0
- package/nitrogen/generated/ios/swift/ClusterPressEvent.swift +70 -0
- package/nitrogen/generated/ios/swift/ClusterStrategy.swift +40 -0
- package/nitrogen/generated/ios/swift/ColorValue.swift +18 -0
- package/nitrogen/generated/ios/swift/Coordinate.swift +47 -0
- package/nitrogen/generated/ios/swift/EdgePadding.swift +69 -0
- package/nitrogen/generated/ios/swift/Func_void.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_Camera.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_ClusterPressEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_MapBoundaries.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_MapError.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_MapPressEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_MarkerDragEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_MarkerPressEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_RegionChangeEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +47 -0
- package/nitrogen/generated/ios/swift/HybridNitroMapConfigSpec.swift +57 -0
- package/nitrogen/generated/ios/swift/HybridNitroMapConfigSpec_cxx.swift +142 -0
- package/nitrogen/generated/ios/swift/HybridNitroMapSpec.swift +93 -0
- package/nitrogen/generated/ios/swift/HybridNitroMapSpec_cxx.swift +953 -0
- package/nitrogen/generated/ios/swift/ImageMarkerConfig.swift +166 -0
- package/nitrogen/generated/ios/swift/MapBoundaries.swift +47 -0
- package/nitrogen/generated/ios/swift/MapError.swift +47 -0
- package/nitrogen/generated/ios/swift/MapPressEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/MapProvider.swift +44 -0
- package/nitrogen/generated/ios/swift/MapStyleElement.swift +108 -0
- package/nitrogen/generated/ios/swift/MapStyler.swift +177 -0
- package/nitrogen/generated/ios/swift/MapType.swift +44 -0
- package/nitrogen/generated/ios/swift/MarkerAnimation.swift +44 -0
- package/nitrogen/generated/ios/swift/MarkerColor.swift +69 -0
- package/nitrogen/generated/ios/swift/MarkerConfig.swift +82 -0
- package/nitrogen/generated/ios/swift/MarkerData.swift +195 -0
- package/nitrogen/generated/ios/swift/MarkerDragEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/MarkerPressEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/MarkerStyle.swift +44 -0
- package/nitrogen/generated/ios/swift/Point.swift +47 -0
- package/nitrogen/generated/ios/swift/PriceMarkerStyle.swift +374 -0
- package/nitrogen/generated/ios/swift/Region.swift +69 -0
- package/nitrogen/generated/ios/swift/RegionChangeEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/Variant_String_MarkerColor.swift +18 -0
- package/nitrogen/generated/shared/c++/Camera.hpp +92 -0
- package/nitrogen/generated/shared/c++/ClusterAnimationStyle.hpp +88 -0
- package/nitrogen/generated/shared/c++/ClusterConfig.hpp +140 -0
- package/nitrogen/generated/shared/c++/ClusterPressEvent.hpp +86 -0
- package/nitrogen/generated/shared/c++/ClusterStrategy.hpp +76 -0
- package/nitrogen/generated/shared/c++/Coordinate.hpp +79 -0
- package/nitrogen/generated/shared/c++/EdgePadding.hpp +87 -0
- package/nitrogen/generated/shared/c++/HybridNitroMapConfigSpec.cpp +22 -0
- package/nitrogen/generated/shared/c++/HybridNitroMapConfigSpec.hpp +65 -0
- package/nitrogen/generated/shared/c++/HybridNitroMapSpec.cpp +82 -0
- package/nitrogen/generated/shared/c++/HybridNitroMapSpec.hpp +173 -0
- package/nitrogen/generated/shared/c++/ImageMarkerConfig.hpp +103 -0
- package/nitrogen/generated/shared/c++/MapBoundaries.hpp +80 -0
- package/nitrogen/generated/shared/c++/MapError.hpp +79 -0
- package/nitrogen/generated/shared/c++/MapPressEvent.hpp +83 -0
- package/nitrogen/generated/shared/c++/MapProvider.hpp +80 -0
- package/nitrogen/generated/shared/c++/MapStyleElement.hpp +87 -0
- package/nitrogen/generated/shared/c++/MapStyler.hpp +96 -0
- package/nitrogen/generated/shared/c++/MapType.hpp +80 -0
- package/nitrogen/generated/shared/c++/MarkerAnimation.hpp +80 -0
- package/nitrogen/generated/shared/c++/MarkerColor.hpp +87 -0
- package/nitrogen/generated/shared/c++/MarkerConfig.hpp +91 -0
- package/nitrogen/generated/shared/c++/MarkerData.hpp +131 -0
- package/nitrogen/generated/shared/c++/MarkerDragEvent.hpp +81 -0
- package/nitrogen/generated/shared/c++/MarkerPressEvent.hpp +81 -0
- package/nitrogen/generated/shared/c++/MarkerStyle.hpp +80 -0
- package/nitrogen/generated/shared/c++/Point.hpp +79 -0
- package/nitrogen/generated/shared/c++/PriceMarkerStyle.hpp +119 -0
- package/nitrogen/generated/shared/c++/Region.hpp +87 -0
- package/nitrogen/generated/shared/c++/RegionChangeEvent.hpp +80 -0
- package/nitrogen/generated/shared/c++/views/HybridNitroMapComponent.cpp +351 -0
- package/nitrogen/generated/shared/c++/views/HybridNitroMapComponent.hpp +141 -0
- package/nitrogen/generated/shared/json/NitroMapConfig.json +32 -0
- package/package.json +176 -0
- package/react-native.config.js +16 -0
- package/src/components/ImageMarker.tsx +254 -0
- package/src/components/NitroMap.tsx +433 -0
- package/src/components/PriceMarker.tsx +311 -0
- package/src/context/NitroMapContext.tsx +33 -0
- package/src/hooks/useNitroMarker.ts +198 -0
- package/src/index.tsx +62 -0
- package/src/modules/index.ts +6 -0
- package/src/modules/module.ts +45 -0
- package/src/specs/NitroMap.nitro.ts +292 -0
- package/src/specs/NitroMapConfig.nitro.ts +8 -0
- package/src/types/map.ts +166 -0
- package/src/types/marker.ts +267 -0
- package/src/utils/colors.ts +159 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
package com.margelo.nitro.nitromap.providers
|
|
2
|
+
|
|
3
|
+
import android.view.View
|
|
4
|
+
import com.margelo.nitro.core.Promise
|
|
5
|
+
import com.margelo.nitro.nitromap.*
|
|
6
|
+
|
|
7
|
+
/** Interface for map providers (Google, Yandex) Mirrors iOS MapProviderProtocol */
|
|
8
|
+
interface MapProviderInterface {
|
|
9
|
+
|
|
10
|
+
// MARK: - View
|
|
11
|
+
val mapView: View
|
|
12
|
+
|
|
13
|
+
// MARK: - Setup
|
|
14
|
+
fun setup()
|
|
15
|
+
fun onResume()
|
|
16
|
+
fun onPause()
|
|
17
|
+
fun onDestroy()
|
|
18
|
+
|
|
19
|
+
// MARK: - Properties
|
|
20
|
+
var initialRegion: Region?
|
|
21
|
+
var showsUserLocation: Boolean?
|
|
22
|
+
var showsMyLocationButton: Boolean?
|
|
23
|
+
var zoomEnabled: Boolean?
|
|
24
|
+
var scrollEnabled: Boolean?
|
|
25
|
+
var rotateEnabled: Boolean?
|
|
26
|
+
var pitchEnabled: Boolean?
|
|
27
|
+
var mapType: MapType?
|
|
28
|
+
var clusterConfig: ClusterConfig?
|
|
29
|
+
var darkMode: Boolean?
|
|
30
|
+
var customMapStyle: Array<MapStyleElement>?
|
|
31
|
+
|
|
32
|
+
// MARK: - Callbacks
|
|
33
|
+
var onMapReady: (() -> Unit)?
|
|
34
|
+
var onPress: ((event: MapPressEvent) -> Unit)?
|
|
35
|
+
var onLongPress: ((event: MapPressEvent) -> Unit)?
|
|
36
|
+
var onRegionChange: ((event: RegionChangeEvent) -> Unit)?
|
|
37
|
+
var onRegionChangeComplete: ((event: RegionChangeEvent) -> Unit)?
|
|
38
|
+
var onMarkerPress: ((event: MarkerPressEvent) -> Unit)?
|
|
39
|
+
var onMarkerDragStart: ((event: MarkerDragEvent) -> Unit)?
|
|
40
|
+
var onMarkerDrag: ((event: MarkerDragEvent) -> Unit)?
|
|
41
|
+
var onMarkerDragEnd: ((event: MarkerDragEvent) -> Unit)?
|
|
42
|
+
var onClusterPress: ((event: ClusterPressEvent) -> Unit)?
|
|
43
|
+
var onError: ((error: MapError) -> Unit)?
|
|
44
|
+
|
|
45
|
+
// MARK: - Camera Methods
|
|
46
|
+
fun animateToRegion(region: Region, duration: Double)
|
|
47
|
+
fun animateCamera(camera: Camera, duration: Double)
|
|
48
|
+
fun setCamera(camera: Camera)
|
|
49
|
+
fun getCamera(): Promise<Camera>
|
|
50
|
+
fun fitToCoordinates(coordinates: Array<Coordinate>, padding: EdgePadding, animated: Boolean)
|
|
51
|
+
fun getMapBoundaries(): Promise<MapBoundaries>
|
|
52
|
+
fun getCurrentRegion(): Region
|
|
53
|
+
|
|
54
|
+
// MARK: - Marker Methods
|
|
55
|
+
fun addMarker(marker: MarkerData)
|
|
56
|
+
fun addMarkers(markers: Array<MarkerData>)
|
|
57
|
+
fun updateMarker(marker: MarkerData)
|
|
58
|
+
fun removeMarker(id: String)
|
|
59
|
+
fun clearMarkers()
|
|
60
|
+
fun selectMarker(id: String)
|
|
61
|
+
|
|
62
|
+
// MARK: - Clustering
|
|
63
|
+
fun setClusteringEnabled(enabled: Boolean)
|
|
64
|
+
fun refreshClusters()
|
|
65
|
+
fun performClustering()
|
|
66
|
+
|
|
67
|
+
// MARK: - Styling
|
|
68
|
+
fun setMapStyle(style: Array<MapStyleElement>?)
|
|
69
|
+
fun setIsDarkMode(enabled: Boolean)
|
|
70
|
+
}
|
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <vector>
|
|
4
|
+
#include <unordered_map>
|
|
5
|
+
#include <string>
|
|
6
|
+
#include <cmath>
|
|
7
|
+
#include <algorithm>
|
|
8
|
+
|
|
9
|
+
#include "KDBush.hpp"
|
|
10
|
+
|
|
11
|
+
namespace nitromap {
|
|
12
|
+
|
|
13
|
+
// ============================================================================
|
|
14
|
+
// DATA STRUCTURES
|
|
15
|
+
// ============================================================================
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Marker point — pure geographic data for spatial grouping.
|
|
19
|
+
* No icon dimensions: collision detection uses real rendered sizes in Swift.
|
|
20
|
+
*/
|
|
21
|
+
struct MarkerPoint {
|
|
22
|
+
std::string id;
|
|
23
|
+
double latitude;
|
|
24
|
+
double longitude;
|
|
25
|
+
|
|
26
|
+
MarkerPoint() : id(""), latitude(0), longitude(0) {}
|
|
27
|
+
MarkerPoint(const std::string& id, double lat, double lon)
|
|
28
|
+
: id(id), latitude(lat), longitude(lon) {}
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Cluster containing multiple markers
|
|
33
|
+
*/
|
|
34
|
+
struct Cluster {
|
|
35
|
+
double latitude;
|
|
36
|
+
double longitude;
|
|
37
|
+
std::vector<std::string> markerIds;
|
|
38
|
+
int count;
|
|
39
|
+
|
|
40
|
+
Cluster() : latitude(0), longitude(0), count(0) {}
|
|
41
|
+
|
|
42
|
+
/// Returns cluster icon diameter in screen points.
|
|
43
|
+
/// Used as a hint; actual collision uses rendered icon size in Swift.
|
|
44
|
+
static double iconSize(int count) {
|
|
45
|
+
return count < 10 ? 44.0 : (count < 100 ? 52.0 : 60.0);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Result of clustering operation
|
|
51
|
+
*/
|
|
52
|
+
struct ClusterResult {
|
|
53
|
+
std::vector<Cluster> clusters;
|
|
54
|
+
std::vector<MarkerPoint> singleMarkers;
|
|
55
|
+
|
|
56
|
+
void clear() {
|
|
57
|
+
clusters.clear();
|
|
58
|
+
singleMarkers.clear();
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
// ============================================================================
|
|
64
|
+
// MERCATOR PROJECTION (same as Supercluster)
|
|
65
|
+
// ============================================================================
|
|
66
|
+
|
|
67
|
+
/// Longitude to Mercator X [0..1]
|
|
68
|
+
inline double lngX(double lng) {
|
|
69
|
+
return lng / 360.0 + 0.5;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/// Latitude to Mercator Y [0..1]
|
|
73
|
+
inline double latY(double lat) {
|
|
74
|
+
double sinLat = std::sin(lat * M_PI / 180.0);
|
|
75
|
+
double y = 0.5 - 0.25 * std::log((1.0 + sinLat) / (1.0 - sinLat)) / M_PI;
|
|
76
|
+
return y < 0.0 ? 0.0 : (y > 1.0 ? 1.0 : y);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/// Mercator X [0..1] to Longitude
|
|
80
|
+
inline double xLng(double x) {
|
|
81
|
+
return (x - 0.5) * 360.0;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/// Mercator Y [0..1] to Latitude
|
|
85
|
+
inline double yLat(double y) {
|
|
86
|
+
double y2 = (180.0 - y * 360.0) * M_PI / 180.0;
|
|
87
|
+
return 360.0 * std::atan(std::exp(y2)) / M_PI - 90.0;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// ============================================================================
|
|
91
|
+
// FLAT ARRAY LAYOUT per zoom level
|
|
92
|
+
// ============================================================================
|
|
93
|
+
|
|
94
|
+
// Each item uses STRIDE doubles:
|
|
95
|
+
// [mercatorX, mercatorY, numPoints, originIndex]
|
|
96
|
+
static constexpr int STRIDE = 4;
|
|
97
|
+
static constexpr int OFF_X = 0;
|
|
98
|
+
static constexpr int OFF_Y = 1;
|
|
99
|
+
static constexpr int OFF_NUM = 2;
|
|
100
|
+
static constexpr int OFF_ORIGIN = 3;
|
|
101
|
+
|
|
102
|
+
// ============================================================================
|
|
103
|
+
// CLUSTER ENGINE — Supercluster algorithm with KDBush
|
|
104
|
+
//
|
|
105
|
+
// Phase 1 (load-time, O(n log n)):
|
|
106
|
+
// Project all markers to Mercator [0..1]. Build KDBush at maxZoom+1.
|
|
107
|
+
// Cluster bottom-up from maxZoom to minZoom. Each zoom level gets
|
|
108
|
+
// its own flat data array + KDBush index.
|
|
109
|
+
//
|
|
110
|
+
// Phase 2 (render-time, O(√n + k)):
|
|
111
|
+
// getClusters() range-queries the KDBush at floor(zoom).
|
|
112
|
+
//
|
|
113
|
+
// Collision detection happens in Swift using real rendered icon sizes.
|
|
114
|
+
// ============================================================================
|
|
115
|
+
|
|
116
|
+
class ClusterEngine {
|
|
117
|
+
public:
|
|
118
|
+
ClusterEngine()
|
|
119
|
+
: minZoom_(0), maxZoom_(16), radiusPixels_(80.0),
|
|
120
|
+
minClusterSize_(2), extent_(512.0), loaded_(false), markersChanged_(false) {}
|
|
121
|
+
|
|
122
|
+
~ClusterEngine() = default;
|
|
123
|
+
|
|
124
|
+
// --- Configuration ---
|
|
125
|
+
void setClusterRadius(double radiusInPixels) {
|
|
126
|
+
if (radiusPixels_ != radiusInPixels) {
|
|
127
|
+
radiusPixels_ = radiusInPixels;
|
|
128
|
+
markersChanged_ = true;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
void setMinClusterSize(int size) {
|
|
132
|
+
if (minClusterSize_ != size) {
|
|
133
|
+
minClusterSize_ = size;
|
|
134
|
+
markersChanged_ = true;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
void setMaxZoom(double zoom) {
|
|
138
|
+
int z = static_cast<int>(zoom);
|
|
139
|
+
if (maxZoom_ != z) {
|
|
140
|
+
maxZoom_ = z;
|
|
141
|
+
markersChanged_ = true;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// --- Marker management ---
|
|
146
|
+
void addMarker(const MarkerPoint& marker) {
|
|
147
|
+
markers_[marker.id] = marker;
|
|
148
|
+
markersChanged_ = true;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
void addMarkers(const std::vector<MarkerPoint>& markers) {
|
|
152
|
+
for (const auto& m : markers) markers_[m.id] = m;
|
|
153
|
+
markersChanged_ = true;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
void removeMarker(const std::string& id) {
|
|
157
|
+
markers_.erase(id);
|
|
158
|
+
markersChanged_ = true;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
void clearMarkers() {
|
|
162
|
+
markers_.clear();
|
|
163
|
+
markersChanged_ = true;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
size_t markerCount() const { return markers_.size(); }
|
|
167
|
+
|
|
168
|
+
// --- Main API ---
|
|
169
|
+
ClusterResult getClusters(
|
|
170
|
+
double visMinLat, double visMaxLat,
|
|
171
|
+
double visMinLon, double visMaxLon,
|
|
172
|
+
double zoom, double mapW, double mapH
|
|
173
|
+
);
|
|
174
|
+
|
|
175
|
+
// Backward compat
|
|
176
|
+
ClusterResult cluster(
|
|
177
|
+
double visMinLat, double visMaxLat,
|
|
178
|
+
double visMinLon, double visMaxLon,
|
|
179
|
+
double zoom, double mapW, double mapH
|
|
180
|
+
) {
|
|
181
|
+
return getClusters(visMinLat, visMaxLat, visMinLon, visMaxLon, zoom, mapW, mapH);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
private:
|
|
185
|
+
void buildHierarchy();
|
|
186
|
+
|
|
187
|
+
// --- Input ---
|
|
188
|
+
std::unordered_map<std::string, MarkerPoint> markers_;
|
|
189
|
+
std::vector<std::string> inputIds_;
|
|
190
|
+
|
|
191
|
+
// --- Per zoom level: flat data + spatial index ---
|
|
192
|
+
std::vector<std::vector<double>> zoomData_;
|
|
193
|
+
std::vector<std::vector<std::vector<int>>> zoomMembers_;
|
|
194
|
+
std::vector<KDBush> zoomIndex_;
|
|
195
|
+
|
|
196
|
+
// --- Config ---
|
|
197
|
+
int minZoom_, maxZoom_;
|
|
198
|
+
double radiusPixels_;
|
|
199
|
+
int minClusterSize_;
|
|
200
|
+
double extent_;
|
|
201
|
+
bool loaded_, markersChanged_;
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
// ============================================================================
|
|
205
|
+
// IMPLEMENTATION
|
|
206
|
+
// ============================================================================
|
|
207
|
+
|
|
208
|
+
inline void ClusterEngine::buildHierarchy() {
|
|
209
|
+
if (markers_.empty()) {
|
|
210
|
+
zoomData_.clear();
|
|
211
|
+
zoomMembers_.clear();
|
|
212
|
+
zoomIndex_.clear();
|
|
213
|
+
loaded_ = true;
|
|
214
|
+
markersChanged_ = false;
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
int numZooms = maxZoom_ + 2;
|
|
219
|
+
zoomData_.resize(numZooms);
|
|
220
|
+
zoomMembers_.resize(numZooms);
|
|
221
|
+
zoomIndex_.resize(numZooms);
|
|
222
|
+
|
|
223
|
+
// --- Step 1: Project all markers to Mercator space ---
|
|
224
|
+
inputIds_.clear();
|
|
225
|
+
inputIds_.reserve(markers_.size());
|
|
226
|
+
|
|
227
|
+
auto& baseData = zoomData_[maxZoom_ + 1];
|
|
228
|
+
auto& baseMembers = zoomMembers_[maxZoom_ + 1];
|
|
229
|
+
baseData.clear();
|
|
230
|
+
baseMembers.clear();
|
|
231
|
+
|
|
232
|
+
// Sort marker IDs for deterministic iteration order.
|
|
233
|
+
// std::unordered_map has non-deterministic iteration which causes
|
|
234
|
+
// different cluster results on each rebuild.
|
|
235
|
+
std::vector<std::string> sortedIds;
|
|
236
|
+
sortedIds.reserve(markers_.size());
|
|
237
|
+
for (const auto& pair : markers_) {
|
|
238
|
+
sortedIds.push_back(pair.first);
|
|
239
|
+
}
|
|
240
|
+
std::sort(sortedIds.begin(), sortedIds.end());
|
|
241
|
+
|
|
242
|
+
int idx = 0;
|
|
243
|
+
for (const auto& id : sortedIds) {
|
|
244
|
+
const auto& m = markers_[id];
|
|
245
|
+
double mx = lngX(m.longitude);
|
|
246
|
+
double my = latY(m.latitude);
|
|
247
|
+
|
|
248
|
+
baseData.push_back(mx); // OFF_X
|
|
249
|
+
baseData.push_back(my); // OFF_Y
|
|
250
|
+
baseData.push_back(1.0); // OFF_NUM
|
|
251
|
+
baseData.push_back(static_cast<double>(idx)); // OFF_ORIGIN
|
|
252
|
+
|
|
253
|
+
baseMembers.push_back({idx});
|
|
254
|
+
inputIds_.push_back(m.id);
|
|
255
|
+
idx++;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// Build KDBush at maxZoom+1
|
|
259
|
+
size_t baseCount = baseMembers.size();
|
|
260
|
+
{
|
|
261
|
+
std::vector<double> coords(baseCount * 2);
|
|
262
|
+
for (size_t i = 0; i < baseCount; i++) {
|
|
263
|
+
coords[2 * i] = baseData[i * STRIDE + OFF_X];
|
|
264
|
+
coords[2 * i + 1] = baseData[i * STRIDE + OFF_Y];
|
|
265
|
+
}
|
|
266
|
+
zoomIndex_[maxZoom_ + 1].build(coords, baseCount);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// --- Step 2: Cluster bottom-up from maxZoom to minZoom ---
|
|
270
|
+
for (int z = maxZoom_; z >= minZoom_; z--) {
|
|
271
|
+
double r = radiusPixels_ / (extent_ * std::pow(2.0, z));
|
|
272
|
+
|
|
273
|
+
auto& prevData = zoomData_[z + 1];
|
|
274
|
+
auto& prevMembers = zoomMembers_[z + 1];
|
|
275
|
+
auto& nextData = zoomData_[z];
|
|
276
|
+
auto& nextMembers = zoomMembers_[z];
|
|
277
|
+
nextData.clear();
|
|
278
|
+
nextMembers.clear();
|
|
279
|
+
|
|
280
|
+
size_t prevCount = prevMembers.size();
|
|
281
|
+
std::vector<bool> used(prevCount, false);
|
|
282
|
+
|
|
283
|
+
for (size_t i = 0; i < prevCount; i++) {
|
|
284
|
+
if (used[i]) continue;
|
|
285
|
+
used[i] = true;
|
|
286
|
+
|
|
287
|
+
size_t k = i * STRIDE;
|
|
288
|
+
double px = prevData[k + OFF_X];
|
|
289
|
+
double py = prevData[k + OFF_Y];
|
|
290
|
+
int numPointsOrigin = static_cast<int>(prevData[k + OFF_NUM]);
|
|
291
|
+
|
|
292
|
+
std::vector<int> neighborIndices = zoomIndex_[z + 1].within(px, py, r);
|
|
293
|
+
|
|
294
|
+
int numPoints = numPointsOrigin;
|
|
295
|
+
std::vector<size_t> toMerge;
|
|
296
|
+
|
|
297
|
+
for (int ni : neighborIndices) {
|
|
298
|
+
size_t si = static_cast<size_t>(ni);
|
|
299
|
+
if (si == i || used[si]) continue;
|
|
300
|
+
numPoints += static_cast<int>(prevData[si * STRIDE + OFF_NUM]);
|
|
301
|
+
toMerge.push_back(si);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
if (numPoints >= minClusterSize_ && !toMerge.empty()) {
|
|
305
|
+
// Form a cluster — weighted centroid
|
|
306
|
+
double wx = px * numPointsOrigin;
|
|
307
|
+
double wy = py * numPointsOrigin;
|
|
308
|
+
std::vector<int> allMembers = prevMembers[i];
|
|
309
|
+
|
|
310
|
+
for (size_t ni : toMerge) {
|
|
311
|
+
used[ni] = true;
|
|
312
|
+
size_t nk = ni * STRIDE;
|
|
313
|
+
int np = static_cast<int>(prevData[nk + OFF_NUM]);
|
|
314
|
+
wx += prevData[nk + OFF_X] * np;
|
|
315
|
+
wy += prevData[nk + OFF_Y] * np;
|
|
316
|
+
for (int mi : prevMembers[ni]) {
|
|
317
|
+
allMembers.push_back(mi);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
double cx = wx / numPoints;
|
|
322
|
+
double cy = wy / numPoints;
|
|
323
|
+
|
|
324
|
+
nextData.push_back(cx); // OFF_X
|
|
325
|
+
nextData.push_back(cy); // OFF_Y
|
|
326
|
+
nextData.push_back(static_cast<double>(numPoints)); // OFF_NUM
|
|
327
|
+
nextData.push_back(prevData[k + OFF_ORIGIN]); // OFF_ORIGIN
|
|
328
|
+
nextMembers.push_back(std::move(allMembers));
|
|
329
|
+
|
|
330
|
+
} else {
|
|
331
|
+
// Keep as individual item
|
|
332
|
+
for (int s = 0; s < STRIDE; s++) {
|
|
333
|
+
nextData.push_back(prevData[k + s]);
|
|
334
|
+
}
|
|
335
|
+
nextMembers.push_back(prevMembers[i]);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
// Build KDBush for this zoom level
|
|
340
|
+
size_t nextCount = nextMembers.size();
|
|
341
|
+
std::vector<double> coords(nextCount * 2);
|
|
342
|
+
for (size_t i = 0; i < nextCount; i++) {
|
|
343
|
+
coords[2 * i] = nextData[i * STRIDE + OFF_X];
|
|
344
|
+
coords[2 * i + 1] = nextData[i * STRIDE + OFF_Y];
|
|
345
|
+
}
|
|
346
|
+
zoomIndex_[z].build(coords, nextCount);
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
loaded_ = true;
|
|
350
|
+
markersChanged_ = false;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
inline ClusterResult ClusterEngine::getClusters(
|
|
354
|
+
double visMinLat, double visMaxLat,
|
|
355
|
+
double visMinLon, double visMaxLon,
|
|
356
|
+
double zoom, double mapW, double mapH
|
|
357
|
+
) {
|
|
358
|
+
ClusterResult result;
|
|
359
|
+
if (markers_.empty()) return result;
|
|
360
|
+
if (markersChanged_ || !loaded_) buildHierarchy();
|
|
361
|
+
if (zoomIndex_.empty()) return result;
|
|
362
|
+
|
|
363
|
+
// Clamp zoom
|
|
364
|
+
int z = static_cast<int>(std::floor(zoom));
|
|
365
|
+
if (z > maxZoom_) z = maxZoom_ + 1;
|
|
366
|
+
if (z < minZoom_) z = minZoom_;
|
|
367
|
+
|
|
368
|
+
// Convert bounds to Mercator
|
|
369
|
+
double minX = lngX(visMinLon);
|
|
370
|
+
double maxX = lngX(visMaxLon);
|
|
371
|
+
double minY = latY(visMaxLat);
|
|
372
|
+
double maxY = latY(visMinLat);
|
|
373
|
+
|
|
374
|
+
// Range query on KDBush
|
|
375
|
+
std::vector<int> indices = zoomIndex_[z].range(minX, minY, maxX, maxY);
|
|
376
|
+
|
|
377
|
+
auto& zData = zoomData_[z];
|
|
378
|
+
auto& zMembers = zoomMembers_[z];
|
|
379
|
+
|
|
380
|
+
for (int idx : indices) {
|
|
381
|
+
size_t i = static_cast<size_t>(idx);
|
|
382
|
+
size_t k = i * STRIDE;
|
|
383
|
+
int numPoints = static_cast<int>(zData[k + OFF_NUM]);
|
|
384
|
+
|
|
385
|
+
if (numPoints >= minClusterSize_) {
|
|
386
|
+
Cluster cluster;
|
|
387
|
+
cluster.latitude = yLat(zData[k + OFF_Y]);
|
|
388
|
+
cluster.longitude = xLng(zData[k + OFF_X]);
|
|
389
|
+
cluster.count = numPoints;
|
|
390
|
+
for (int mi : zMembers[i]) {
|
|
391
|
+
if (mi >= 0 && mi < static_cast<int>(inputIds_.size())) {
|
|
392
|
+
cluster.markerIds.push_back(inputIds_[mi]);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
result.clusters.push_back(std::move(cluster));
|
|
396
|
+
} else {
|
|
397
|
+
for (int mi : zMembers[i]) {
|
|
398
|
+
if (mi >= 0 && mi < static_cast<int>(inputIds_.size())) {
|
|
399
|
+
auto it = markers_.find(inputIds_[mi]);
|
|
400
|
+
if (it != markers_.end()) {
|
|
401
|
+
result.singleMarkers.push_back(it->second);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
return result;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
} // namespace nitromap
|