@evnydd0sf/react-native-amap3d-fix 3.2.4-fix.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.
- package/lib/android/build.gradle +34 -0
- package/lib/android/src/main/AndroidManifest.xml +10 -0
- package/lib/android/src/main/java/qiuxiang/amap3d/AMap3DPackage.kt +28 -0
- package/lib/android/src/main/java/qiuxiang/amap3d/Utils.kt +114 -0
- package/lib/android/src/main/java/qiuxiang/amap3d/map_view/Circle.kt +65 -0
- package/lib/android/src/main/java/qiuxiang/amap3d/map_view/CircleManager.kt +49 -0
- package/lib/android/src/main/java/qiuxiang/amap3d/map_view/HeatMap.kt +32 -0
- package/lib/android/src/main/java/qiuxiang/amap3d/map_view/HeatMapManager.kt +33 -0
- package/lib/android/src/main/java/qiuxiang/amap3d/map_view/MapView.kt +174 -0
- package/lib/android/src/main/java/qiuxiang/amap3d/map_view/MapViewManager.kt +153 -0
- package/lib/android/src/main/java/qiuxiang/amap3d/map_view/Marker.kt +102 -0
- package/lib/android/src/main/java/qiuxiang/amap3d/map_view/MarkerManager.kt +78 -0
- package/lib/android/src/main/java/qiuxiang/amap3d/map_view/MultiPoint.kt +53 -0
- package/lib/android/src/main/java/qiuxiang/amap3d/map_view/MultiPointManager.kt +33 -0
- package/lib/android/src/main/java/qiuxiang/amap3d/map_view/Overlay.kt +8 -0
- package/lib/android/src/main/java/qiuxiang/amap3d/map_view/Polygon.kt +58 -0
- package/lib/android/src/main/java/qiuxiang/amap3d/map_view/PolygonManager.kt +44 -0
- package/lib/android/src/main/java/qiuxiang/amap3d/map_view/Polyline.kt +69 -0
- package/lib/android/src/main/java/qiuxiang/amap3d/map_view/PolylineManager.kt +64 -0
- package/lib/android/src/main/java/qiuxiang/amap3d/modules/SdkModule.kt +31 -0
- package/lib/ios/.swiftformat +2 -0
- package/lib/ios/Bridging-Header.h +4 -0
- package/lib/ios/MapView/CircleManager.m +11 -0
- package/lib/ios/MapView/CircleManager.swift +30 -0
- package/lib/ios/MapView/HeatMapManager.m +9 -0
- package/lib/ios/MapView/HeatMapManager.swift +29 -0
- package/lib/ios/MapView/MapViewManager.m +35 -0
- package/lib/ios/MapView/MapViewManager.swift +159 -0
- package/lib/ios/MapView/MarkerManager.m +18 -0
- package/lib/ios/MapView/MarkerManager.swift +100 -0
- package/lib/ios/MapView/MultiPointManager.m +9 -0
- package/lib/ios/MapView/MultiPointManager.swift +47 -0
- package/lib/ios/MapView/Overlay.swift +4 -0
- package/lib/ios/MapView/PolygonManager.m +10 -0
- package/lib/ios/MapView/PolygonManager.swift +30 -0
- package/lib/ios/MapView/PolylineManager.m +12 -0
- package/lib/ios/MapView/PolylineManager.swift +41 -0
- package/lib/ios/Modules/SdkModule.m +8 -0
- package/lib/ios/Modules/SdkModule.swift +16 -0
- package/lib/ios/Utils.swift +104 -0
- package/lib/ios/react-native-amap3d.podspec +20 -0
- package/lib/src/circle.tsx +36 -0
- package/lib/src/cluster/cluster-view.tsx +47 -0
- package/lib/src/cluster/index.tsx +159 -0
- package/lib/src/component.ts +31 -0
- package/lib/src/heat-map.tsx +21 -0
- package/lib/src/index.ts +11 -0
- package/lib/src/map-view.tsx +230 -0
- package/lib/src/marker.tsx +128 -0
- package/lib/src/multi-point.tsx +28 -0
- package/lib/src/polygon.tsx +31 -0
- package/lib/src/polyline.tsx +65 -0
- package/lib/src/sdk.ts +11 -0
- package/lib/src/types.ts +137 -0
- package/license +21 -0
- package/package.json +56 -0
- package/react-native-amap3d.podspec +20 -0
- package/react-native.config.js +20 -0
- package/readme.md +186 -0
@@ -0,0 +1,159 @@
|
|
1
|
+
@objc(AMapViewManager)
|
2
|
+
class AMapViewManager: RCTViewManager {
|
3
|
+
override class func requiresMainQueueSetup() -> Bool { false }
|
4
|
+
|
5
|
+
override func view() -> UIView {
|
6
|
+
let view = MapView()
|
7
|
+
view.delegate = view
|
8
|
+
return view
|
9
|
+
}
|
10
|
+
|
11
|
+
@objc func moveCamera(_ reactTag: NSNumber, position: NSDictionary, duration: Int) {
|
12
|
+
getView(reactTag: reactTag) { view in
|
13
|
+
view.moveCamera(position: position, duration: duration)
|
14
|
+
}
|
15
|
+
}
|
16
|
+
|
17
|
+
@objc func call(_ reactTag: NSNumber, callerId: Double, name: String, args: NSDictionary) {
|
18
|
+
getView(reactTag: reactTag) { view in
|
19
|
+
view.call(id: callerId, name: name, args: args)
|
20
|
+
}
|
21
|
+
}
|
22
|
+
|
23
|
+
func getView(reactTag: NSNumber, callback: @escaping (MapView) -> Void) {
|
24
|
+
bridge.uiManager.addUIBlock { _, viewRegistry in
|
25
|
+
callback(viewRegistry![reactTag] as! MapView)
|
26
|
+
}
|
27
|
+
}
|
28
|
+
}
|
29
|
+
|
30
|
+
class MapView: MAMapView, MAMapViewDelegate {
|
31
|
+
var initialized = false
|
32
|
+
var overlayMap: [MABaseOverlay: Overlay] = [:]
|
33
|
+
var markerMap: [MAPointAnnotation: Marker] = [:]
|
34
|
+
|
35
|
+
@objc var onLoad: RCTBubblingEventBlock = { _ in }
|
36
|
+
@objc var onCameraMove: RCTBubblingEventBlock = { _ in }
|
37
|
+
@objc var onCameraIdle: RCTBubblingEventBlock = { _ in }
|
38
|
+
@objc var onPress: RCTBubblingEventBlock = { _ in }
|
39
|
+
@objc var onPressPoi: RCTBubblingEventBlock = { _ in }
|
40
|
+
@objc var onLongPress: RCTBubblingEventBlock = { _ in }
|
41
|
+
@objc var onLocation: RCTBubblingEventBlock = { _ in }
|
42
|
+
@objc var onCallback: RCTBubblingEventBlock = { _ in }
|
43
|
+
|
44
|
+
@objc func setInitialCameraPosition(_ json: NSDictionary) {
|
45
|
+
if !initialized {
|
46
|
+
initialized = true
|
47
|
+
moveCamera(position: json)
|
48
|
+
}
|
49
|
+
}
|
50
|
+
|
51
|
+
func moveCamera(position: NSDictionary, duration: Int = 0) {
|
52
|
+
let status = MAMapStatus()
|
53
|
+
status.zoomLevel = (position["zoom"] as? Double)?.cgFloat ?? zoomLevel
|
54
|
+
status.cameraDegree = (position["tilt"] as? Double)?.cgFloat ?? cameraDegree
|
55
|
+
status.rotationDegree = (position["bearing"] as? Double)?.cgFloat ?? rotationDegree
|
56
|
+
status.centerCoordinate = (position["target"] as? NSDictionary)?.coordinate ?? centerCoordinate
|
57
|
+
setMapStatus(status, animated: true, duration: Double(duration) / 1000)
|
58
|
+
}
|
59
|
+
|
60
|
+
func call(id: Double, name: String, args: NSDictionary) {
|
61
|
+
switch name {
|
62
|
+
case "getLatLng":
|
63
|
+
callback(id: id, data: convert(args.point, toCoordinateFrom: self).json)
|
64
|
+
default:
|
65
|
+
break
|
66
|
+
}
|
67
|
+
}
|
68
|
+
|
69
|
+
func callback(id: Double, data: [String: Any]) {
|
70
|
+
onCallback(["id": id, "data": data])
|
71
|
+
}
|
72
|
+
|
73
|
+
override func didAddSubview(_ subview: UIView) {
|
74
|
+
if let overlay = (subview as? Overlay)?.getOverlay() {
|
75
|
+
overlayMap[overlay] = subview as? Overlay
|
76
|
+
add(overlay)
|
77
|
+
}
|
78
|
+
if let annotation = (subview as? Marker)?.annotation {
|
79
|
+
markerMap[annotation] = subview as? Marker
|
80
|
+
addAnnotation(annotation)
|
81
|
+
}
|
82
|
+
}
|
83
|
+
|
84
|
+
override func removeReactSubview(_ subview: UIView!) {
|
85
|
+
super.removeReactSubview(subview)
|
86
|
+
if let overlay = (subview as? Overlay)?.getOverlay() {
|
87
|
+
overlayMap.removeValue(forKey: overlay)
|
88
|
+
remove(overlay)
|
89
|
+
}
|
90
|
+
if let annotation = (subview as? Marker)?.annotation {
|
91
|
+
markerMap.removeValue(forKey: annotation)
|
92
|
+
removeAnnotation(annotation)
|
93
|
+
}
|
94
|
+
}
|
95
|
+
|
96
|
+
func mapView(_: MAMapView, rendererFor overlay: MAOverlay) -> MAOverlayRenderer? {
|
97
|
+
if let key = overlay as? MABaseOverlay {
|
98
|
+
return overlayMap[key]?.getRenderer()
|
99
|
+
}
|
100
|
+
return nil
|
101
|
+
}
|
102
|
+
|
103
|
+
func mapView(_: MAMapView!, viewFor annotation: MAAnnotation) -> MAAnnotationView? {
|
104
|
+
if let key = annotation as? MAPointAnnotation {
|
105
|
+
return markerMap[key]?.getView()
|
106
|
+
}
|
107
|
+
return nil
|
108
|
+
}
|
109
|
+
|
110
|
+
func mapView(_: MAMapView!, annotationView view: MAAnnotationView!, didChange newState: MAAnnotationViewDragState, fromOldState _: MAAnnotationViewDragState) {
|
111
|
+
if let key = view.annotation as? MAPointAnnotation {
|
112
|
+
let market = markerMap[key]!
|
113
|
+
if newState == MAAnnotationViewDragState.starting {
|
114
|
+
market.onDragStart(nil)
|
115
|
+
}
|
116
|
+
if newState == MAAnnotationViewDragState.dragging {
|
117
|
+
market.onDrag(nil)
|
118
|
+
}
|
119
|
+
if newState == MAAnnotationViewDragState.ending {
|
120
|
+
market.onDragEnd(view.annotation.coordinate.json)
|
121
|
+
}
|
122
|
+
}
|
123
|
+
}
|
124
|
+
|
125
|
+
func mapView(_: MAMapView!, didAnnotationViewTapped view: MAAnnotationView!) {
|
126
|
+
if let key = view.annotation as? MAPointAnnotation {
|
127
|
+
markerMap[key]?.onPress(nil)
|
128
|
+
}
|
129
|
+
}
|
130
|
+
|
131
|
+
func mapInitComplete(_: MAMapView!) {
|
132
|
+
onLoad(nil)
|
133
|
+
}
|
134
|
+
|
135
|
+
func mapView(_: MAMapView!, didSingleTappedAt coordinate: CLLocationCoordinate2D) {
|
136
|
+
onPress(coordinate.json)
|
137
|
+
}
|
138
|
+
|
139
|
+
func mapView(_: MAMapView!, didTouchPois pois: [Any]!) {
|
140
|
+
let poi = pois[0] as! MATouchPoi
|
141
|
+
onPressPoi(["name": poi.name!, "id": poi.uid!, "position": poi.coordinate.json])
|
142
|
+
}
|
143
|
+
|
144
|
+
func mapView(_: MAMapView!, didLongPressedAt coordinate: CLLocationCoordinate2D) {
|
145
|
+
onLongPress(coordinate.json)
|
146
|
+
}
|
147
|
+
|
148
|
+
func mapViewRegionChanged(_: MAMapView!) {
|
149
|
+
onCameraMove(cameraEvent)
|
150
|
+
}
|
151
|
+
|
152
|
+
func mapView(_: MAMapView!, regionDidChangeAnimated _: Bool) {
|
153
|
+
onCameraIdle(cameraEvent)
|
154
|
+
}
|
155
|
+
|
156
|
+
func mapView(_: MAMapView!, didUpdate userLocation: MAUserLocation!, updatingLocation _: Bool) {
|
157
|
+
onLocation(userLocation.json)
|
158
|
+
}
|
159
|
+
}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
#import <React/RCTUIManager.h>
|
2
|
+
|
3
|
+
@interface RCT_EXTERN_MODULE(AMapMarkerManager, RCTViewManager)
|
4
|
+
|
5
|
+
RCT_EXPORT_VIEW_PROPERTY(latLng, CLLocationCoordinate2D)
|
6
|
+
RCT_EXPORT_VIEW_PROPERTY(centerOffset, CGPoint)
|
7
|
+
RCT_EXPORT_VIEW_PROPERTY(draggable, BOOL)
|
8
|
+
RCT_EXPORT_VIEW_PROPERTY(zIndex, int)
|
9
|
+
RCT_EXPORT_VIEW_PROPERTY(icon, NSDictionary)
|
10
|
+
|
11
|
+
RCT_EXPORT_VIEW_PROPERTY(onPress, RCTBubblingEventBlock)
|
12
|
+
RCT_EXPORT_VIEW_PROPERTY(onDragStart, RCTBubblingEventBlock)
|
13
|
+
RCT_EXPORT_VIEW_PROPERTY(onDrag, RCTBubblingEventBlock)
|
14
|
+
RCT_EXPORT_VIEW_PROPERTY(onDragEnd, RCTBubblingEventBlock)
|
15
|
+
|
16
|
+
RCT_EXTERN_METHOD(update:(nonnull NSNumber *)reactTag)
|
17
|
+
|
18
|
+
@end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
@objc(AMapMarkerManager)
|
2
|
+
class AMapMarkerManager: RCTViewManager {
|
3
|
+
override class func requiresMainQueueSetup() -> Bool { false }
|
4
|
+
|
5
|
+
override func view() -> UIView {
|
6
|
+
let view = Marker()
|
7
|
+
view.imageLoader = bridge.module(forName: "ImageLoader") as? RCTImageLoader
|
8
|
+
return view
|
9
|
+
}
|
10
|
+
|
11
|
+
@objc func update(_ reactTag: NSNumber) {
|
12
|
+
getView(reactTag: reactTag) { view in view.update() }
|
13
|
+
}
|
14
|
+
|
15
|
+
func getView(reactTag: NSNumber, callback: @escaping (Marker) -> Void) {
|
16
|
+
bridge.uiManager.addUIBlock { _, viewRegistry in
|
17
|
+
callback(viewRegistry![reactTag] as! Marker)
|
18
|
+
}
|
19
|
+
}
|
20
|
+
}
|
21
|
+
|
22
|
+
class Marker: UIView {
|
23
|
+
var imageLoader: RCTImageLoader?
|
24
|
+
var view: MAAnnotationView?
|
25
|
+
var annotation = MAPointAnnotation()
|
26
|
+
var icon: UIImage?
|
27
|
+
var iconView: UIView?
|
28
|
+
var centerOffset: CGPoint?
|
29
|
+
|
30
|
+
@objc var draggable = false { didSet { view?.isDraggable = draggable } }
|
31
|
+
@objc var zIndex = 1 { didSet { view?.zIndex = zIndex } }
|
32
|
+
|
33
|
+
@objc var onPress: RCTDirectEventBlock = { _ in }
|
34
|
+
@objc var onDragStart: RCTDirectEventBlock = { _ in }
|
35
|
+
@objc var onDrag: RCTDirectEventBlock = { _ in }
|
36
|
+
@objc var onDragEnd: RCTDirectEventBlock = { _ in }
|
37
|
+
|
38
|
+
@objc func setIcon(_ icon: NSDictionary?) {
|
39
|
+
imageLoader?.loadImage(icon) { image in
|
40
|
+
self.icon = image
|
41
|
+
self.view?.image = image
|
42
|
+
self.updateCenterOffset()
|
43
|
+
}
|
44
|
+
}
|
45
|
+
|
46
|
+
@objc func setLatLng(_ coordinate: CLLocationCoordinate2D) {
|
47
|
+
annotation.coordinate = coordinate
|
48
|
+
}
|
49
|
+
|
50
|
+
@objc func setCenterOffset(_ centerOffset: CGPoint) {
|
51
|
+
self.centerOffset = centerOffset
|
52
|
+
view?.centerOffset = centerOffset
|
53
|
+
}
|
54
|
+
|
55
|
+
override func didAddSubview(_ subview: UIView) {
|
56
|
+
subview.layer.opacity = 0
|
57
|
+
iconView = subview
|
58
|
+
}
|
59
|
+
|
60
|
+
/**
|
61
|
+
* subview 不能直接用作 marker 的 icon,因为在实现点聚合的时候发现,subview 一定概率无法正常 layout,会堆在右上角。
|
62
|
+
* 于是索性把 subview 渲染成 image,原来用 subview 带来的 offset、点击问题也都不用处理了。
|
63
|
+
* 正常情况下就把 subview 的 opacity 设成 0,需要渲染的时候才设成 1,渲染然后马上设回 0。
|
64
|
+
*/
|
65
|
+
func update() {
|
66
|
+
if centerOffset == nil, view != nil {
|
67
|
+
iconView?.layer.opacity = 1
|
68
|
+
let renderer = UIGraphicsImageRenderer(bounds: iconView!.bounds)
|
69
|
+
view?.image = renderer.image { context in layer.render(in: context.cgContext) }
|
70
|
+
iconView?.layer.opacity = 0
|
71
|
+
updateCenterOffset()
|
72
|
+
}
|
73
|
+
}
|
74
|
+
|
75
|
+
func updateCenterOffset() {
|
76
|
+
if centerOffset == nil, view != nil {
|
77
|
+
let size: CGSize = (view?.image.size)!
|
78
|
+
view?.centerOffset = CGPoint(x: 0, y: -size.height / 2)
|
79
|
+
}
|
80
|
+
}
|
81
|
+
|
82
|
+
func getView() -> MAAnnotationView {
|
83
|
+
if view == nil {
|
84
|
+
view = MAAnnotationView(annotation: annotation, reuseIdentifier: nil)
|
85
|
+
if icon == nil, iconView == nil {
|
86
|
+
view?.image = MAPinAnnotationView(annotation: annotation, reuseIdentifier: nil).image
|
87
|
+
}
|
88
|
+
view?.isDraggable = draggable
|
89
|
+
view?.zIndex = zIndex
|
90
|
+
if centerOffset != nil {
|
91
|
+
view?.centerOffset = centerOffset!
|
92
|
+
}
|
93
|
+
if icon != nil {
|
94
|
+
view?.image = icon
|
95
|
+
updateCenterOffset()
|
96
|
+
}
|
97
|
+
}
|
98
|
+
return view!
|
99
|
+
}
|
100
|
+
}
|
@@ -0,0 +1,47 @@
|
|
1
|
+
@objc(AMapMultiPointManager)
|
2
|
+
class AMapMultiPointManager: RCTViewManager {
|
3
|
+
override class func requiresMainQueueSetup() -> Bool { false }
|
4
|
+
|
5
|
+
override func view() -> UIView {
|
6
|
+
let view = MultiPoint()
|
7
|
+
view.imageLoader = bridge.module(forName: "ImageLoader") as? RCTImageLoader
|
8
|
+
return view
|
9
|
+
}
|
10
|
+
}
|
11
|
+
|
12
|
+
class MultiPoint: UIView, Overlay, MAMultiPointOverlayRendererDelegate {
|
13
|
+
var imageLoader: RCTImageLoader?
|
14
|
+
var overlay: MAMultiPointOverlay?
|
15
|
+
var renderer: MAMultiPointOverlayRenderer?
|
16
|
+
var icon: UIImage?
|
17
|
+
|
18
|
+
@objc var onPress: RCTDirectEventBlock = { _ in }
|
19
|
+
|
20
|
+
@objc func setIcon(_ icon: NSDictionary) {
|
21
|
+
imageLoader?.loadImage(icon) { image in
|
22
|
+
self.renderer?.icon = image
|
23
|
+
}
|
24
|
+
}
|
25
|
+
|
26
|
+
@objc func setItems(_ items: NSArray) {
|
27
|
+
overlay = MAMultiPointOverlay(multiPointItems: items.map { it -> MAMultiPointItem in
|
28
|
+
let item = MAMultiPointItem()
|
29
|
+
item.coordinate = (it as! NSDictionary).coordinate
|
30
|
+
return item
|
31
|
+
})
|
32
|
+
}
|
33
|
+
|
34
|
+
func getOverlay() -> MABaseOverlay { overlay! }
|
35
|
+
func getRenderer() -> MAOverlayRenderer {
|
36
|
+
if renderer == nil {
|
37
|
+
renderer = MAMultiPointOverlayRenderer(multiPointOverlay: overlay)
|
38
|
+
renderer?.icon = icon
|
39
|
+
renderer?.delegate = self
|
40
|
+
}
|
41
|
+
return renderer!
|
42
|
+
}
|
43
|
+
|
44
|
+
func multiPointOverlayRenderer(_: MAMultiPointOverlayRenderer!, didItemTapped item: MAMultiPointItem!) {
|
45
|
+
onPress(["index": (overlay?.items.firstIndex(of: item))!])
|
46
|
+
}
|
47
|
+
}
|
@@ -0,0 +1,10 @@
|
|
1
|
+
#import <React/RCTUIManager.h>
|
2
|
+
|
3
|
+
@interface RCT_EXTERN_MODULE(AMapPolygonManager, RCTViewManager)
|
4
|
+
|
5
|
+
RCT_EXPORT_VIEW_PROPERTY(points, NSArray)
|
6
|
+
RCT_EXPORT_VIEW_PROPERTY(strokeWidth, double)
|
7
|
+
RCT_EXPORT_VIEW_PROPERTY(strokeColor, UIColor)
|
8
|
+
RCT_EXPORT_VIEW_PROPERTY(fillColor, UIColor)
|
9
|
+
|
10
|
+
@end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
@objc(AMapPolygonManager)
|
2
|
+
class AMapPolygonManager: RCTViewManager {
|
3
|
+
override class func requiresMainQueueSetup() -> Bool { false }
|
4
|
+
override func view() -> UIView { Polygon() }
|
5
|
+
}
|
6
|
+
|
7
|
+
class Polygon: UIView, Overlay {
|
8
|
+
var overlay = MAPolygon()
|
9
|
+
var renderer: MAPolygonRenderer?
|
10
|
+
|
11
|
+
@objc var strokeWidth = 1.0 { didSet { renderer?.lineWidth = strokeWidth } }
|
12
|
+
@objc var strokeColor = UIColor.black { didSet { renderer?.strokeColor = strokeColor } }
|
13
|
+
@objc var fillColor = UIColor.white { didSet { renderer?.fillColor = fillColor } }
|
14
|
+
|
15
|
+
@objc func setPoints(_ points: NSArray) {
|
16
|
+
var coordinates = points.map { it -> CLLocationCoordinate2D in (it as! NSDictionary).coordinate }
|
17
|
+
overlay.setPolygonWithCoordinates(&coordinates, count: points.count)
|
18
|
+
}
|
19
|
+
|
20
|
+
func getOverlay() -> MABaseOverlay { overlay }
|
21
|
+
func getRenderer() -> MAOverlayRenderer {
|
22
|
+
if renderer == nil {
|
23
|
+
renderer = MAPolygonRenderer(polygon: overlay)
|
24
|
+
renderer?.fillColor = fillColor
|
25
|
+
renderer?.strokeColor = strokeColor
|
26
|
+
renderer?.lineWidth = strokeWidth
|
27
|
+
}
|
28
|
+
return renderer!
|
29
|
+
}
|
30
|
+
}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
#import <React/RCTUIManager.h>
|
2
|
+
|
3
|
+
@interface RCT_EXTERN_MODULE(AMapPolylineManager, RCTViewManager)
|
4
|
+
|
5
|
+
RCT_EXPORT_VIEW_PROPERTY(points, NSArray)
|
6
|
+
RCT_EXPORT_VIEW_PROPERTY(width, double)
|
7
|
+
RCT_EXPORT_VIEW_PROPERTY(color, UIColor)
|
8
|
+
RCT_EXPORT_VIEW_PROPERTY(dotted, BOOL)
|
9
|
+
RCT_EXPORT_VIEW_PROPERTY(gradient, BOOL)
|
10
|
+
RCT_EXPORT_VIEW_PROPERTY(colors, UIColorArray)
|
11
|
+
|
12
|
+
@end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
@objc(AMapPolylineManager)
|
2
|
+
class AMapPolylineManager: RCTViewManager {
|
3
|
+
override class func requiresMainQueueSetup() -> Bool { false }
|
4
|
+
override func view() -> UIView { Polyline() }
|
5
|
+
}
|
6
|
+
|
7
|
+
class Polyline: UIView, Overlay {
|
8
|
+
var overlay = MAMultiPolyline()
|
9
|
+
var renderer: MAMultiColoredPolylineRenderer?
|
10
|
+
|
11
|
+
@objc var width = 1.0 { didSet { renderer?.lineWidth = width } }
|
12
|
+
@objc var color = UIColor.black { didSet { renderer?.strokeColor = color } }
|
13
|
+
@objc var gradient = false { didSet { renderer?.isGradient = gradient } }
|
14
|
+
@objc var dotted = false { didSet { setDotted() } }
|
15
|
+
@objc var colors: [UIColor] = [] { didSet {
|
16
|
+
renderer?.strokeColors = colors
|
17
|
+
overlay.drawStyleIndexes = (0 ..< colors.count).map { it in NSNumber(value: it) }
|
18
|
+
} }
|
19
|
+
|
20
|
+
@objc func setPoints(_ points: NSArray) {
|
21
|
+
var coordinates = points.map { it -> CLLocationCoordinate2D in (it as! NSDictionary).coordinate }
|
22
|
+
overlay.setPolylineWithCoordinates(&coordinates, count: points.count)
|
23
|
+
}
|
24
|
+
|
25
|
+
func setDotted() {
|
26
|
+
renderer?.lineDashType = dotted ? kMALineDashTypeDot : kMALineDashTypeNone
|
27
|
+
}
|
28
|
+
|
29
|
+
func getOverlay() -> MABaseOverlay { overlay }
|
30
|
+
func getRenderer() -> MAOverlayRenderer {
|
31
|
+
if renderer == nil {
|
32
|
+
renderer = MAMultiColoredPolylineRenderer(multiPolyline: overlay)
|
33
|
+
renderer?.strokeColor = color
|
34
|
+
renderer?.lineWidth = width
|
35
|
+
renderer?.isGradient = gradient
|
36
|
+
renderer?.strokeColors = colors
|
37
|
+
setDotted()
|
38
|
+
}
|
39
|
+
return renderer!
|
40
|
+
}
|
41
|
+
}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
@objc(AMapSdk)
|
2
|
+
class AMapSdk: NSObject {
|
3
|
+
@objc static func requiresMainQueueSetup() -> Bool {
|
4
|
+
false
|
5
|
+
}
|
6
|
+
|
7
|
+
@objc func initSDK(_ apiKey: String) {
|
8
|
+
AMapServices.shared().apiKey = apiKey
|
9
|
+
MAMapView.updatePrivacyAgree(AMapPrivacyAgreeStatus.didAgree)
|
10
|
+
MAMapView.updatePrivacyShow(AMapPrivacyShowStatus.didShow, privacyInfo: AMapPrivacyInfoStatus.didContain)
|
11
|
+
}
|
12
|
+
|
13
|
+
@objc func getVersion(_ resolve: RCTPromiseResolveBlock, reject _: RCTPromiseRejectBlock) {
|
14
|
+
resolve("8.0.1")
|
15
|
+
}
|
16
|
+
}
|
@@ -0,0 +1,104 @@
|
|
1
|
+
extension NSDictionary {
|
2
|
+
var coordinate: CLLocationCoordinate2D {
|
3
|
+
CLLocationCoordinate2DMake(self["latitude"] as! Double, self["longitude"] as! Double)
|
4
|
+
}
|
5
|
+
|
6
|
+
var point: CGPoint {
|
7
|
+
CGPoint(x: self["x"] as! Double, y: self["y"] as! Double)
|
8
|
+
}
|
9
|
+
}
|
10
|
+
|
11
|
+
extension CLLocationCoordinate2D {
|
12
|
+
var json: [String: Double] {
|
13
|
+
["latitude": latitude, "longitude": longitude]
|
14
|
+
}
|
15
|
+
}
|
16
|
+
|
17
|
+
extension MAUserLocation {
|
18
|
+
var json: [String: Any] {
|
19
|
+
[
|
20
|
+
"coords": [
|
21
|
+
"latitude": coordinate.latitude,
|
22
|
+
"longitude": coordinate.longitude,
|
23
|
+
"altitude": location?.altitude ?? 0,
|
24
|
+
"heading": heading?.trueHeading,
|
25
|
+
"accuracy": location?.horizontalAccuracy ?? 0,
|
26
|
+
"speed": location?.speed ?? 0,
|
27
|
+
],
|
28
|
+
"timestamp": NSDate().timeIntervalSince1970 * 1000,
|
29
|
+
]
|
30
|
+
}
|
31
|
+
}
|
32
|
+
|
33
|
+
extension MACoordinateRegion {
|
34
|
+
var json: [String: Any] {
|
35
|
+
[
|
36
|
+
"southwest": [
|
37
|
+
"latitude": center.latitude - span.latitudeDelta / 2,
|
38
|
+
"longitude": center.longitude - span.longitudeDelta / 2,
|
39
|
+
],
|
40
|
+
"northeast": [
|
41
|
+
"latitude": center.latitude + span.latitudeDelta / 2,
|
42
|
+
"longitude": center.longitude + span.longitudeDelta / 2,
|
43
|
+
],
|
44
|
+
]
|
45
|
+
}
|
46
|
+
}
|
47
|
+
|
48
|
+
extension MAMapStatus {
|
49
|
+
var json: [String: Any] {
|
50
|
+
[
|
51
|
+
"target": centerCoordinate.json,
|
52
|
+
"zoom": zoomLevel,
|
53
|
+
"bearing": rotationDegree,
|
54
|
+
"tilt": cameraDegree,
|
55
|
+
]
|
56
|
+
}
|
57
|
+
}
|
58
|
+
|
59
|
+
extension MAMapView {
|
60
|
+
var cameraEvent: [String: Any] {
|
61
|
+
[
|
62
|
+
"cameraPosition": getMapStatus().json,
|
63
|
+
"latLngBounds": region.json,
|
64
|
+
]
|
65
|
+
}
|
66
|
+
}
|
67
|
+
|
68
|
+
extension Double {
|
69
|
+
var cgFloat: CGFloat {
|
70
|
+
CGFloat(self)
|
71
|
+
}
|
72
|
+
}
|
73
|
+
|
74
|
+
extension RCTConvert {
|
75
|
+
@objc static func MAMapType(_ json: Any) -> MAMapType {
|
76
|
+
MAMapKit.MAMapType(rawValue: json as! NSInteger)!
|
77
|
+
}
|
78
|
+
}
|
79
|
+
|
80
|
+
extension RCTImageLoader {
|
81
|
+
func loadImage(_ icon: NSDictionary?, callback: @escaping (UIImage) -> Void) {
|
82
|
+
if icon == nil {
|
83
|
+
return
|
84
|
+
}
|
85
|
+
let width = icon?["width"] as? Double ?? 0
|
86
|
+
let height = icon?["height"] as? Double ?? 0
|
87
|
+
loadImage(
|
88
|
+
with: RCTConvert.nsurlRequest(icon),
|
89
|
+
size: CGSize(width: width, height: height),
|
90
|
+
scale: RCTScreenScale(),
|
91
|
+
clipped: false,
|
92
|
+
resizeMode: RCTResizeMode.cover,
|
93
|
+
progressBlock: { _, _ in },
|
94
|
+
partialLoad: { _ in },
|
95
|
+
completionBlock: { _, image in
|
96
|
+
if image != nil {
|
97
|
+
DispatchQueue.main.async {
|
98
|
+
callback(image!)
|
99
|
+
}
|
100
|
+
}
|
101
|
+
}
|
102
|
+
)
|
103
|
+
}
|
104
|
+
}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require "json"
|
2
|
+
|
3
|
+
package = JSON.parse(File.read(File.join(__dir__, "../../package.json")))
|
4
|
+
|
5
|
+
Pod::Spec.new do |s|
|
6
|
+
s.name = "react-native-amap3d"
|
7
|
+
s.version = package["version"]
|
8
|
+
s.summary = package["description"]
|
9
|
+
s.homepage = package["homepage"]
|
10
|
+
s.license = package["license"]
|
11
|
+
s.authors = package["author"]
|
12
|
+
|
13
|
+
s.platforms = { :ios => "10.0" }
|
14
|
+
s.source = { :git => "https://github.com/evnydd0sf/react-native-amap3d.git", :tag => "#{s.version}" }
|
15
|
+
|
16
|
+
s.source_files = "**/*.{h,m,mm,swift}"
|
17
|
+
|
18
|
+
s.dependency "React-Core"
|
19
|
+
s.dependency 'AMap3DMap', "10.0.1000"
|
20
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
import { requireNativeComponent } from "react-native";
|
2
|
+
import { LatLng } from "./types";
|
3
|
+
|
4
|
+
export interface CircleProps {
|
5
|
+
/**
|
6
|
+
* 圆点坐标
|
7
|
+
*/
|
8
|
+
center: LatLng;
|
9
|
+
|
10
|
+
/**
|
11
|
+
* 半径(米)
|
12
|
+
*/
|
13
|
+
radius: number;
|
14
|
+
|
15
|
+
/**
|
16
|
+
* 边线宽度
|
17
|
+
*/
|
18
|
+
strokeWidth?: number;
|
19
|
+
|
20
|
+
/**
|
21
|
+
* 边线颜色
|
22
|
+
*/
|
23
|
+
strokeColor?: string;
|
24
|
+
|
25
|
+
/**
|
26
|
+
* 填充颜色
|
27
|
+
*/
|
28
|
+
fillColor?: string;
|
29
|
+
|
30
|
+
/**
|
31
|
+
* 层级
|
32
|
+
*/
|
33
|
+
zIndex?: number;
|
34
|
+
}
|
35
|
+
|
36
|
+
export default requireNativeComponent<CircleProps>("AMapCircle");
|
@@ -0,0 +1,47 @@
|
|
1
|
+
import * as React from "react";
|
2
|
+
import { StyleSheet, Text, View, ViewStyle } from "react-native";
|
3
|
+
import { ClusterParams } from ".";
|
4
|
+
import Marker from "../marker";
|
5
|
+
|
6
|
+
interface Props {
|
7
|
+
cluster: ClusterParams;
|
8
|
+
style?: ViewStyle;
|
9
|
+
textStyle?: ViewStyle;
|
10
|
+
onPress?: (params: ClusterParams) => void;
|
11
|
+
}
|
12
|
+
|
13
|
+
export default class ClusterView extends React.PureComponent<Props> {
|
14
|
+
onPress = () => {
|
15
|
+
this.props.onPress?.call(this, this.props.cluster);
|
16
|
+
};
|
17
|
+
|
18
|
+
renderClusterView = () => {
|
19
|
+
const { count } = this.props.cluster;
|
20
|
+
const size = 36 + Math.log2(count);
|
21
|
+
const clusterStyle = { width: size, height: size, borderRadius: size / 2 };
|
22
|
+
return (
|
23
|
+
<View style={[style.cluster, clusterStyle, this.props.style]}>
|
24
|
+
<Text style={[style.text, this.props.textStyle]}>{count}</Text>
|
25
|
+
</View>
|
26
|
+
);
|
27
|
+
};
|
28
|
+
|
29
|
+
render() {
|
30
|
+
return (
|
31
|
+
<Marker onPress={this.onPress} position={this.props.cluster.position}>
|
32
|
+
{this.renderClusterView()}
|
33
|
+
</Marker>
|
34
|
+
);
|
35
|
+
}
|
36
|
+
}
|
37
|
+
|
38
|
+
const style = StyleSheet.create({
|
39
|
+
cluster: {
|
40
|
+
borderWidth: 4,
|
41
|
+
borderColor: "#fff",
|
42
|
+
backgroundColor: "rgba(245,83,61,0.9)",
|
43
|
+
alignItems: "center",
|
44
|
+
justifyContent: "center",
|
45
|
+
},
|
46
|
+
text: { color: "#fff", fontWeight: "600" },
|
47
|
+
});
|