@maydon_tech/react-native-nitro-maps 0.1.4 → 0.2.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 +1 -1
- package/NitroMap.podspec +1 -1
- package/README.md +82 -9
- package/android/CMakeLists.txt +4 -1
- package/android/gradle.properties +4 -4
- package/android/src/main/cpp/ClusterEngineJNI.cpp +198 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/NitroMap.kt +397 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/NitroMapConfig.kt +53 -0
- package/android/src/main/{java → kotlin}/com/margelo/nitro/nitromap/NitroMapPackage.kt +4 -4
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/NitroMapView.kt +73 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/UserLocationManager.kt +295 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/clustering/ClusterIconRenderer.kt +111 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/clustering/ClusteringManager.kt +104 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/clustering/NitroClusterEngine.kt +166 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/markers/MarkerIconFactory.kt +303 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/markers/MarkerSelectionHandler.kt +72 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/markers/PriceMarkerRenderer.kt +159 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/MapProviderFactory.kt +24 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/MapProviderInterface.kt +128 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapDelegate.kt +317 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider+Clustering.kt +524 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider+Markers.kt +358 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider+Overlays.kt +272 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider+UserLocation.kt +296 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider.kt +815 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/MarkerTagData.kt +19 -0
- package/ios/Location/NitroLocationManager.swift +116 -0
- package/ios/MarkerRenderer/MarkerIconFactory.swift +1 -3
- package/ios/MarkerRenderer/PriceMarkerRenderer.swift +10 -6
- package/ios/NitroMap.swift +279 -13
- package/ios/NitroMapConfig/NitroMapConfig.swift +45 -0
- package/ios/Providers/{GoogleMapDelegate.swift → Google/GoogleMapDelegate.swift} +48 -23
- package/ios/Providers/Google/GoogleMapProvider+Camera.swift +180 -0
- package/ios/Providers/Google/GoogleMapProvider+Clustering.swift +541 -0
- package/ios/Providers/Google/GoogleMapProvider+Markers.swift +270 -0
- package/ios/Providers/Google/GoogleMapProvider+Overlays.swift +245 -0
- package/ios/Providers/Google/GoogleMapProvider+UserLocation.swift +180 -0
- package/ios/Providers/Google/GoogleMapProvider.swift +342 -0
- package/ios/Providers/MapProviderFactory.swift +17 -0
- package/ios/Providers/MapProviderProtocol.swift +48 -1
- package/ios/Shared/ClusterConfig+Factory.swift +2 -2
- package/ios/Shared/MapStyleProvider.swift +6 -4
- package/ios/Shared/MarkerSelectionHandler.swift +4 -1
- package/ios/Utils/ColorValueExtension.swift +46 -67
- package/lib/module/components/ImageMarker.js +39 -29
- package/lib/module/components/ImageMarker.js.map +1 -1
- package/lib/module/components/Marker.js +118 -0
- package/lib/module/components/Marker.js.map +1 -0
- package/lib/module/components/NitroCircle.js +92 -0
- package/lib/module/components/NitroCircle.js.map +1 -0
- package/lib/module/components/NitroMap.js +216 -76
- package/lib/module/components/NitroMap.js.map +1 -1
- package/lib/module/components/NitroPolygon.js +135 -0
- package/lib/module/components/NitroPolygon.js.map +1 -0
- package/lib/module/components/NitroPolyline.js +115 -0
- package/lib/module/components/NitroPolyline.js.map +1 -0
- package/lib/module/components/PriceMarker.js +16 -29
- package/lib/module/components/PriceMarker.js.map +1 -1
- package/lib/module/context/NitroMapContext.js.map +1 -1
- package/lib/module/hooks/useNitroCircle.js +18 -0
- package/lib/module/hooks/useNitroCircle.js.map +1 -0
- package/lib/module/hooks/useNitroMarker.js +26 -9
- package/lib/module/hooks/useNitroMarker.js.map +1 -1
- package/lib/module/hooks/useNitroOverlay.js +59 -0
- package/lib/module/hooks/useNitroOverlay.js.map +1 -0
- package/lib/module/hooks/useNitroPolygon.js +18 -0
- package/lib/module/hooks/useNitroPolygon.js.map +1 -0
- package/lib/module/hooks/useNitroPolyline.js +18 -0
- package/lib/module/hooks/useNitroPolyline.js.map +1 -0
- package/lib/module/index.js +5 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/types/overlay.js +4 -0
- package/lib/module/types/overlay.js.map +1 -0
- package/lib/module/types/theme.js +4 -0
- package/lib/module/types/theme.js.map +1 -0
- package/lib/module/utils/colors.js +41 -13
- package/lib/module/utils/colors.js.map +1 -1
- package/lib/module/utils/validation.js +45 -0
- package/lib/module/utils/validation.js.map +1 -0
- package/lib/typescript/src/components/ImageMarker.d.ts.map +1 -1
- package/lib/typescript/src/components/Marker.d.ts +34 -0
- package/lib/typescript/src/components/Marker.d.ts.map +1 -0
- package/lib/typescript/src/components/NitroCircle.d.ts +70 -0
- package/lib/typescript/src/components/NitroCircle.d.ts.map +1 -0
- package/lib/typescript/src/components/NitroMap.d.ts +60 -3
- package/lib/typescript/src/components/NitroMap.d.ts.map +1 -1
- package/lib/typescript/src/components/NitroPolygon.d.ts +86 -0
- package/lib/typescript/src/components/NitroPolygon.d.ts.map +1 -0
- package/lib/typescript/src/components/NitroPolyline.d.ts +84 -0
- package/lib/typescript/src/components/NitroPolyline.d.ts.map +1 -0
- package/lib/typescript/src/components/PriceMarker.d.ts +0 -5
- package/lib/typescript/src/components/PriceMarker.d.ts.map +1 -1
- package/lib/typescript/src/context/NitroMapContext.d.ts +2 -0
- package/lib/typescript/src/context/NitroMapContext.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useNitroCircle.d.ts +7 -0
- package/lib/typescript/src/hooks/useNitroCircle.d.ts.map +1 -0
- package/lib/typescript/src/hooks/useNitroMarker.d.ts +20 -0
- package/lib/typescript/src/hooks/useNitroMarker.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useNitroOverlay.d.ts +26 -0
- package/lib/typescript/src/hooks/useNitroOverlay.d.ts.map +1 -0
- package/lib/typescript/src/hooks/useNitroPolygon.d.ts +7 -0
- package/lib/typescript/src/hooks/useNitroPolygon.d.ts.map +1 -0
- package/lib/typescript/src/hooks/useNitroPolyline.d.ts +7 -0
- package/lib/typescript/src/hooks/useNitroPolyline.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +15 -2
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/specs/NitroMap.nitro.d.ts +248 -6
- package/lib/typescript/src/specs/NitroMap.nitro.d.ts.map +1 -1
- package/lib/typescript/src/types/map.d.ts +34 -4
- package/lib/typescript/src/types/map.d.ts.map +1 -1
- package/lib/typescript/src/types/marker.d.ts +24 -36
- package/lib/typescript/src/types/marker.d.ts.map +1 -1
- package/lib/typescript/src/types/overlay.d.ts +75 -0
- package/lib/typescript/src/types/overlay.d.ts.map +1 -0
- package/lib/typescript/src/types/theme.d.ts +93 -0
- package/lib/typescript/src/types/theme.d.ts.map +1 -0
- package/lib/typescript/src/utils/colors.d.ts +6 -8
- package/lib/typescript/src/utils/colors.d.ts.map +1 -1
- package/lib/typescript/src/utils/validation.d.ts +12 -0
- package/lib/typescript/src/utils/validation.d.ts.map +1 -0
- package/nitrogen/generated/android/c++/JCircleData.hpp +94 -0
- package/nitrogen/generated/android/c++/JClusterConfig.hpp +5 -7
- package/nitrogen/generated/android/c++/JFunc_void_UserLocationChangeEvent.hpp +79 -0
- package/nitrogen/generated/android/c++/JFunc_void_UserTrackingMode.hpp +77 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__string.hpp +76 -0
- package/nitrogen/generated/android/c++/JHybridNitroMapSpec.cpp +328 -21
- package/nitrogen/generated/android/c++/JHybridNitroMapSpec.hpp +53 -2
- package/nitrogen/generated/android/c++/JMarkerAnimation.hpp +3 -6
- package/nitrogen/generated/android/c++/JMarkerData.hpp +15 -3
- package/nitrogen/generated/android/c++/JPolygonData.hpp +149 -0
- package/nitrogen/generated/android/c++/JPolylineData.hpp +113 -0
- package/nitrogen/generated/android/c++/JUserLocationChangeEvent.hpp +70 -0
- package/nitrogen/generated/android/c++/JUserTrackingMode.hpp +62 -0
- package/nitrogen/generated/android/c++/views/JHybridNitroMapStateUpdater.cpp +72 -4
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/CircleData.kt +62 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/ClusterConfig.kt +4 -4
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void_UserLocationChangeEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void_UserTrackingMode.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void_std__string.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/HybridNitroMapSpec.kt +228 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MarkerAnimation.kt +1 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MarkerData.kt +12 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/PolygonData.kt +62 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/PolylineData.kt +62 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/UserLocationChangeEvent.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/{ClusterAnimationStyle.kt → UserTrackingMode.kt} +6 -8
- package/nitrogen/generated/android/nitromapOnLoad.cpp +6 -0
- package/nitrogen/generated/ios/NitroMap-Swift-Cxx-Bridge.cpp +24 -0
- package/nitrogen/generated/ios/NitroMap-Swift-Cxx-Bridge.hpp +175 -17
- package/nitrogen/generated/ios/NitroMap-Swift-Cxx-Umbrella.hpp +15 -3
- package/nitrogen/generated/ios/c++/HybridNitroMapSpecSwift.hpp +249 -16
- package/nitrogen/generated/ios/c++/views/HybridNitroMapComponent.mm +90 -5
- package/nitrogen/generated/ios/swift/CircleData.swift +143 -0
- package/nitrogen/generated/ios/swift/ClusterConfig.swift +22 -15
- package/nitrogen/generated/ios/swift/Func_void_UserLocationChangeEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_UserTrackingMode.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__string.swift +47 -0
- package/nitrogen/generated/ios/swift/HybridNitroMapSpec.swift +35 -1
- package/nitrogen/generated/ios/swift/HybridNitroMapSpec_cxx.swift +582 -8
- package/nitrogen/generated/ios/swift/MarkerAnimation.swift +4 -8
- package/nitrogen/generated/ios/swift/MarkerData.swift +54 -2
- package/nitrogen/generated/ios/swift/PolygonData.swift +179 -0
- package/nitrogen/generated/ios/swift/PolylineData.swift +155 -0
- package/nitrogen/generated/ios/swift/UserLocationChangeEvent.swift +69 -0
- package/nitrogen/generated/ios/swift/UserTrackingMode.swift +44 -0
- package/nitrogen/generated/shared/c++/CircleData.hpp +113 -0
- package/nitrogen/generated/shared/c++/ClusterConfig.hpp +5 -8
- package/nitrogen/generated/shared/c++/HybridNitroMapSpec.cpp +53 -2
- package/nitrogen/generated/shared/c++/HybridNitroMapSpec.hpp +75 -6
- package/nitrogen/generated/shared/c++/MarkerAnimation.hpp +4 -8
- package/nitrogen/generated/shared/c++/MarkerData.hpp +14 -2
- package/nitrogen/generated/shared/c++/PolygonData.hpp +114 -0
- package/nitrogen/generated/shared/c++/PolylineData.hpp +114 -0
- package/nitrogen/generated/shared/c++/UserLocationChangeEvent.hpp +88 -0
- package/nitrogen/generated/shared/c++/UserTrackingMode.hpp +80 -0
- package/nitrogen/generated/shared/c++/views/HybridNitroMapComponent.cpp +216 -12
- package/nitrogen/generated/shared/c++/views/HybridNitroMapComponent.hpp +23 -1
- package/nitrogen/generated/shared/json/NitroMapConfig.json +18 -1
- package/package.json +36 -5
- package/src/components/ImageMarker.tsx +58 -42
- package/src/components/Marker.tsx +161 -0
- package/src/components/NitroCircle.tsx +183 -0
- package/src/components/NitroMap.tsx +328 -78
- package/src/components/NitroPolygon.tsx +229 -0
- package/src/components/NitroPolyline.tsx +208 -0
- package/src/components/PriceMarker.tsx +23 -48
- package/src/context/NitroMapContext.tsx +4 -0
- package/src/hooks/useNitroCircle.ts +25 -0
- package/src/hooks/useNitroMarker.ts +49 -10
- package/src/hooks/useNitroOverlay.ts +68 -0
- package/src/hooks/useNitroPolygon.ts +25 -0
- package/src/hooks/useNitroPolyline.ts +25 -0
- package/src/index.tsx +23 -2
- package/src/specs/NitroMap.nitro.ts +294 -5
- package/src/types/map.ts +36 -4
- package/src/types/marker.ts +24 -44
- package/src/types/overlay.ts +77 -0
- package/src/types/theme.ts +101 -0
- package/src/utils/colors.ts +48 -16
- package/src/utils/validation.ts +69 -0
- package/android/src/main/java/com/margelo/nitro/nitromap/ClusterIconGenerator.kt +0 -108
- package/android/src/main/java/com/margelo/nitro/nitromap/ColorUtils.kt +0 -63
- package/android/src/main/java/com/margelo/nitro/nitromap/HybridNitroMap.kt +0 -408
- package/android/src/main/java/com/margelo/nitro/nitromap/HybridNitroMapConfig.kt +0 -68
- package/android/src/main/java/com/margelo/nitro/nitromap/MarkerIconCache.kt +0 -176
- package/android/src/main/java/com/margelo/nitro/nitromap/MarkerIconFactory.kt +0 -252
- package/android/src/main/java/com/margelo/nitro/nitromap/clustering/NitroClusterEngine.kt +0 -252
- package/android/src/main/java/com/margelo/nitro/nitromap/clustering/QuadTree.kt +0 -195
- package/android/src/main/java/com/margelo/nitro/nitromap/providers/GoogleMapProvider.kt +0 -912
- package/android/src/main/java/com/margelo/nitro/nitromap/providers/MapProviderInterface.kt +0 -70
- package/cpp/QuadTree.hpp +0 -246
- package/ios/NitroMapConfig/HybridNitroMapConfig.swift +0 -33
- package/ios/Providers/GoogleMapProvider+Camera.swift +0 -164
- package/ios/Providers/GoogleMapProvider.swift +0 -924
- package/nitrogen/generated/android/c++/JClusterAnimationStyle.hpp +0 -68
- package/nitrogen/generated/ios/swift/ClusterAnimationStyle.swift +0 -52
- package/nitrogen/generated/shared/c++/ClusterAnimationStyle.hpp +0 -88
|
@@ -1,70 +0,0 @@
|
|
|
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
|
-
}
|
package/cpp/QuadTree.hpp
DELETED
|
@@ -1,246 +0,0 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
#include <vector>
|
|
4
|
-
#include <memory>
|
|
5
|
-
#include <cmath>
|
|
6
|
-
#include <algorithm>
|
|
7
|
-
|
|
8
|
-
namespace nitromap {
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Point structure for QuadTree
|
|
12
|
-
*/
|
|
13
|
-
struct Point {
|
|
14
|
-
double x; // longitude
|
|
15
|
-
double y; // latitude
|
|
16
|
-
std::string id;
|
|
17
|
-
|
|
18
|
-
Point() : x(0), y(0), id("") {}
|
|
19
|
-
Point(double x, double y, const std::string& id) : x(x), y(y), id(id) {}
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Bounding box for spatial queries
|
|
24
|
-
*/
|
|
25
|
-
struct BoundingBox {
|
|
26
|
-
double minX, minY, maxX, maxY;
|
|
27
|
-
|
|
28
|
-
BoundingBox() : minX(0), minY(0), maxX(0), maxY(0) {}
|
|
29
|
-
BoundingBox(double minX, double minY, double maxX, double maxY)
|
|
30
|
-
: minX(minX), minY(minY), maxX(maxX), maxY(maxY) {}
|
|
31
|
-
|
|
32
|
-
inline bool contains(const Point& p) const {
|
|
33
|
-
return p.x >= minX && p.x <= maxX && p.y >= minY && p.y <= maxY;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
inline bool intersects(const BoundingBox& other) const {
|
|
37
|
-
return !(other.minX > maxX || other.maxX < minX ||
|
|
38
|
-
other.minY > maxY || other.maxY < minY);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
inline double centerX() const { return (minX + maxX) / 2.0; }
|
|
42
|
-
inline double centerY() const { return (minY + maxY) / 2.0; }
|
|
43
|
-
inline double width() const { return maxX - minX; }
|
|
44
|
-
inline double height() const { return maxY - minY; }
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* QuadTree for efficient spatial indexing
|
|
49
|
-
* Provides O(log n) insert and query operations
|
|
50
|
-
*/
|
|
51
|
-
class QuadTree {
|
|
52
|
-
public:
|
|
53
|
-
static constexpr int MAX_POINTS = 4;
|
|
54
|
-
static constexpr int MAX_DEPTH = 12;
|
|
55
|
-
|
|
56
|
-
QuadTree(const BoundingBox& bounds, int depth = 0)
|
|
57
|
-
: bounds_(bounds), depth_(depth), divided_(false) {}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Insert a point into the QuadTree
|
|
61
|
-
* @return true if inserted successfully
|
|
62
|
-
*/
|
|
63
|
-
bool insert(const Point& point) {
|
|
64
|
-
// Point outside bounds
|
|
65
|
-
if (!bounds_.contains(point)) {
|
|
66
|
-
return false;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// If we have capacity and haven't subdivided, add here
|
|
70
|
-
if (points_.size() < MAX_POINTS && !divided_) {
|
|
71
|
-
points_.push_back(point);
|
|
72
|
-
return true;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
// Subdivide if we haven't already and we're not at max depth
|
|
76
|
-
if (!divided_ && depth_ < MAX_DEPTH) {
|
|
77
|
-
subdivide();
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// If we've subdivided, try to insert into children
|
|
81
|
-
if (divided_) {
|
|
82
|
-
if (nw_->insert(point)) return true;
|
|
83
|
-
if (ne_->insert(point)) return true;
|
|
84
|
-
if (sw_->insert(point)) return true;
|
|
85
|
-
if (se_->insert(point)) return true;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// If we're at max depth, just add to this node
|
|
89
|
-
points_.push_back(point);
|
|
90
|
-
return true;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* Query all points within a bounding box
|
|
95
|
-
* @param range The bounding box to query
|
|
96
|
-
* @param found Vector to store found points
|
|
97
|
-
*/
|
|
98
|
-
void query(const BoundingBox& range, std::vector<Point>& found) const {
|
|
99
|
-
// Range doesn't intersect this quad
|
|
100
|
-
if (!bounds_.intersects(range)) {
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// Check points in this node
|
|
105
|
-
for (const auto& point : points_) {
|
|
106
|
-
if (range.contains(point)) {
|
|
107
|
-
found.push_back(point);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// Recurse into children
|
|
112
|
-
if (divided_) {
|
|
113
|
-
nw_->query(range, found);
|
|
114
|
-
ne_->query(range, found);
|
|
115
|
-
sw_->query(range, found);
|
|
116
|
-
se_->query(range, found);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Query all points within a radius of a center point
|
|
122
|
-
* Uses squared distance for efficiency (no sqrt)
|
|
123
|
-
*/
|
|
124
|
-
void queryRadius(double centerX, double centerY, double radius,
|
|
125
|
-
std::vector<Point>& found) const {
|
|
126
|
-
// Create bounding box around circle for initial filter
|
|
127
|
-
BoundingBox range(
|
|
128
|
-
centerX - radius, centerY - radius,
|
|
129
|
-
centerX + radius, centerY + radius
|
|
130
|
-
);
|
|
131
|
-
|
|
132
|
-
if (!bounds_.intersects(range)) {
|
|
133
|
-
return;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
double radiusSquared = radius * radius;
|
|
137
|
-
|
|
138
|
-
// Check points in this node
|
|
139
|
-
for (const auto& point : points_) {
|
|
140
|
-
double dx = point.x - centerX;
|
|
141
|
-
double dy = point.y - centerY;
|
|
142
|
-
if (dx * dx + dy * dy <= radiusSquared) {
|
|
143
|
-
found.push_back(point);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
// Recurse into children
|
|
148
|
-
if (divided_) {
|
|
149
|
-
nw_->queryRadius(centerX, centerY, radius, found);
|
|
150
|
-
ne_->queryRadius(centerX, centerY, radius, found);
|
|
151
|
-
sw_->queryRadius(centerX, centerY, radius, found);
|
|
152
|
-
se_->queryRadius(centerX, centerY, radius, found);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* Get all points in the tree
|
|
158
|
-
*/
|
|
159
|
-
void getAllPoints(std::vector<Point>& allPoints) const {
|
|
160
|
-
for (const auto& point : points_) {
|
|
161
|
-
allPoints.push_back(point);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
if (divided_) {
|
|
165
|
-
nw_->getAllPoints(allPoints);
|
|
166
|
-
ne_->getAllPoints(allPoints);
|
|
167
|
-
sw_->getAllPoints(allPoints);
|
|
168
|
-
se_->getAllPoints(allPoints);
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
/**
|
|
173
|
-
* Clear all points from the tree
|
|
174
|
-
*/
|
|
175
|
-
void clear() {
|
|
176
|
-
points_.clear();
|
|
177
|
-
divided_ = false;
|
|
178
|
-
nw_.reset();
|
|
179
|
-
ne_.reset();
|
|
180
|
-
sw_.reset();
|
|
181
|
-
se_.reset();
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
* Get total number of points
|
|
186
|
-
*/
|
|
187
|
-
size_t size() const {
|
|
188
|
-
size_t count = points_.size();
|
|
189
|
-
if (divided_) {
|
|
190
|
-
count += nw_->size() + ne_->size() + sw_->size() + se_->size();
|
|
191
|
-
}
|
|
192
|
-
return count;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
private:
|
|
196
|
-
void subdivide() {
|
|
197
|
-
double cx = bounds_.centerX();
|
|
198
|
-
double cy = bounds_.centerY();
|
|
199
|
-
|
|
200
|
-
// Northwest (top-left)
|
|
201
|
-
nw_ = std::make_unique<QuadTree>(
|
|
202
|
-
BoundingBox(bounds_.minX, cy, cx, bounds_.maxY),
|
|
203
|
-
depth_ + 1
|
|
204
|
-
);
|
|
205
|
-
|
|
206
|
-
// Northeast (top-right)
|
|
207
|
-
ne_ = std::make_unique<QuadTree>(
|
|
208
|
-
BoundingBox(cx, cy, bounds_.maxX, bounds_.maxY),
|
|
209
|
-
depth_ + 1
|
|
210
|
-
);
|
|
211
|
-
|
|
212
|
-
// Southwest (bottom-left)
|
|
213
|
-
sw_ = std::make_unique<QuadTree>(
|
|
214
|
-
BoundingBox(bounds_.minX, bounds_.minY, cx, cy),
|
|
215
|
-
depth_ + 1
|
|
216
|
-
);
|
|
217
|
-
|
|
218
|
-
// Southeast (bottom-right)
|
|
219
|
-
se_ = std::make_unique<QuadTree>(
|
|
220
|
-
BoundingBox(cx, bounds_.minY, bounds_.maxX, cy),
|
|
221
|
-
depth_ + 1
|
|
222
|
-
);
|
|
223
|
-
|
|
224
|
-
divided_ = true;
|
|
225
|
-
|
|
226
|
-
// Move existing points to children
|
|
227
|
-
std::vector<Point> oldPoints = std::move(points_);
|
|
228
|
-
points_.clear();
|
|
229
|
-
|
|
230
|
-
for (const auto& point : oldPoints) {
|
|
231
|
-
if (!nw_->insert(point) && !ne_->insert(point) &&
|
|
232
|
-
!sw_->insert(point) && !se_->insert(point)) {
|
|
233
|
-
// Shouldn't happen, but keep point here if it fails
|
|
234
|
-
points_.push_back(point);
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
BoundingBox bounds_;
|
|
240
|
-
int depth_;
|
|
241
|
-
bool divided_;
|
|
242
|
-
std::vector<Point> points_;
|
|
243
|
-
std::unique_ptr<QuadTree> nw_, ne_, sw_, se_;
|
|
244
|
-
};
|
|
245
|
-
|
|
246
|
-
} // namespace nitromap
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import Foundation
|
|
2
|
-
import GoogleMaps
|
|
3
|
-
import NitroModules
|
|
4
|
-
|
|
5
|
-
class HybridNitroMapConfig: HybridNitroMapConfigSpec {
|
|
6
|
-
|
|
7
|
-
// Static flag to track initialization across all instances
|
|
8
|
-
private static var isInitialized = false
|
|
9
|
-
|
|
10
|
-
func NitroMapInitialize(apiKey: String, provider: MapProvider) {
|
|
11
|
-
// Use static flag to prevent duplicate initialization
|
|
12
|
-
guard !HybridNitroMapConfig.isInitialized else {
|
|
13
|
-
#if DEBUG
|
|
14
|
-
print("[NitroMap] Already initialized, skipping...")
|
|
15
|
-
#endif
|
|
16
|
-
return
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
// Set initialized BEFORE async dispatch to prevent race conditions
|
|
20
|
-
HybridNitroMapConfig.isInitialized = true
|
|
21
|
-
|
|
22
|
-
DispatchQueue.main.async {
|
|
23
|
-
GMSServices.provideAPIKey(apiKey)
|
|
24
|
-
#if DEBUG
|
|
25
|
-
print("[NitroMap] Google Maps initialized")
|
|
26
|
-
#endif
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
func IsNitroMapInitialized() -> Bool {
|
|
31
|
-
return HybridNitroMapConfig.isInitialized
|
|
32
|
-
}
|
|
33
|
-
}
|
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
import Foundation
|
|
2
|
-
import GoogleMaps
|
|
3
|
-
|
|
4
|
-
// MARK: - Camera Methods (SRP: Camera control only)
|
|
5
|
-
|
|
6
|
-
extension GoogleMapProvider {
|
|
7
|
-
|
|
8
|
-
func animateToRegion(_ region: Region, duration: Double?) {
|
|
9
|
-
DispatchQueue.main.async { [weak self] in
|
|
10
|
-
guard let self = self else { return }
|
|
11
|
-
let camera = GMSCameraPosition.camera(
|
|
12
|
-
withLatitude: region.latitude,
|
|
13
|
-
longitude: region.longitude,
|
|
14
|
-
zoom: self.calculateZoom(for: region)
|
|
15
|
-
)
|
|
16
|
-
|
|
17
|
-
let durationSeconds = (duration ?? 300) / 1000.0
|
|
18
|
-
|
|
19
|
-
CATransaction.begin()
|
|
20
|
-
CATransaction.setAnimationDuration(durationSeconds)
|
|
21
|
-
self.gmsMapView.animate(to: camera)
|
|
22
|
-
CATransaction.commit()
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
func fitToCoordinates(
|
|
27
|
-
_ coordinates: [Coordinate],
|
|
28
|
-
edgePadding: EdgePadding?,
|
|
29
|
-
animated: Bool?
|
|
30
|
-
) {
|
|
31
|
-
DispatchQueue.main.async { [weak self] in
|
|
32
|
-
guard let self = self else { return }
|
|
33
|
-
guard coordinates.count >= 2 else {
|
|
34
|
-
if let first = coordinates.first {
|
|
35
|
-
self.animateToRegion(
|
|
36
|
-
Region(
|
|
37
|
-
latitude: first.latitude,
|
|
38
|
-
longitude: first.longitude,
|
|
39
|
-
latitudeDelta: 0.05,
|
|
40
|
-
longitudeDelta: 0.05
|
|
41
|
-
),
|
|
42
|
-
duration: animated ?? true ? 300 : 0
|
|
43
|
-
)
|
|
44
|
-
}
|
|
45
|
-
return
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
let clCoordinates = coordinates.map {
|
|
49
|
-
CLLocationCoordinate2D(latitude: $0.latitude, longitude: $0.longitude)
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
var bounds = GMSCoordinateBounds(
|
|
53
|
-
coordinate: clCoordinates[0],
|
|
54
|
-
coordinate: clCoordinates[1]
|
|
55
|
-
)
|
|
56
|
-
|
|
57
|
-
for coord in clCoordinates.dropFirst(2) {
|
|
58
|
-
bounds = bounds.includingCoordinate(coord)
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
guard bounds.isValid else { return }
|
|
62
|
-
|
|
63
|
-
let padding = UIEdgeInsets(
|
|
64
|
-
top: CGFloat(edgePadding?.top ?? 50),
|
|
65
|
-
left: CGFloat(edgePadding?.left ?? 50),
|
|
66
|
-
bottom: CGFloat(edgePadding?.bottom ?? 50),
|
|
67
|
-
right: CGFloat(edgePadding?.right ?? 50)
|
|
68
|
-
)
|
|
69
|
-
|
|
70
|
-
let cameraUpdate = GMSCameraUpdate.fit(bounds, with: padding)
|
|
71
|
-
|
|
72
|
-
if animated ?? true {
|
|
73
|
-
self.gmsMapView.animate(with: cameraUpdate)
|
|
74
|
-
} else {
|
|
75
|
-
self.gmsMapView.moveCamera(cameraUpdate)
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
func animateCamera(_ camera: Camera, duration: Double?) {
|
|
81
|
-
DispatchQueue.main.async { [weak self] in
|
|
82
|
-
guard let self = self else { return }
|
|
83
|
-
let gmsCamera = GMSCameraPosition.camera(
|
|
84
|
-
withLatitude: camera.center.latitude,
|
|
85
|
-
longitude: camera.center.longitude,
|
|
86
|
-
zoom: Float(camera.zoom),
|
|
87
|
-
bearing: camera.heading,
|
|
88
|
-
viewingAngle: camera.pitch
|
|
89
|
-
)
|
|
90
|
-
|
|
91
|
-
let durationSeconds = (duration ?? 300) / 1000.0
|
|
92
|
-
|
|
93
|
-
CATransaction.begin()
|
|
94
|
-
CATransaction.setAnimationDuration(durationSeconds)
|
|
95
|
-
self.gmsMapView.animate(to: gmsCamera)
|
|
96
|
-
CATransaction.commit()
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
func setCamera(_ camera: Camera) {
|
|
101
|
-
DispatchQueue.main.async { [weak self] in
|
|
102
|
-
guard let self = self else { return }
|
|
103
|
-
let gmsCamera = GMSCameraPosition.camera(
|
|
104
|
-
withLatitude: camera.center.latitude,
|
|
105
|
-
longitude: camera.center.longitude,
|
|
106
|
-
zoom: Float(camera.zoom),
|
|
107
|
-
bearing: camera.heading,
|
|
108
|
-
viewingAngle: camera.pitch
|
|
109
|
-
)
|
|
110
|
-
self.gmsMapView.camera = gmsCamera
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
func getCamera() -> Camera {
|
|
115
|
-
let cam = gmsMapView.camera
|
|
116
|
-
return Camera(
|
|
117
|
-
center: Coordinate(
|
|
118
|
-
latitude: cam.target.latitude,
|
|
119
|
-
longitude: cam.target.longitude
|
|
120
|
-
),
|
|
121
|
-
pitch: cam.viewingAngle,
|
|
122
|
-
heading: cam.bearing,
|
|
123
|
-
altitude: MapStyleProvider.shared.altitudeFromZoom(Double(cam.zoom)),
|
|
124
|
-
zoom: Double(cam.zoom)
|
|
125
|
-
)
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
func getMapBoundaries() -> MapBoundaries? {
|
|
129
|
-
guard gmsMapView.frame.size.width > 0,
|
|
130
|
-
gmsMapView.frame.size.height > 0
|
|
131
|
-
else {
|
|
132
|
-
return nil
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
let visibleRegion = gmsMapView.projection.visibleRegion()
|
|
136
|
-
let bounds = GMSCoordinateBounds(region: visibleRegion)
|
|
137
|
-
|
|
138
|
-
guard bounds.isValid else { return nil }
|
|
139
|
-
|
|
140
|
-
return MapBoundaries(
|
|
141
|
-
northEast: Coordinate(
|
|
142
|
-
latitude: bounds.northEast.latitude,
|
|
143
|
-
longitude: bounds.northEast.longitude
|
|
144
|
-
),
|
|
145
|
-
southWest: Coordinate(
|
|
146
|
-
latitude: bounds.southWest.latitude,
|
|
147
|
-
longitude: bounds.southWest.longitude
|
|
148
|
-
)
|
|
149
|
-
)
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
func getCurrentRegion() -> Region {
|
|
153
|
-
let cam = gmsMapView.camera
|
|
154
|
-
let visibleRegion = gmsMapView.projection.visibleRegion()
|
|
155
|
-
let bounds = GMSCoordinateBounds(region: visibleRegion)
|
|
156
|
-
|
|
157
|
-
return Region(
|
|
158
|
-
latitude: cam.target.latitude,
|
|
159
|
-
longitude: cam.target.longitude,
|
|
160
|
-
latitudeDelta: bounds.northEast.latitude - bounds.southWest.latitude,
|
|
161
|
-
longitudeDelta: bounds.northEast.longitude - bounds.southWest.longitude
|
|
162
|
-
)
|
|
163
|
-
}
|
|
164
|
-
}
|