项目里遇到根据经纬度跳转第三方导航的需求,在网上找了一下,发现都是千篇一律的文章,而且不能正确显示目的地地址,无果后去百度和高德地图官网查找,位置十分隐蔽,给大家分享下
手机上自己的APP调起高德地图APP有俩种方法
- 一种是通过访问web的URI地址来实现,这样写的效果是,APP会跳转浏览器 访问H5页面的高德地图,如果设置 callnative参数为1时,浏览器会询问你是否需要打开高德地图app
--- 访问地址示例
https://uri.amap.com/navigation?from=116.478346,39.997361,startpoint&to=116.3246,39.966577,endpoint&via=116.402796,39.936915,midwaypoint&mode=car&policy=1&src=mypage&coordinate=gaode&callnative=0
- 另外一种就是通常使用到的直接跳转方法,直接通过高德APP的URL_TYPE来实现,这种方法需要根据出发点的经纬库及目的地的经纬度,而且可以设置目的地的地址,如果目的地地址为空,地图上会显示未地图上的点
--- 访问地址示例(直接发起导航)
iosamap://navi?sourceApplication=applicationName&poiname=fangheng&poiid=BGVIS&lat=36.547901&lon=104.258354&dev=1&style=2
---访问地址示例(路线规划)
iosamap://path?sourceApplication=applicationName&sid=&slat=39.92848272&slon=116.39560823&sname=A&did=&dlat=39.98848272&dlon=116.47560823&dname=B&dev=0&t=0
APP调起百度地图APP
百度地图通过URL_TYPE方式直接跳转百度地图APP,链接内可以设置目的地地址,百度地图设置目的地地址时文档上说的比较隐晦,需要以下面格式设置 destination=name:目的地地址|latlng:40.007623,116.360582,中间以竖线隔开
---访问地址示例(路线规划)
baidumap://map/direction?origin={{我的位置}}&destination=name:目的地地址|latlng:40.007623,116.360582&coord_type=bd09ll&mode=driving&src=ios.baidu.openAPIdemo
参数可以自己修改传入,需要注意的是百度和高德地图之间的经纬度不通用,需要转换
/** 百度地图转高德地图坐标 */
- (CLLocationCoordinate2D) bd_decrypt:(double)bd_lat bd_lon:(double)bd_lon
{
double x = bd_lon - 0.0065, y = bd_lat - 0.006;
double z = sqrt(x * x + y * y) - 0.00002 * sin(y * x_pi);
double theta = atan2(y, x) - 0.000003 * cos(x * x_pi);
CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(z * sin(theta), z * cos(theta));
return coordinate;
}
/** 高德地图转百度地图坐标 */
- (CLLocationCoordinate2D) bd_decrypt:(double)gg_lat gg_lon:(double)gg_lon
{
double x = gg_lon, y = gg_lat;
double z = sqrt(x * x + y * y) + 0.00002 * sin(y * x_pi);
double theta = atan2(y, x) + 0.000003 * cos(x * x_pi);
CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(z * sin(theta)+0.006, z * cos(theta)+0.0065);
return coordinate;
}