综上所诉,优点显而易见。
有地图就有经纬度,有经纬度就扯到坐标系,简单介绍一下坐标系。
主要有以下三种:
百度使用的自家BD09LL坐标系,高德和腾讯都是GCJ02即火星坐标系,所以相互之间是需要转换的,不然会有位置偏移。
转换方法:
/**
* BD-09 坐标转换成 GCJ-02 坐标
*/
public static LatLng BD2GCJ(LatLng bd) {
double x = bd.longitude - 0.0065, y = bd.latitude - 0.006;
double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * Math.PI);
double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * Math.PI);
double lng = z * Math.cos(theta);
double lat = z * Math.sin(theta);
return new LatLng(lat, lng);
}
/**
* GCJ-02 坐标转换成 BD-09 坐标
*/
public static LatLng GCJ2BD(LatLng bd) {
double x = bd.longitude, y = bd.latitude;
double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * Math.PI);
double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * Math.PI);
double tempLon = z * Math.cos(theta) + 0.0065;
double tempLat = z * Math.sin(theta) + 0.006;
return new LatLng(tempLat, tempLon);
}
还是简单描述一下业务需求,点击一个地址或者按钮或者地图上的一个点,弹窗选择第三方地图导航,点击选择后调用第三方地图进行导航。
@OnClick({R.id.tv_navigation})
public void onViewClicked(View view) {
switch (view.getId()) {
...
case R.id.tv_navigation:
showMapList();
break;
}
}
private void showMapList() {
final String[] mapNames = {"百度地图", "高德地图", "腾讯地图"};
final String[] packageNames = {"com.baidu.BaiduMap", "com.autonavi.minimap", "com.tencent.map"};
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle("请选择地图")
.setItems(mapNames, (dialogInterface, i) -> {
boolean installed = isInstalled(packageNames[i]);
if (installed) {
switch (i) {
case 0:
gotoBaiDuMap();
break;
case 1:
gotoGaoDeMap();
break;
case 2:
gotoTencentMap();
break;
}
} else {
ToastUtil.showCenterToast(mapNames[i] + "未安装");
}
});
builder.create().show();
}
调用之前判断一下是否安装:
/**
* 检测所选地图是否安装
*/
private boolean isInstalled(String packageName) {
PackageManager manager = this.getPackageManager();
List<PackageInfo> installedPackages = manager.getInstalledPackages(0);
if (installedPackages != null) {
for (PackageInfo info : installedPackages) {
if (info.packageName.equals(packageName))
return true;
}
}
return false;
}
别忘了 申请权限。
参数以字符串拼接的方式即可,这里用StringBuffer拼接,比String易读些。
private void gotoBaiDuMap() {
// 驾车导航
StringBuffer sb = new StringBuffer("baidumap://map/navi")
.append("?coord_type=gcj02")
.append("&query=").append("长宁图书馆")
.append("&src=").append(this.getPackageName());
Intent intent = new Intent();
intent.setData(Uri.parse(sb.toString()));
startActivity(intent);
}
private void gotoGaoDeMap() {
LatLng endPoint = BD2GCJ(new LatLng(31.220567, 121.395174));//转换坐标系
StringBuffer sb = new StringBuffer("androidamap://navi")
.append("?sourceApplication=").append(getString(R.string.app_name))
.append("&lat=").append(endPoint.latitude)
.append("&lon=").append(endPoint.longitude)
.append("&dev=0");
Intent intent = new Intent();
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setPackage("com.autonavi.minimap");
intent.setData(Uri.parse(sb.toString()));
startActivity(intent);
}
private void gotoTencentMap() {
LatLng startPoint = BD2GCJ(new LatLng(mLatitude, mLongitude));//坐标转换
LatLng endPoint = BD2GCJ(new LatLng(31.220567, 121.395174));//坐标转换
StringBuffer sb = new StringBuffer("qqmap://map/routeplan")
.append("?type=drive")
.append("&from=我的位置")
.append("&fromcoord=").append(startPoint.latitude).append(",").append(startPoint.longitude)
.append("&to=长宁图书馆")
.append("&tocoord=").append(endPoint.latitude).append(",").append(endPoint.longitude)
.append("&referer=你的key");
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(sb.toString()));
startActivity(intent);
}
注意,腾讯地图这里的from和to参数虽然可以省略,但是地图上就不显示地址了,默认是 地图上的点,而且referer参数需要申请开发者key。
https://blog.csdn.net/Ever69/article/details/82427085
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有