示例中心
功能在线体验
控制台

国内国外地图切换

该示例主要是用于向用户展示如何在自己的应用中同时集成高德地图SDK以及谷歌地图SDK。
00:00 / 01:00
扫描二维码在手机端体验功能
体验移动端 扫码体验移动端

使用场景

如果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;
   }

注意:手机必须已经安装了谷歌地图服务,才能保证中心点到达国外时展示谷歌地图的效果。

 

00:00 / 01:00
扫描二维码在手机端体验功能
体验移动端 扫码体验移动端

使用场景

如果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)
    }
}