react-native-map4d-map-dtqg 0.1.0 → 0.1.1

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 (183) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +88 -41
  3. package/android/.gradle/8.9/checksums/checksums.lock +0 -0
  4. package/android/.gradle/8.9/checksums/md5-checksums.bin +0 -0
  5. package/android/.gradle/8.9/checksums/sha1-checksums.bin +0 -0
  6. package/android/.gradle/8.9/dependencies-accessors/gc.properties +0 -0
  7. package/android/.gradle/8.9/fileChanges/last-build.bin +0 -0
  8. package/android/.gradle/8.9/fileHashes/fileHashes.lock +0 -0
  9. package/android/.gradle/8.9/gc.properties +0 -0
  10. package/android/.gradle/9.0-milestone-1/checksums/checksums.lock +0 -0
  11. package/android/.gradle/9.0-milestone-1/checksums/md5-checksums.bin +0 -0
  12. package/android/.gradle/9.0-milestone-1/checksums/sha1-checksums.bin +0 -0
  13. package/android/.gradle/9.0-milestone-1/fileChanges/last-build.bin +0 -0
  14. package/android/.gradle/9.0-milestone-1/fileHashes/fileHashes.lock +0 -0
  15. package/android/.gradle/9.0-milestone-1/gc.properties +0 -0
  16. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  17. package/android/.gradle/buildOutputCleanup/cache.properties +2 -0
  18. package/android/.gradle/config.properties +2 -0
  19. package/android/.gradle/vcs-1/gc.properties +0 -0
  20. package/android/.idea/AndroidProjectSystem.xml +6 -0
  21. package/android/.idea/caches/deviceStreaming.xml +1570 -0
  22. package/android/.idea/copilot.data.migration.ask2agent.xml +6 -0
  23. package/android/.idea/gradle.xml +12 -0
  24. package/android/.idea/migrations.xml +10 -0
  25. package/android/.idea/misc.xml +10 -0
  26. package/android/.idea/runConfigurations.xml +17 -0
  27. package/android/.idea/vcs.xml +6 -0
  28. package/android/build.gradle +60 -60
  29. package/android/local.properties +8 -0
  30. package/android/src/main/AndroidManifest.xml +4 -4
  31. package/android/src/main/java/com/reactnativemap4dmap/ImageUtils.java +87 -87
  32. package/android/src/main/java/com/reactnativemap4dmap/Map4dMapModule.java +298 -298
  33. package/android/src/main/java/com/reactnativemap4dmap/Map4dMapPackage.java +35 -35
  34. package/android/src/main/java/com/reactnativemap4dmap/Map4dMapViewManager.java +31 -31
  35. package/android/src/main/java/com/reactnativemap4dmap/RMFBuilding.java +167 -167
  36. package/android/src/main/java/com/reactnativemap4dmap/RMFBuildingManager.java +121 -121
  37. package/android/src/main/java/com/reactnativemap4dmap/RMFCircle.java +105 -105
  38. package/android/src/main/java/com/reactnativemap4dmap/RMFCircleManager.java +121 -121
  39. package/android/src/main/java/com/reactnativemap4dmap/RMFDirectionsRenderer.java +502 -502
  40. package/android/src/main/java/com/reactnativemap4dmap/RMFDirectionsRendererManager.java +143 -143
  41. package/android/src/main/java/com/reactnativemap4dmap/RMFFeature.java +17 -17
  42. package/android/src/main/java/com/reactnativemap4dmap/RMFMapView.java +1172 -1172
  43. package/android/src/main/java/com/reactnativemap4dmap/RMFMapViewManager.java +226 -226
  44. package/android/src/main/java/com/reactnativemap4dmap/RMFMarker.java +412 -412
  45. package/android/src/main/java/com/reactnativemap4dmap/RMFMarkerManager.java +211 -211
  46. package/android/src/main/java/com/reactnativemap4dmap/RMFPOI.java +222 -222
  47. package/android/src/main/java/com/reactnativemap4dmap/RMFPOIManager.java +119 -119
  48. package/android/src/main/java/com/reactnativemap4dmap/RMFPolygon.java +172 -172
  49. package/android/src/main/java/com/reactnativemap4dmap/RMFPolygonManager.java +147 -147
  50. package/android/src/main/java/com/reactnativemap4dmap/RMFPolyline.java +146 -146
  51. package/android/src/main/java/com/reactnativemap4dmap/RMFPolylineManager.java +137 -137
  52. package/android/src/main/java/com/reactnativemap4dmap/RMFTileOverlay.java +95 -95
  53. package/android/src/main/java/com/reactnativemap4dmap/RMFTileOverlayManager.java +64 -64
  54. package/android/src/main/java/com/reactnativemap4dmap/SizeReportingShadowNode.java +31 -31
  55. package/android/src/main/java/com/reactnativemap4dmap/ViewAttacherGroup.java +31 -31
  56. package/android/src/main/java/com/reactnativemap4dmap/ViewChangesTracker.java +70 -70
  57. package/android/src/main/java/vn/map4d/map/annotations/RMFBitmapDescriptor.java +9 -9
  58. package/ios/Map4dMap.h +7 -7
  59. package/ios/Map4dMap.m +14 -14
  60. package/ios/Map4dMapViewManager.m +34 -34
  61. package/ios/RCTConvert+Map4dMap.h +33 -33
  62. package/ios/RCTConvert+Map4dMap.m +112 -112
  63. package/ios/RMFCircle.h +37 -37
  64. package/ios/RMFCircle.m +100 -100
  65. package/ios/RMFCircleManager.h +18 -18
  66. package/ios/RMFCircleManager.m +155 -155
  67. package/ios/RMFCircleMap4d.h +23 -23
  68. package/ios/RMFCircleMap4d.m +13 -13
  69. package/ios/RMFCoordinate.h +22 -22
  70. package/ios/RMFCoordinate.m +13 -13
  71. package/ios/RMFDirectionsMarkerOptions.h +24 -24
  72. package/ios/RMFDirectionsMarkerOptions.m +23 -23
  73. package/ios/RMFDirectionsRenderer.h +47 -47
  74. package/ios/RMFDirectionsRenderer.m +182 -182
  75. package/ios/RMFDirectionsRendererManager.h +17 -17
  76. package/ios/RMFDirectionsRendererManager.m +84 -84
  77. package/ios/RMFDirectionsRendererMap4d.h +21 -21
  78. package/ios/RMFDirectionsRendererMap4d.m +12 -12
  79. package/ios/RMFDummyView.h +6 -6
  80. package/ios/RMFDummyView.m +12 -12
  81. package/ios/RMFEventResponse.h +39 -39
  82. package/ios/RMFEventResponse.m +98 -98
  83. package/ios/RMFIcon.h +24 -24
  84. package/ios/RMFIcon.m +35 -35
  85. package/ios/RMFMapView.h +84 -84
  86. package/ios/RMFMapView.m +376 -376
  87. package/ios/RMFMapViewManager.h +17 -17
  88. package/ios/RMFMapViewManager.m +493 -493
  89. package/ios/RMFMarker.h +57 -57
  90. package/ios/RMFMarker.m +267 -267
  91. package/ios/RMFMarkerManager.h +17 -17
  92. package/ios/RMFMarkerManager.m +156 -156
  93. package/ios/RMFMarkerMap4d.h +19 -19
  94. package/ios/RMFMarkerMap4d.m +13 -13
  95. package/ios/RMFPOI.h +38 -38
  96. package/ios/RMFPOI.m +123 -123
  97. package/ios/RMFPOIManager.h +18 -18
  98. package/ios/RMFPOIManager.m +168 -168
  99. package/ios/RMFPOIMap4d.h +22 -22
  100. package/ios/RMFPOIMap4d.m +12 -12
  101. package/ios/RMFPolygon.h +41 -41
  102. package/ios/RMFPolygon.m +106 -106
  103. package/ios/RMFPolygonManager.h +18 -18
  104. package/ios/RMFPolygonManager.m +141 -141
  105. package/ios/RMFPolygonMap4d.h +23 -23
  106. package/ios/RMFPolygonMap4d.m +15 -15
  107. package/ios/RMFPolyline.h +38 -38
  108. package/ios/RMFPolyline.m +101 -101
  109. package/ios/RMFPolylineManager.h +18 -18
  110. package/ios/RMFPolylineManager.m +139 -139
  111. package/ios/RMFPolylineMap4d.h +22 -22
  112. package/ios/RMFPolylineMap4d.m +15 -15
  113. package/ios/building/RMFBuilding.h +41 -41
  114. package/ios/building/RMFBuilding.m +104 -104
  115. package/ios/building/RMFBuildingManager.h +19 -19
  116. package/ios/building/RMFBuildingManager.m +133 -133
  117. package/ios/building/RMFBuildingMap4d.h +23 -23
  118. package/ios/building/RMFBuildingMap4d.m +15 -15
  119. package/ios/overlays/RMFTileOverlay.h +36 -36
  120. package/ios/overlays/RMFTileOverlay.m +64 -64
  121. package/ios/overlays/RMFTileOverlayManager.h +17 -17
  122. package/ios/overlays/RMFTileOverlayManager.m +27 -27
  123. package/lib/commonjs/components/MFBuilding.js +26 -26
  124. package/lib/commonjs/components/MFBuilding.js.map +1 -1
  125. package/lib/commonjs/components/MFCircle.js +20 -20
  126. package/lib/commonjs/components/MFCircle.js.map +1 -1
  127. package/lib/commonjs/components/MFDirectionsRenderer.js +32 -32
  128. package/lib/commonjs/components/MFDirectionsRenderer.js.map +1 -1
  129. package/lib/commonjs/components/MFMapView.js +133 -71
  130. package/lib/commonjs/components/MFMapView.js.map +1 -1
  131. package/lib/commonjs/components/MFMarker.js +35 -35
  132. package/lib/commonjs/components/MFMarker.js.map +1 -1
  133. package/lib/commonjs/components/MFPOI.js +20 -20
  134. package/lib/commonjs/components/MFPOI.js.map +1 -1
  135. package/lib/commonjs/components/MFPolygon.js +22 -22
  136. package/lib/commonjs/components/MFPolygon.js.map +1 -1
  137. package/lib/commonjs/components/MFPolyline.js +18 -18
  138. package/lib/commonjs/components/MFPolyline.js.map +1 -1
  139. package/lib/commonjs/components/MFTileOverlay.js +9 -9
  140. package/lib/commonjs/components/MFTileOverlay.js.map +1 -1
  141. package/lib/commonjs/components/Map4dMapView.js.map +1 -1
  142. package/lib/commonjs/components/extends/AreaFocuser.js +311 -0
  143. package/lib/commonjs/components/extends/AreaFocuser.js.map +1 -0
  144. package/lib/commonjs/index.js +8 -0
  145. package/lib/commonjs/index.js.map +1 -1
  146. package/lib/module/components/MFBuilding.js +26 -26
  147. package/lib/module/components/MFBuilding.js.map +1 -1
  148. package/lib/module/components/MFCircle.js +20 -20
  149. package/lib/module/components/MFCircle.js.map +1 -1
  150. package/lib/module/components/MFDirectionsRenderer.js +32 -32
  151. package/lib/module/components/MFDirectionsRenderer.js.map +1 -1
  152. package/lib/module/components/MFMapView.js +131 -71
  153. package/lib/module/components/MFMapView.js.map +1 -1
  154. package/lib/module/components/MFMarker.js +35 -35
  155. package/lib/module/components/MFMarker.js.map +1 -1
  156. package/lib/module/components/MFPOI.js +20 -20
  157. package/lib/module/components/MFPOI.js.map +1 -1
  158. package/lib/module/components/MFPolygon.js +22 -22
  159. package/lib/module/components/MFPolygon.js.map +1 -1
  160. package/lib/module/components/MFPolyline.js +18 -18
  161. package/lib/module/components/MFPolyline.js.map +1 -1
  162. package/lib/module/components/MFTileOverlay.js +9 -9
  163. package/lib/module/components/MFTileOverlay.js.map +1 -1
  164. package/lib/module/components/Map4dMapView.js.map +1 -1
  165. package/lib/module/components/extends/AreaFocuser.js +302 -0
  166. package/lib/module/components/extends/AreaFocuser.js.map +1 -0
  167. package/lib/module/index.js +2 -1
  168. package/lib/module/index.js.map +1 -1
  169. package/lib/typescript/components/Map4dMapView.d.ts +7 -7
  170. package/package.json +152 -152
  171. package/react-native-map4d-map.podspec +20 -20
  172. package/src/components/MFBuilding.js +187 -187
  173. package/src/components/MFCircle.js +173 -173
  174. package/src/components/MFDirectionsRenderer.js +237 -237
  175. package/src/components/MFMapView.js +447 -373
  176. package/src/components/MFMarker.js +246 -246
  177. package/src/components/MFPOI.js +184 -184
  178. package/src/components/MFPolygon.js +186 -186
  179. package/src/components/MFPolyline.js +172 -172
  180. package/src/components/MFTileOverlay.js +45 -45
  181. package/src/components/Map4dMapView.tsx +26 -26
  182. package/src/components/extends/AreaFocuser.js +339 -0
  183. package/src/index.js +23 -21
@@ -0,0 +1,339 @@
1
+ export class AreaFocuser {
2
+
3
+ constructor(mapView) {
4
+ this.mapView = mapView
5
+ this.highlightPaths = []
6
+ this.highlightPolygonId = 'area-focuser-highlight-polygon'
7
+ }
8
+
9
+ /**
10
+ * @param {{name?: string, highlight?: boolean}=} options
11
+ */
12
+ async focusProvince(options) {
13
+ const provinceName = this.getProvinceName(options)
14
+ const shouldHighlight = this.shouldHighlight(options)
15
+
16
+ if (!provinceName) {
17
+ this.clearHighlightPaths()
18
+ this.clearHighlightPolygon()
19
+ return
20
+ }
21
+
22
+ const url =
23
+ `https://api-app-cdtqg.map4d.vn/map/country/geometry?name=${encodeURIComponent(provinceName)}`
24
+
25
+ try {
26
+ const response = await fetch(url)
27
+
28
+ if (!response.ok) {
29
+ return
30
+ }
31
+
32
+ const data = await response.json()
33
+
34
+ if (data.code !== 'ok') {
35
+ return
36
+ }
37
+
38
+ const feature =
39
+ data.result && data.result.features && data.result.features.length > 0 ? data.result.features[0] : null
40
+
41
+ if (!feature) {
42
+ return
43
+ }
44
+
45
+ const geometry = feature.geometry
46
+ if (!geometry) {
47
+ return
48
+ }
49
+
50
+ let bounds = null
51
+
52
+ const viewbox =
53
+ feature.properties && feature.properties.viewbox ? feature.properties.viewbox : null
54
+
55
+ if (viewbox != null && viewbox.trim() != '') {
56
+ bounds = this.parseViewbox(viewbox)
57
+ }
58
+
59
+ if (!bounds) {
60
+ bounds = this.getViewboxFromGeometry(geometry)
61
+ }
62
+
63
+ if (!bounds) {
64
+ return
65
+ }
66
+
67
+ this.mapView.fitBounds({
68
+ bounds: {
69
+ southWest: {
70
+ latitude: bounds[0],
71
+ longitude: bounds[1],
72
+ },
73
+ northEast: {
74
+ latitude: bounds[2],
75
+ longitude: bounds[3],
76
+ },
77
+ }
78
+ })
79
+
80
+ this.createHighlightPaths(geometry)
81
+
82
+ if (shouldHighlight) {
83
+ const polygon = this.getHighlightPolygonProps()
84
+
85
+ if (polygon) {
86
+ this.mapView._addPolygon({
87
+ ...polygon,
88
+ id: this.highlightPolygonId,
89
+ zIndex: 999,
90
+ })
91
+ }
92
+ }
93
+ else {
94
+ this.clearHighlightPolygon()
95
+ }
96
+ }
97
+ catch (error) {
98
+ console.error('Cannot focus province:', error)
99
+ }
100
+ }
101
+
102
+ getProvinceName(options) {
103
+ if (options == null || typeof options !== 'object') {
104
+ return null
105
+ }
106
+
107
+ if (typeof options.name === 'string') {
108
+ return options.name.trim()
109
+ }
110
+
111
+ const optionKeys = Object.keys(options)
112
+ const unsupportedKeys = optionKeys.filter((key) => key !== 'name' && key !== 'highlight')
113
+
114
+ if (unsupportedKeys.length > 0) {
115
+ console.warn(
116
+ `[AreaFocuser] focusProvince expects options like { name: 'Ha Noi', highlight: true }. Unsupported keys: ${unsupportedKeys.join(', ')}`
117
+ )
118
+ }
119
+
120
+ return null
121
+ }
122
+
123
+ shouldHighlight(options) {
124
+ if (options == null || typeof options !== 'object') {
125
+ return false
126
+ }
127
+
128
+ return options.highlight === true
129
+ }
130
+
131
+ parseViewbox(viewbox) {
132
+ const bounds = viewbox.split(',').map(Number)
133
+
134
+ if (bounds.length != 4) {
135
+ return null
136
+ }
137
+
138
+ const [minLat, minLng, maxLat, maxLng] = bounds
139
+
140
+ if (
141
+ Number.isNaN(minLat) ||
142
+ Number.isNaN(minLng) ||
143
+ Number.isNaN(maxLat) ||
144
+ Number.isNaN(maxLng)
145
+ ) {
146
+ return null
147
+ }
148
+
149
+ return [
150
+ minLat,
151
+ minLng,
152
+ maxLat,
153
+ maxLng,
154
+ ]
155
+ }
156
+
157
+ getViewboxFromGeometry(geometry) {
158
+ const bounds = {
159
+ minLat: Infinity,
160
+ minLng: Infinity,
161
+ maxLat: -Infinity,
162
+ maxLng: -Infinity,
163
+ }
164
+
165
+ const updateBounds = function (coordinate) {
166
+ if (coordinate.length < 2) {
167
+ return
168
+ }
169
+
170
+ const lng = coordinate[0]
171
+ const lat = coordinate[1]
172
+
173
+ if (Number.isNaN(lat) || Number.isNaN(lng)) {
174
+ return
175
+ }
176
+
177
+ bounds.minLat = Math.min(bounds.minLat, lat)
178
+ bounds.minLng = Math.min(bounds.minLng, lng)
179
+ bounds.maxLat = Math.max(bounds.maxLat, lat)
180
+ bounds.maxLng = Math.max(bounds.maxLng, lng)
181
+ }
182
+
183
+ if (geometry.type === 'Polygon') {
184
+ const polygons = geometry.coordinates
185
+
186
+ polygons.forEach(function (ring) {
187
+ ring.forEach(function (coordinate) {
188
+ updateBounds(coordinate)
189
+ })
190
+ })
191
+ }
192
+
193
+ if (geometry.type === 'MultiPolygon') {
194
+ const multiPolygons = geometry.coordinates
195
+
196
+ multiPolygons.forEach(function (polygon) {
197
+ polygon.forEach(function (ring) {
198
+ ring.forEach(function (coordinate) {
199
+ updateBounds(coordinate)
200
+ })
201
+ })
202
+ })
203
+ }
204
+
205
+ if (
206
+ bounds.minLat === Infinity ||
207
+ bounds.minLng === Infinity ||
208
+ bounds.maxLat === -Infinity ||
209
+ bounds.maxLng === -Infinity
210
+ ) {
211
+ return null
212
+ }
213
+
214
+ return [
215
+ bounds.minLat,
216
+ bounds.minLng,
217
+ bounds.maxLat,
218
+ bounds.maxLng,
219
+ ]
220
+ }
221
+
222
+ createHighlightPaths(geometry) {
223
+ this.clearHighlightPaths()
224
+
225
+ const paths = this.createWorldMaskPaths(geometry)
226
+
227
+ if (paths.length <= 1) {
228
+ return
229
+ }
230
+
231
+ this.highlightPaths = paths
232
+ }
233
+
234
+ clearHighlightPaths() {
235
+ this.highlightPaths = []
236
+ }
237
+
238
+ clearHighlightPolygon() {
239
+ if (!this.mapView) {
240
+ return
241
+ }
242
+
243
+ this.mapView._removePolygon(this.highlightPolygonId)
244
+ }
245
+
246
+ getHighlightPolygonProps() {
247
+ if (!this.highlightPaths || this.highlightPaths.length <= 1) {
248
+ return null
249
+ }
250
+
251
+ const [coordinates, ...holes] = this.highlightPaths
252
+
253
+ return {
254
+ coordinates,
255
+ holes,
256
+ fillColor: "#0000001E",
257
+ strokeColor: "#FF0000FF",
258
+ strokeWidth: 2.0,
259
+ }
260
+ }
261
+
262
+ createWorldMaskPaths(geometry) {
263
+ const worldPath = [
264
+ { longitude: -180, latitude: -90 },
265
+ { longitude: 180, latitude: -90 },
266
+ { longitude: 180, latitude: 90 },
267
+ { longitude: -180, latitude: 90 },
268
+ { longitude: -180, latitude: -90 },
269
+ ]
270
+
271
+ const paths = [
272
+ worldPath,
273
+ ]
274
+
275
+ const holes = this.getHolePathsFromGeometry(geometry)
276
+
277
+ holes.forEach((hole) => {
278
+ paths.push(hole)
279
+ })
280
+
281
+ return paths
282
+ }
283
+
284
+ getHolePathsFromGeometry(geometry) {
285
+ const paths = []
286
+
287
+ if (geometry.type == 'Polygon') {
288
+ const polygon = geometry.coordinates
289
+
290
+ if (polygon.length > 0) {
291
+ paths.push(this.convertAndClosePath(polygon[0]))
292
+ }
293
+ }
294
+
295
+ if (geometry.type == 'MultiPolygon') {
296
+ const multiPolygon = geometry.coordinates
297
+
298
+ multiPolygon.forEach((polygon) => {
299
+ if (polygon.length > 0) {
300
+ paths.push(this.convertAndClosePath(polygon[0]))
301
+ }
302
+ })
303
+ }
304
+
305
+ return paths
306
+ }
307
+
308
+ convertAndClosePath(path) {
309
+ if (path.length == 0) {
310
+ return []
311
+ }
312
+
313
+ const coordinatePath = path
314
+ .filter((point) => point.length >= 2)
315
+ .map((point) => ({
316
+ latitude: point[1],
317
+ longitude: point[0],
318
+ }))
319
+
320
+ if (coordinatePath.length == 0) {
321
+ return []
322
+ }
323
+
324
+ const firstPoint = coordinatePath[0]
325
+ const lastPoint = coordinatePath[coordinatePath.length - 1]
326
+
327
+ if (
328
+ firstPoint.latitude == lastPoint.latitude &&
329
+ firstPoint.longitude == lastPoint.longitude
330
+ ) {
331
+ return coordinatePath
332
+ }
333
+
334
+ return [
335
+ ...coordinatePath,
336
+ firstPoint,
337
+ ]
338
+ }
339
+ }
package/src/index.js CHANGED
@@ -1,21 +1,23 @@
1
- import {MFMapView} from './components/MFMapView'
2
- import {MFMarker} from './components/MFMarker'
3
- import {MFCircle} from './components/MFCircle'
4
- import {MFPolyline} from './components/MFPolyline'
5
- import {MFPolygon} from './components/MFPolygon'
6
- import {MFPOI} from './components/MFPOI'
7
- import {MFDirectionsRenderer} from './components/MFDirectionsRenderer'
8
- import {MFTileOverlay} from './components/MFTileOverlay'
9
- import {MFBuilding} from './components/MFBuilding'
10
-
11
- export {
12
- MFMapView,
13
- MFMarker,
14
- MFCircle,
15
- MFPolyline,
16
- MFPolygon,
17
- MFPOI,
18
- MFDirectionsRenderer,
19
- MFTileOverlay,
20
- MFBuilding,
21
- };
1
+ import {MFMapView} from './components/MFMapView'
2
+ import {MFMarker} from './components/MFMarker'
3
+ import {MFCircle} from './components/MFCircle'
4
+ import {MFPolyline} from './components/MFPolyline'
5
+ import {MFPolygon} from './components/MFPolygon'
6
+ import {MFPOI} from './components/MFPOI'
7
+ import {MFDirectionsRenderer} from './components/MFDirectionsRenderer'
8
+ import {MFTileOverlay} from './components/MFTileOverlay'
9
+ import {MFBuilding} from './components/MFBuilding'
10
+ import {AreaFocuser} from './components/extends/AreaFocuser'
11
+
12
+ export {
13
+ MFMapView,
14
+ MFMarker,
15
+ MFCircle,
16
+ MFPolyline,
17
+ MFPolygon,
18
+ MFPOI,
19
+ MFDirectionsRenderer,
20
+ MFTileOverlay,
21
+ MFBuilding,
22
+ AreaFocuser,
23
+ };