diff --git a/README.md b/README.md index 65171f6c..fa2c0ef9 100644 --- a/README.md +++ b/README.md @@ -250,7 +250,12 @@ Cluster 示例 | Promise getCurrentPosition(String coorType) | coorType 可为 `bd09ll` 或 `gcj02`,默认 `bd09ll`|`{"latitude": 0.0, "longitude": 0.0, "address": "", "province": "", "cityCode": "", "city": "", "district": "", "streetName": "", "streetNumber": ""}` Android: `{"latitude": 0.0, "longitude": 0.0, "direction": -1, "altitude": 0.0, "radius": 0.0, "address": "", "countryCode": "", "country": "", "province": "", "cityCode": "", "city": "", "district": "", "street": "", "streetNumber": "", "buildingId": "", "buildingName": ""}` | startLocating(function listener, String coorType) | 开始持续定位 | | stopLocating | 停止持续定位 | - +| convertCoor({longitude,latitude}, CoorType from, CoorType to) | 支持坐标系转换: WGS84->BD09LL, WGS84->GCJ02, BD09LL->GCJ02, GCJ02->BD09LL|{ longitude: 113.965453, latitude: 22.535045 } +convertCoor 样例 +```jsx +Geolocation.convertCoor({latitude:param.lat,longitude:param.lng},CoorTypes.BD09ll,CoorTypes.GCJ02).then((data)=>{ + }); +``` #### GetDistance Methods | Method | Result | ------------------------- | ------- diff --git a/android/src/main/java/org/lovebing/reactnative/baidumap/module/GeolocationModule.java b/android/src/main/java/org/lovebing/reactnative/baidumap/module/GeolocationModule.java index 454b59d9..54ead3e2 100644 --- a/android/src/main/java/org/lovebing/reactnative/baidumap/module/GeolocationModule.java +++ b/android/src/main/java/org/lovebing/reactnative/baidumap/module/GeolocationModule.java @@ -15,6 +15,8 @@ import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.baidu.location.LocationClientOption.LocationMode; +import com.baidu.mapapi.CoordType; +import com.baidu.mapapi.SDKInitializer; import com.baidu.mapapi.model.LatLng; import com.baidu.mapapi.search.core.PoiInfo; import com.baidu.mapapi.search.core.SearchResult; @@ -33,8 +35,15 @@ import com.facebook.react.bridge.WritableMap; import org.lovebing.reactnative.baidumap.support.AppUtils; + import java.util.List; +import static com.baidu.mapapi.CoordType.BD09LL; +import static com.baidu.mapapi.CoordType.GCJ02; +import static com.baidu.mapapi.utils.CoordinateConverter.CoordType.COMMON; +import static com.baidu.mapapi.utils.CoordinateConverter.CoordType.GPS; + + /** * Created by lovebing on 2016/10/28. */ @@ -96,6 +105,137 @@ protected LatLng getBaiduCoorFromGPSCoor(LatLng sourceLatLng) { } + @ReactMethod + public void getGCJ02CoorFromWGS84Coor(double lat, double lng,Promise promise) { + WritableMap params = Arguments.createMap(); + CoordType coord = SDKInitializer.getCoordType(); + boolean isSetCoord = false; + + + if (coord != BD09LL){ + SDKInitializer.setCoordType(BD09LL); + isSetCoord = true; + } + LatLng src=new LatLng(lat,lng); + CoordinateConverter converter = new CoordinateConverter() + .from(GPS) + .coord(src); + //转换坐标 + LatLng tempdest = converter.convert(); + + + if (isSetCoord){ + SDKInitializer.setCoordType(coord); + } + + + + if (coord != GCJ02){ + SDKInitializer.setCoordType(GCJ02); + isSetCoord = true; + } + + CoordinateConverter descconverter = new CoordinateConverter() + .from(CoordinateConverter.CoordType.BD09LL) + .coord(tempdest); + //转换坐标 + LatLng dest = descconverter.convert(); + params.putDouble("latitude", dest.latitude); + params.putDouble("longitude", dest.longitude); + if (isSetCoord){ + SDKInitializer.setCoordType(coord); + + } + //System.out.println("getGCJ02CoorFromWGS84Coor lat:"+lat+"lng:"+lng+" to "+"lat:"+dest.latitude+" lng:"+dest.longitude); + + promise.resolve(params); + } + + @ReactMethod + public void getBD09LLCoorFromWGS84Coor(double lat, double lng,Promise promise) { + WritableMap params = Arguments.createMap(); + CoordType coord = SDKInitializer.getCoordType(); + boolean isSetCoord = false; + + if (coord!= BD09LL){ + SDKInitializer.setCoordType(BD09LL); + + isSetCoord = true; + } + LatLng src = new LatLng(lat,lng); + CoordinateConverter converter = new CoordinateConverter() + .from(GPS) + .coord(src); + //转换坐标 + LatLng dest = converter.convert(); + params.putDouble("latitude", dest.latitude); + params.putDouble("longitude", dest.longitude); + if (isSetCoord){ + SDKInitializer.setCoordType(coord); + + } + //System.out.println("getBD09LLCoorFromWGS84Coor lat:"+lat+"lng:"+lng+" to "+"lat:"+dest.latitude+" lng:"+dest.longitude); + + promise.resolve(params); + } + + + @ReactMethod + public void getGCJ02CoorFromBD09LLCoor(double lat, double lng,Promise promise) { + + WritableMap params = Arguments.createMap(); + CoordType coord = SDKInitializer.getCoordType(); + boolean isSetCoord = false; + + if (coord != GCJ02){ + SDKInitializer.setCoordType(GCJ02); + + isSetCoord =true; + } + LatLng src = new LatLng(lat,lng); + CoordinateConverter converter = new CoordinateConverter() + .from(CoordinateConverter.CoordType.BD09LL) + .coord(src); + //转换坐标 + LatLng dest = converter.convert(); + params.putDouble("latitude", dest.latitude); + params.putDouble("longitude", dest.longitude); + if (isSetCoord){ + SDKInitializer.setCoordType(coord); + + } + //System.out.println("getGCJ02CoorFromBD09LLCoor lat:"+lat+"lng:"+lng+" to "+"lat:"+dest.latitude+" lng:"+dest.longitude); + promise.resolve(params); + + } + @ReactMethod + public void getBD09LLCoorFromGCJ02Coor(double lat, double lng,Promise promise) { + WritableMap params = Arguments.createMap(); + CoordType coord = SDKInitializer.getCoordType(); + boolean isSetCoord = false; + + if (coord != BD09LL){ + SDKInitializer.setCoordType(BD09LL); + + isSetCoord= true; + } + LatLng src = new LatLng(lat,lng); + CoordinateConverter converter = new CoordinateConverter() + .from(COMMON) + .coord(src); + //转换坐标 + LatLng dest = converter.convert(); + params.putDouble("latitude", dest.latitude); + params.putDouble("longitude", dest.longitude); + if (isSetCoord){ + SDKInitializer.setCoordType(coord); + + } + //System.out.println("getBD09LLCoorFromGCJ02Coor lat:"+lat+"lng:"+lng+" to "+"lat:"+dest.latitude+" lng:"+dest.longitude); + + promise.resolve(params); + } + @ReactMethod public void convertGPSCoor(double lat, double lng, Promise promise) { Log.i("convertGPSCoor", "convertGPSCoor"); diff --git a/index.js b/index.js index 4c71a0da..14c53154 100644 --- a/index.js +++ b/index.js @@ -14,7 +14,9 @@ import _MapTypes from './js/MapTypes'; import _Geolocation from './js/Geolocation'; import _GetDistance from './js/GetDistance'; import _Overlay from './js/Overlay/index'; +import _CoorTypes from './js/CoorTypes'; +export const CoorTypes = _CoorTypes; export const MapView = _MapView; export const MapTypes = _MapTypes; export const Geolocation = _Geolocation; diff --git a/ios/RCTBaiduMap/GeolocationModule.m b/ios/RCTBaiduMap/GeolocationModule.m index ae29f9b3..65936520 100644 --- a/ios/RCTBaiduMap/GeolocationModule.m +++ b/ios/RCTBaiduMap/GeolocationModule.m @@ -7,7 +7,7 @@ // #import "GeolocationModule.h" - +#import @implementation GeolocationModule @@ -106,6 +106,68 @@ - (NSMutableDictionary *)getLocationEventData:(BMKLocation* _Nullable)location o resolve(coor); } + + +RCT_EXPORT_METHOD(getGCJ02CoorFromWGS84Coor:(double)lat lng:(double)lng + resolver:(RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject) { + CLLocationCoordinate2D src = CLLocationCoordinate2DMake(lat, lng); + CLLocationCoordinate2D desc = BMKCoordTrans(src, BMK_COORDTYPE_GPS,BMK_COORDTYPE_COMMON); + NSDictionary* coor = @{ + @"latitude": @(desc.latitude), + @"longitude": @(desc.longitude) + }; + NSLog(@"getGCJ02CoorFromWGS84Coor lat:%f lng:%f to lat:%f lng:%f",lat,lng,desc.latitude,desc.longitude); + + resolve(coor); +} + + +RCT_EXPORT_METHOD(getBD09LLCoorFromWGS84Coor:(double)lat lng:(double)lng + resolver:(RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject) { + CLLocationCoordinate2D src = CLLocationCoordinate2DMake(lat, lng); + CLLocationCoordinate2D desc = BMKCoordTrans(src, BMK_COORDTYPE_GPS,BMK_COORDTYPE_BD09LL); + NSDictionary* coor = @{ + @"latitude": @(desc.latitude), + @"longitude": @(desc.longitude) + }; + + NSLog(@"getBD09LLCoorFromWGS84Coor lat:%f lng:%f to lat:%f lng:%f",lat,lng,desc.latitude,desc.longitude); + resolve(coor); +} + + + +RCT_EXPORT_METHOD(getGCJ02CoorFromBD09LLCoor:(double)lat lng:(double)lng + resolver:(RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject) { + CLLocationCoordinate2D src = CLLocationCoordinate2DMake(lat, lng); + CLLocationCoordinate2D desc = BMKCoordTrans(src, BMK_COORDTYPE_BD09LL,BMK_COORDTYPE_COMMON); + NSDictionary* coor = @{ + @"latitude": @(desc.latitude), + @"longitude": @(desc.longitude) + }; + + NSLog(@"getGCJ02CoorFromBD09LLCoor lat:%f lng:%f to lat:%f lng:%f",lat,lng,desc.latitude,desc.longitude); + resolve(coor); +} + + +RCT_EXPORT_METHOD(getBD09LLCoorFromGCJ02Coor:(double)lat lng:(double)lng + resolver:(RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject) { + + CLLocationCoordinate2D src = CLLocationCoordinate2DMake(lat, lng); + CLLocationCoordinate2D desc = BMKCoordTrans(src,BMK_COORDTYPE_COMMON,BMK_COORDTYPE_BD09LL); + NSDictionary* coor = @{ + @"latitude": @(desc.latitude), + @"longitude": @(desc.longitude) + }; + NSLog(@"getBD09LLCoorFromGCJ02Coor lat:%f lng:%f to lat:%f lng:%f",lat,lng,desc.latitude,desc.longitude); + resolve(coor); +} + RCT_EXPORT_METHOD(geocode:(NSString *)city addr:(NSString *)addr) { [self getGeocodesearch].delegate = self; diff --git a/js/CoorTypes.js b/js/CoorTypes.js index d8f4ccd0..16b07847 100644 --- a/js/CoorTypes.js +++ b/js/CoorTypes.js @@ -7,5 +7,6 @@ export default { BD09ll: 'bd09ll', - GCJ02: 'gcj02' + GCJ02: 'gcj02', + WGS84:'wgs84' }; \ No newline at end of file diff --git a/js/Geolocation.js b/js/Geolocation.js index c3ae22fa..8a0af421 100644 --- a/js/Geolocation.js +++ b/js/Geolocation.js @@ -16,7 +16,7 @@ import React, { Component, PropTypes } from 'react'; - +import CoorTypes from './CoorTypes' const _module = NativeModules.BaiduGeolocationModule; @@ -125,5 +125,61 @@ export default { _locatingUpdateListener.handler.remove(); _locatingUpdateListener.handler = null; } + }, + convertCoor(source,fromCoorType,toCoorType ) { + return new Promise((resolve, reject) => { + if (fromCoorType==CoorTypes.WGS84){ + if (toCoorType==CoorTypes.BD09ll){ + try { + _module.getBD09LLCoorFromWGS84Coor(source.latitude,source.longitude).then((data)=>{ + resolve(data); + }); + } + catch (e) { + reject(e); + return; + } + + }else if (toCoorType==CoorTypes.GCJ02){ + try { + _module.getGCJ02CoorFromWGS84Coor(source.latitude,source.longitude).then((data)=>{ + resolve(data); + }); + } + catch (e) { + reject(e); + return; + } + + } + }else if (fromCoorType==CoorTypes.BD09ll && toCoorType==CoorTypes.GCJ02){ + try { + _module.getGCJ02CoorFromBD09LLCoor(source.latitude,source.longitude).then((data)=>{ + resolve(data); + }); + } + catch (e) { + reject(e); + return; + } + } + else if (fromCoorType==CoorTypes.GCJ02 && toCoorType==CoorTypes.BD09ll){ + try { + _module.getBD09LLCoorFromGCJ02Coor(source.latitude,source.longitude).then((data)=>{ + resolve(data); + }); + } + catch (e) { + reject(e); + return; + } + }else{ + reject("不支持"); + return; + } + + }); + } + };