如果app中需要支持国内、国外地图,则可以利用该示例,在app中同时集成高德和苹果地图,保证国内外地图均可使用。
可以根据地图中心点在国内、外自动提示是否切换地图。
iOS 地图 SDK iOS 定位 SDK Apple MapKit
核心类/接口
类 | 接口 | 说明 | 版本 |
---|---|---|---|
ViewController | - (void)mapView:(UIView *)mapView regionDidChangeAnimated:(BOOL)animated; | 响应地图区域变化,判断中心点 | ---- |
ViewController | - (void)performSwitching; | 执行切换 | ---- |
1.在地图delegate内判断中心点是否在国内
- (void)mapView:(UIView *)mapView regionDidChangeAnimated:(BOOL)animated {
if(mapView.isHidden) {
return;
}
if(self.isSwitching) {
self.isSwitching = NO;
return;
}
if([mapView isKindOfClass:[MAMapView class]]) {
if(!AMapDataAvailableForCoordinate(self.gaodeMapview.centerCoordinate)) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:@"是否切换到苹果地图显示" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
[alert show];
}
} else {
if(AMapDataAvailableForCoordinate(self.appleMapview.centerCoordinate)) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:@"是否切换到高德地图显示" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
[alert show];
}
}
}
//判断中心点是否在国内
func handleMapviewRegionChange(mapView : UIView) {
if(mapView.isHidden) {
return
}
if(self.isSwitching) {
self.isSwitching = false
return
}
if(mapView.isKind(of: MAMapView.self)) {
if(!AMapDataAvailableForCoordinate(self.gaodeMapView.centerCoordinate)) {
let alert = UIAlertView.init(title: "", message: "是否切换到苹果地图显示", delegate: self, cancelButtonTitle: "取消", otherButtonTitles:"确定")
alert.show()
}
} else {
if(AMapDataAvailableForCoordinate(self.appleMapView.centerCoordinate)) {
let alert = UIAlertView.init(title: "", message: "是否切换到高德地图显示", delegate: self, cancelButtonTitle: "取消", otherButtonTitles:"确定")
alert.show()
}
}
}
2.切换地图,主要同步region、中心点经纬度、旋转角度。目前不支持camera视角同步
/**
执行切换
*/
- (void)performSwitching {
self.isSwitching = YES;
[self.gaodeMapview setHidden:!self.gaodeMapview.isHidden];
[self.appleMapview setHidden:!self.appleMapview.isHidden];
if(!self.gaodeMapview.isHidden) {
MACoordinateRegion region = [self MARegionForMKRegion:self.appleMapview.region];
[self.gaodeMapview setRegion:region];
self.gaodeMapview.centerCoordinate = self.appleMapview.centerCoordinate;
[self.gaodeMapview setRotationDegree:self.appleMapview.camera.heading];
} else {
MKCoordinateRegion region = [self MKRegionForMARegion:self.gaodeMapview.region];
[self.appleMapview setRegion:region];
self.appleMapview.centerCoordinate = self.gaodeMapview.centerCoordinate;
[self.appleMapview.camera setHeading:self.gaodeMapview.rotationDegree];
}
}
//替换执行
func performSwitching() {
self.isSwitching = true
self.gaodeMapView.isHidden = !self.gaodeMapView.isHidden
self.appleMapView.isHidden = !self.appleMapView.isHidden
if(!self.gaodeMapView.isHidden) {
let region = self.MARegionForMKRegion(mkRegion: self.appleMapView.region)
self.gaodeMapView.region = region
self.gaodeMapView.centerCoordinate = self.appleMapView.centerCoordinate
self.gaodeMapView.rotationDegree = CGFloat(self.appleMapView.camera.heading)
} else {
let region = self.MKRegionForMARegion(maRegion: self.gaodeMapView.region)
self.appleMapView.region = region
self.appleMapView.centerCoordinate = self.gaodeMapView.centerCoordinate
self.appleMapView.camera.heading = CLLocationDirection(self.gaodeMapView.rotationDegree)
}
}
如果app中需要支持国内、国外地图,则可以利用该示例,在app中同时集成高德和谷歌地图,保证国内外地图均可使用。
可以根据地图中心点在国内、外自动提示是否切换地图。
Android 地图 SDK Android 定位 SDK Google Maps Android API
核心类/接口
类 | 接口 | 说明 | 版本 |
---|---|---|---|
AMap | public final CameraPosition getCameraPosition() | 返回可视区域的当前位置。在可视区域变换时,此返回会自己更新。 | V2.0.0版本起 |
1.采用TextureMapView解决mapview切换会黑一下的问题
TextureMapView和MapView的区别在于:
TextureMapView是一个TextureView而MapView是一个GLSurfaceView。
所以TextureMapView 可以和其他的GlSurfaceView(比如相机)共存不会出现穿透现象,也可以放在ViewPager中不会出现滑动黑边现象。
2.由高德地图切换到Google地图:
private void changeToGoogleMapView() {
zoom = mAmapView.getMap().getCameraPosition().zoom;
latitude = mAmapView.getMap().getCameraPosition().target.latitude;
longitude = mAmapView.getMap().getCameraPosition().target.longitude;
mapbtn.setText("To Amap");
mIsAmapDisplay = false;
mGoogleMapView = new com.google.android.gms.maps.MapView(this, new GoogleMapOptions()
.camera(new com.google.android.gms.maps.model
.CameraPosition(new com.google.android.gms.maps.model.LatLng(latitude, longitude), zoom, 0, 0)));
mGoogleMapView.onCreate(null);
mGoogleMapView.onResume();
mContainerLayout.addView(mGoogleMapView, mParams);
mGoogleMapView.getMapAsync(this);
handler.sendEmptyMessageDelayed(0,500);
}
3.由Google地图切换到高德地图:
private void changeToAmapView() {
zoom = googlemap.getCameraPosition().zoom;
latitude = googlemap.getCameraPosition().target.latitude;
longitude = googlemap.getCameraPosition().target.longitude;
mapbtn.setText("To Google");
mAmapView = new TextureMapView(this, new AMapOptions()
.camera(new com.amap.api.maps.model.CameraPosition(new LatLng(latitude,longitude),zoom,0,0)));
mAmapView.onCreate(null);
mAmapView.onResume();
mContainerLayout.addView(mAmapView, mParams);
mGoogleMapView.animate()
.alpha(0f).setDuration(500).setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
mGoogleMapView.setVisibility(View.GONE);
mContainerLayout.removeView(mGoogleMapView);
if (mGoogleMapView != null) {
mGoogleMapView.onDestroy();
}
}
});
mAmapView.getMap().setOnCameraChangeListener(this);
mIsAmapDisplay = true;
}
注意:手机必须已经安装了谷歌地图服务,才能保证中心点到达国外时展示谷歌地图的效果。