@maydon_tech/react-native-nitro-maps 0.1.3 → 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.
Files changed (218) hide show
  1. package/LICENSE +1 -1
  2. package/NitroMap.podspec +1 -1
  3. package/README.md +82 -9
  4. package/android/CMakeLists.txt +4 -1
  5. package/android/gradle.properties +4 -4
  6. package/android/src/main/cpp/ClusterEngineJNI.cpp +198 -0
  7. package/android/src/main/kotlin/com/margelo/nitro/nitromap/NitroMap.kt +397 -0
  8. package/android/src/main/kotlin/com/margelo/nitro/nitromap/NitroMapConfig.kt +53 -0
  9. package/android/src/main/{java → kotlin}/com/margelo/nitro/nitromap/NitroMapPackage.kt +4 -4
  10. package/android/src/main/kotlin/com/margelo/nitro/nitromap/NitroMapView.kt +73 -0
  11. package/android/src/main/kotlin/com/margelo/nitro/nitromap/UserLocationManager.kt +295 -0
  12. package/android/src/main/kotlin/com/margelo/nitro/nitromap/clustering/ClusterIconRenderer.kt +111 -0
  13. package/android/src/main/kotlin/com/margelo/nitro/nitromap/clustering/ClusteringManager.kt +104 -0
  14. package/android/src/main/kotlin/com/margelo/nitro/nitromap/clustering/NitroClusterEngine.kt +166 -0
  15. package/android/src/main/kotlin/com/margelo/nitro/nitromap/markers/MarkerIconFactory.kt +303 -0
  16. package/android/src/main/kotlin/com/margelo/nitro/nitromap/markers/MarkerSelectionHandler.kt +72 -0
  17. package/android/src/main/kotlin/com/margelo/nitro/nitromap/markers/PriceMarkerRenderer.kt +159 -0
  18. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/MapProviderFactory.kt +24 -0
  19. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/MapProviderInterface.kt +128 -0
  20. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapDelegate.kt +317 -0
  21. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider+Clustering.kt +524 -0
  22. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider+Markers.kt +358 -0
  23. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider+Overlays.kt +272 -0
  24. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider+UserLocation.kt +296 -0
  25. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider.kt +815 -0
  26. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/MarkerTagData.kt +19 -0
  27. package/ios/Clustering/ClusterIconRenderer.swift +3 -3
  28. package/ios/Location/NitroLocationManager.swift +116 -0
  29. package/ios/MarkerRenderer/MarkerIconFactory.swift +1 -3
  30. package/ios/MarkerRenderer/PriceMarkerRenderer.swift +10 -6
  31. package/ios/NitroMap.swift +279 -13
  32. package/ios/NitroMapConfig/NitroMapConfig.swift +45 -0
  33. package/ios/Providers/{GoogleMapDelegate.swift → Google/GoogleMapDelegate.swift} +48 -23
  34. package/ios/Providers/Google/GoogleMapProvider+Camera.swift +180 -0
  35. package/ios/Providers/Google/GoogleMapProvider+Clustering.swift +541 -0
  36. package/ios/Providers/Google/GoogleMapProvider+Markers.swift +270 -0
  37. package/ios/Providers/Google/GoogleMapProvider+Overlays.swift +245 -0
  38. package/ios/Providers/Google/GoogleMapProvider+UserLocation.swift +180 -0
  39. package/ios/Providers/Google/GoogleMapProvider.swift +342 -0
  40. package/ios/Providers/MapProviderFactory.swift +17 -0
  41. package/ios/Providers/MapProviderProtocol.swift +48 -1
  42. package/ios/Shared/ClusterConfig+Factory.swift +2 -2
  43. package/ios/Shared/MapStyleProvider.swift +6 -4
  44. package/ios/Shared/MarkerSelectionHandler.swift +4 -1
  45. package/ios/Utils/ColorValueExtension.swift +46 -67
  46. package/lib/module/components/ImageMarker.js +39 -29
  47. package/lib/module/components/ImageMarker.js.map +1 -1
  48. package/lib/module/components/Marker.js +118 -0
  49. package/lib/module/components/Marker.js.map +1 -0
  50. package/lib/module/components/NitroCircle.js +92 -0
  51. package/lib/module/components/NitroCircle.js.map +1 -0
  52. package/lib/module/components/NitroMap.js +216 -76
  53. package/lib/module/components/NitroMap.js.map +1 -1
  54. package/lib/module/components/NitroPolygon.js +135 -0
  55. package/lib/module/components/NitroPolygon.js.map +1 -0
  56. package/lib/module/components/NitroPolyline.js +115 -0
  57. package/lib/module/components/NitroPolyline.js.map +1 -0
  58. package/lib/module/components/PriceMarker.js +16 -29
  59. package/lib/module/components/PriceMarker.js.map +1 -1
  60. package/lib/module/context/NitroMapContext.js.map +1 -1
  61. package/lib/module/hooks/useNitroCircle.js +18 -0
  62. package/lib/module/hooks/useNitroCircle.js.map +1 -0
  63. package/lib/module/hooks/useNitroMarker.js +26 -9
  64. package/lib/module/hooks/useNitroMarker.js.map +1 -1
  65. package/lib/module/hooks/useNitroOverlay.js +59 -0
  66. package/lib/module/hooks/useNitroOverlay.js.map +1 -0
  67. package/lib/module/hooks/useNitroPolygon.js +18 -0
  68. package/lib/module/hooks/useNitroPolygon.js.map +1 -0
  69. package/lib/module/hooks/useNitroPolyline.js +18 -0
  70. package/lib/module/hooks/useNitroPolyline.js.map +1 -0
  71. package/lib/module/index.js +5 -0
  72. package/lib/module/index.js.map +1 -1
  73. package/lib/module/types/overlay.js +4 -0
  74. package/lib/module/types/overlay.js.map +1 -0
  75. package/lib/module/types/theme.js +4 -0
  76. package/lib/module/types/theme.js.map +1 -0
  77. package/lib/module/utils/colors.js +41 -13
  78. package/lib/module/utils/colors.js.map +1 -1
  79. package/lib/module/utils/validation.js +45 -0
  80. package/lib/module/utils/validation.js.map +1 -0
  81. package/lib/typescript/src/components/ImageMarker.d.ts.map +1 -1
  82. package/lib/typescript/src/components/Marker.d.ts +34 -0
  83. package/lib/typescript/src/components/Marker.d.ts.map +1 -0
  84. package/lib/typescript/src/components/NitroCircle.d.ts +70 -0
  85. package/lib/typescript/src/components/NitroCircle.d.ts.map +1 -0
  86. package/lib/typescript/src/components/NitroMap.d.ts +60 -3
  87. package/lib/typescript/src/components/NitroMap.d.ts.map +1 -1
  88. package/lib/typescript/src/components/NitroPolygon.d.ts +86 -0
  89. package/lib/typescript/src/components/NitroPolygon.d.ts.map +1 -0
  90. package/lib/typescript/src/components/NitroPolyline.d.ts +84 -0
  91. package/lib/typescript/src/components/NitroPolyline.d.ts.map +1 -0
  92. package/lib/typescript/src/components/PriceMarker.d.ts +0 -5
  93. package/lib/typescript/src/components/PriceMarker.d.ts.map +1 -1
  94. package/lib/typescript/src/context/NitroMapContext.d.ts +2 -0
  95. package/lib/typescript/src/context/NitroMapContext.d.ts.map +1 -1
  96. package/lib/typescript/src/hooks/useNitroCircle.d.ts +7 -0
  97. package/lib/typescript/src/hooks/useNitroCircle.d.ts.map +1 -0
  98. package/lib/typescript/src/hooks/useNitroMarker.d.ts +20 -0
  99. package/lib/typescript/src/hooks/useNitroMarker.d.ts.map +1 -1
  100. package/lib/typescript/src/hooks/useNitroOverlay.d.ts +26 -0
  101. package/lib/typescript/src/hooks/useNitroOverlay.d.ts.map +1 -0
  102. package/lib/typescript/src/hooks/useNitroPolygon.d.ts +7 -0
  103. package/lib/typescript/src/hooks/useNitroPolygon.d.ts.map +1 -0
  104. package/lib/typescript/src/hooks/useNitroPolyline.d.ts +7 -0
  105. package/lib/typescript/src/hooks/useNitroPolyline.d.ts.map +1 -0
  106. package/lib/typescript/src/index.d.ts +15 -2
  107. package/lib/typescript/src/index.d.ts.map +1 -1
  108. package/lib/typescript/src/specs/NitroMap.nitro.d.ts +248 -6
  109. package/lib/typescript/src/specs/NitroMap.nitro.d.ts.map +1 -1
  110. package/lib/typescript/src/types/map.d.ts +34 -4
  111. package/lib/typescript/src/types/map.d.ts.map +1 -1
  112. package/lib/typescript/src/types/marker.d.ts +24 -36
  113. package/lib/typescript/src/types/marker.d.ts.map +1 -1
  114. package/lib/typescript/src/types/overlay.d.ts +75 -0
  115. package/lib/typescript/src/types/overlay.d.ts.map +1 -0
  116. package/lib/typescript/src/types/theme.d.ts +93 -0
  117. package/lib/typescript/src/types/theme.d.ts.map +1 -0
  118. package/lib/typescript/src/utils/colors.d.ts +6 -8
  119. package/lib/typescript/src/utils/colors.d.ts.map +1 -1
  120. package/lib/typescript/src/utils/validation.d.ts +12 -0
  121. package/lib/typescript/src/utils/validation.d.ts.map +1 -0
  122. package/nitrogen/generated/android/c++/JCircleData.hpp +94 -0
  123. package/nitrogen/generated/android/c++/JClusterConfig.hpp +5 -7
  124. package/nitrogen/generated/android/c++/JFunc_void_UserLocationChangeEvent.hpp +79 -0
  125. package/nitrogen/generated/android/c++/JFunc_void_UserTrackingMode.hpp +77 -0
  126. package/nitrogen/generated/android/c++/JFunc_void_std__string.hpp +76 -0
  127. package/nitrogen/generated/android/c++/JHybridNitroMapSpec.cpp +328 -21
  128. package/nitrogen/generated/android/c++/JHybridNitroMapSpec.hpp +53 -2
  129. package/nitrogen/generated/android/c++/JMarkerAnimation.hpp +3 -6
  130. package/nitrogen/generated/android/c++/JMarkerData.hpp +15 -3
  131. package/nitrogen/generated/android/c++/JPolygonData.hpp +149 -0
  132. package/nitrogen/generated/android/c++/JPolylineData.hpp +113 -0
  133. package/nitrogen/generated/android/c++/JUserLocationChangeEvent.hpp +70 -0
  134. package/nitrogen/generated/android/c++/JUserTrackingMode.hpp +62 -0
  135. package/nitrogen/generated/android/c++/views/JHybridNitroMapStateUpdater.cpp +72 -4
  136. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/CircleData.kt +62 -0
  137. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/ClusterConfig.kt +4 -4
  138. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void_UserLocationChangeEvent.kt +80 -0
  139. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void_UserTrackingMode.kt +80 -0
  140. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void_std__string.kt +80 -0
  141. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/HybridNitroMapSpec.kt +228 -2
  142. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MarkerAnimation.kt +1 -2
  143. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MarkerData.kt +12 -3
  144. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/PolygonData.kt +62 -0
  145. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/PolylineData.kt +62 -0
  146. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/UserLocationChangeEvent.kt +47 -0
  147. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/{ClusterAnimationStyle.kt → UserTrackingMode.kt} +6 -8
  148. package/nitrogen/generated/android/nitromapOnLoad.cpp +6 -0
  149. package/nitrogen/generated/ios/NitroMap-Swift-Cxx-Bridge.cpp +24 -0
  150. package/nitrogen/generated/ios/NitroMap-Swift-Cxx-Bridge.hpp +175 -17
  151. package/nitrogen/generated/ios/NitroMap-Swift-Cxx-Umbrella.hpp +15 -3
  152. package/nitrogen/generated/ios/c++/HybridNitroMapSpecSwift.hpp +249 -16
  153. package/nitrogen/generated/ios/c++/views/HybridNitroMapComponent.mm +90 -5
  154. package/nitrogen/generated/ios/swift/CircleData.swift +143 -0
  155. package/nitrogen/generated/ios/swift/ClusterConfig.swift +22 -15
  156. package/nitrogen/generated/ios/swift/Func_void_UserLocationChangeEvent.swift +47 -0
  157. package/nitrogen/generated/ios/swift/Func_void_UserTrackingMode.swift +47 -0
  158. package/nitrogen/generated/ios/swift/Func_void_std__string.swift +47 -0
  159. package/nitrogen/generated/ios/swift/HybridNitroMapSpec.swift +35 -1
  160. package/nitrogen/generated/ios/swift/HybridNitroMapSpec_cxx.swift +582 -8
  161. package/nitrogen/generated/ios/swift/MarkerAnimation.swift +4 -8
  162. package/nitrogen/generated/ios/swift/MarkerData.swift +54 -2
  163. package/nitrogen/generated/ios/swift/PolygonData.swift +179 -0
  164. package/nitrogen/generated/ios/swift/PolylineData.swift +155 -0
  165. package/nitrogen/generated/ios/swift/UserLocationChangeEvent.swift +69 -0
  166. package/nitrogen/generated/ios/swift/UserTrackingMode.swift +44 -0
  167. package/nitrogen/generated/shared/c++/CircleData.hpp +113 -0
  168. package/nitrogen/generated/shared/c++/ClusterConfig.hpp +5 -8
  169. package/nitrogen/generated/shared/c++/HybridNitroMapSpec.cpp +53 -2
  170. package/nitrogen/generated/shared/c++/HybridNitroMapSpec.hpp +75 -6
  171. package/nitrogen/generated/shared/c++/MarkerAnimation.hpp +4 -8
  172. package/nitrogen/generated/shared/c++/MarkerData.hpp +14 -2
  173. package/nitrogen/generated/shared/c++/PolygonData.hpp +114 -0
  174. package/nitrogen/generated/shared/c++/PolylineData.hpp +114 -0
  175. package/nitrogen/generated/shared/c++/UserLocationChangeEvent.hpp +88 -0
  176. package/nitrogen/generated/shared/c++/UserTrackingMode.hpp +80 -0
  177. package/nitrogen/generated/shared/c++/views/HybridNitroMapComponent.cpp +216 -12
  178. package/nitrogen/generated/shared/c++/views/HybridNitroMapComponent.hpp +23 -1
  179. package/nitrogen/generated/shared/json/NitroMapConfig.json +18 -1
  180. package/package.json +36 -5
  181. package/src/components/ImageMarker.tsx +58 -42
  182. package/src/components/Marker.tsx +161 -0
  183. package/src/components/NitroCircle.tsx +183 -0
  184. package/src/components/NitroMap.tsx +328 -78
  185. package/src/components/NitroPolygon.tsx +229 -0
  186. package/src/components/NitroPolyline.tsx +208 -0
  187. package/src/components/PriceMarker.tsx +23 -48
  188. package/src/context/NitroMapContext.tsx +4 -0
  189. package/src/hooks/useNitroCircle.ts +25 -0
  190. package/src/hooks/useNitroMarker.ts +49 -10
  191. package/src/hooks/useNitroOverlay.ts +68 -0
  192. package/src/hooks/useNitroPolygon.ts +25 -0
  193. package/src/hooks/useNitroPolyline.ts +25 -0
  194. package/src/index.tsx +23 -2
  195. package/src/specs/NitroMap.nitro.ts +294 -5
  196. package/src/types/map.ts +36 -4
  197. package/src/types/marker.ts +24 -44
  198. package/src/types/overlay.ts +77 -0
  199. package/src/types/theme.ts +101 -0
  200. package/src/utils/colors.ts +48 -16
  201. package/src/utils/validation.ts +69 -0
  202. package/android/src/main/java/com/margelo/nitro/nitromap/ClusterIconGenerator.kt +0 -108
  203. package/android/src/main/java/com/margelo/nitro/nitromap/ColorUtils.kt +0 -63
  204. package/android/src/main/java/com/margelo/nitro/nitromap/HybridNitroMap.kt +0 -408
  205. package/android/src/main/java/com/margelo/nitro/nitromap/HybridNitroMapConfig.kt +0 -68
  206. package/android/src/main/java/com/margelo/nitro/nitromap/MarkerIconCache.kt +0 -176
  207. package/android/src/main/java/com/margelo/nitro/nitromap/MarkerIconFactory.kt +0 -252
  208. package/android/src/main/java/com/margelo/nitro/nitromap/clustering/NitroClusterEngine.kt +0 -252
  209. package/android/src/main/java/com/margelo/nitro/nitromap/clustering/QuadTree.kt +0 -195
  210. package/android/src/main/java/com/margelo/nitro/nitromap/providers/GoogleMapProvider.kt +0 -912
  211. package/android/src/main/java/com/margelo/nitro/nitromap/providers/MapProviderInterface.kt +0 -70
  212. package/cpp/QuadTree.hpp +0 -246
  213. package/ios/NitroMapConfig/HybridNitroMapConfig.swift +0 -33
  214. package/ios/Providers/GoogleMapProvider+Camera.swift +0 -164
  215. package/ios/Providers/GoogleMapProvider.swift +0 -924
  216. package/nitrogen/generated/android/c++/JClusterAnimationStyle.hpp +0 -68
  217. package/nitrogen/generated/ios/swift/ClusterAnimationStyle.swift +0 -52
  218. 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
- }