uni-app 支持多端第三方地图定位的方法


Posted in Javascript onJanuary 03, 2020

简介

该方法支持跳转第三方地图并定位指定坐标。

APP端跳转至百度地图(第三方软件);若无,则跳转至高德地图(第三方软件);若均无,则打开腾讯地图(uni自带方法:uni.openLocation)
其它端打开腾讯地图(uni自带方法:uni.openLocation)

demo

源码:https://github.com/yapeee/uni-components

测试数据:

wgs84: 39.9078008469, 116.391290596
bd09: 39.915547, 116.403909
gcj02: 39.9091591069, 116.3974783161

基础用法

import Map from '../ms-openMap.js'
Map.openMap(latitude, longitude, name, coord_type)

属性说明

参数 说明 类型
latitude 纬度(默认GCJ-02坐标系) Float
longitude 经度(默认GCJ-02坐标系) Float
name 地图标注名称 String
coord_type 坐标类型,可选参数。示例:gcj02、bd09、wgs84 String

实现方案

首先判断程序的运行平台,不同的平台调用不同的打开地图的方法。android和ios平台下,判断并打开百度地图和高德地图。其他平台下,打开腾讯地图网页版(uni自带方法)。

一、判断运行平台

通过条件编译及uni.getSystemInfoSync().platform来判断android、ios及其他平台。

// #ifdef APP-PLUS
switch(uni.getSystemInfoSync().platform){
  case 'android':
    console.log('运行Android上')
    openMapByAndroid(latitude, longitude, name)
    break;
  case 'ios':
    console.log('运行iOS上')
    openMapByIos(latitude, longitude, name)
    break;
  default:
    openMapByDefault(latitude, longitude, name)
    console.log('运行在开发者工具上')  
    break;
}  
// #endif
// #ifndef APP-PLUS
openMapByDefault(latitude, longitude, name)
// #endif
tips:

平台判断有2种场景,一种是在编译期判断,一种是在运行期判断。

编译期判断:即条件编译,不同平台在编译出包后已经是不同的代码。

运行期判断:运行期判断是指代码已经打入包中,仍然需要在运行期判断平台,此时可使用 uni.getSystemInfoSync().platform 判断客户端环境是 Android、iOS 还是小程序开发工具(在百度小程序开发工具、微信小程序开发工具、支付宝小程序开发工具中使用 uni.getSystemInfoSync().platform 返回值均为 devtools)。

二、APP打开第三方地图的方法

HTML5+是对接SDK与页面的中间件,用于页面通过js调用底层的SDK接口。

2.1、 APP判断第三方应用是否存在

/*
 * appInf: ( ApplicationInf ) 必选 要判断第三方程序的描述信息
 * Android平台需要通过设置appInf的pname属性(包名)进行查询。 
 * iOS平台需要通过设置appInf的action属性(Scheme)进行查询,在iOS9以后需要添加白名单才可查询,
 * 在manifest.json文件plus->distribute->apple->urlschemewhitelist节点下添加(如urlschemewhitelist:["weixin"]).
 */
plus.runtime.isApplicationExist(appInf);

2.1.1、判断百度地图应用是否存在

plus.runtime.isApplicationExist({pname: 'com.baidu.BaiduMap', action: 'baidumap://'})

2.1.2、判断高德地图应用是否存在

plus.runtime.isApplicationExist({pname: 'com.autonavi.minimap'},action: 'iosamap://'})

2.2、APP调用第三方程序打开指定的URL

/*
 * 说明:调用第三方程序打开指定的URL
 * 参数:
 * url: ( String ) 必选 要打开的URL地址
 * errorCB: ( OpenErrorCallback ) 可选 打开URL地址失败的回调
 * identity: ( String ) 可选 指定打开URL地址的程序名称
 */
plus.runtime.openURL( url, errorCB, identity );

2.2.1、打开第三方程序实际应用

function openURL(url, identity ) {
  let newurl = encodeURI(url);
  plus.runtime.openURL( newurl, function(res){
    uni.showModal({
      content: res.message
    })
  }, identity);
}

2.2.2、打开android百度地图

url = `baidumap://map/marker?location=${latitude},${longitude}&title=${name}&coord_type=gcj02&src=andr.baidu.openAPIdemo`
identity = 'com.baidu.BaiduMap'
openURL(url, identity)

2.2.3、打开android高德地图

url = `androidamap://viewMap?sourceApplication=appname&poiname=${name}&lat=${latitude}&lon=${longitude}&dev=0`
identity = 'com.autonavi.minimap'
openURL(url, identity)

2.2.4、打开ios百度地图

url = `baidumap://map/marker?location=${latitude},${longitude}&title=${name}&content=${name}&src=ios.baidu.openAPIdemo&coord_type=gcj02`;
openURL(url, identity)

2.2.5、打开ios高德地图

url = `iosamap://viewMap?sourceApplication=applicationName&poiname=${name}&lat=${latitude}&lon=${longitude}&dev=0`
openURL(url, identity)

三、其他平台打开地图的方法

其他平台采用uni.openLocation(OBJECT)方法使用应用内置地图查看位置。

uni.openLocation({
  latitude: latitude,
  longitude: longitude,
  name: name,
  fail: () => {
    uni.showModal({
      content: '打开地图失败,请重'
    })
  },
})

更新日志

2020-01-02

支持BD-09(百度坐标)、GCJ-02(高德、腾讯)、WGS-84(GPS坐标)坐标系。

2019.12.10

第一次发布,支持跳转第三方地图并定位指定坐标。

参考

百度地图URI API
高德地图URI API
uni-app HTML5+ API

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript动画效果类封装代码
Aug 28 Javascript
node.js实现多图片上传实例
Jun 03 Javascript
jQuery仿gmail实现fixed布局的方法
May 27 Javascript
JS实现三级折叠菜单特效,其它级可自动收缩
Aug 06 Javascript
jquery实现可自动判断位置的弹出层效果代码
Oct 12 Javascript
js检测用户输入密码强度
Oct 22 Javascript
详解JavaScript中的构造器Constructor模式
Jan 14 Javascript
JavaScript中获取HTML元素值的三种方法
Jun 20 Javascript
JavaScript 值类型和引用类型的初次研究(推荐)
Jul 19 Javascript
解决axios发送post请求返回400状态码的问题
Aug 11 Javascript
Vue 应用中结合vux使用微信 jssdk的方法
Aug 28 Javascript
vue a标签点击实现赋值方式
Sep 07 Javascript
Vue 实现登录界面验证码功能
Jan 03 #Javascript
JS实现扫码枪扫描二维码功能
Jan 03 #Javascript
file-loader打包图片文件时路径错误输出为[object-module]的解决方法
Jan 03 #Javascript
uni-app如何实现增量更新功能
Jan 03 #Javascript
JS实现简单日历特效
Jan 03 #Javascript
微信小程序中的video视频实现 自定义播放按钮、封面图、视频封面上文案
Jan 02 #Javascript
微信小程序地图绘制线段并且测量(实例代码)
Jan 02 #Javascript
You might like
《PHP编程最快明白》第七讲:php图片验证码与缩略图
2010/11/01 PHP
分享3个php获取日历的函数
2015/09/25 PHP
十个PHP高级应用技巧果断收藏
2015/09/25 PHP
yii2.0框架多模型操作示例【添加/修改/删除】
2020/04/13 PHP
PHP数组访问常用方法解析
2020/09/05 PHP
js constructor的实际作用分析
2011/11/15 Javascript
jQuery.clean使用方法及思路分析
2013/01/07 Javascript
js日期对象兼容性的处理方法
2014/01/28 Javascript
js创建一个input数组并绑定click事件的方法
2014/06/12 Javascript
javascript实现回到顶部特效
2015/05/06 Javascript
使用AngularJS处理单选框和复选框的简单方法
2015/06/19 Javascript
coffeescript使用的方式汇总
2015/08/05 Javascript
浅谈javascript的Touch事件
2015/09/27 Javascript
学习JavaScript事件流和事件处理程序
2016/01/25 Javascript
JSP基于Bootstrap分页显示实例解析
2016/06/12 Javascript
angular框架实现全选与单选chekbox的自定义
2017/07/06 Javascript
JS写XSS cookie stealer来窃取密码的步骤详解
2017/11/20 Javascript
vue中实现图片和文件上传的示例代码
2018/03/16 Javascript
浅谈JS对象添加getter与setter的5种方法
2018/06/09 Javascript
layui实现数据分页功能(ajax异步)
2019/07/27 Javascript
Vue父子之间值传递的实例教程
2020/07/02 Javascript
JS实现悬浮球只在一侧滑动并且是横屏状态下
2020/08/19 Javascript
javascript实现多边形碰撞检测
2020/10/24 Javascript
[00:47]DOTA2荣耀之路6:玩不了啦!
2018/05/30 DOTA
Python模块学习 datetime介绍
2012/08/27 Python
Python中模块与包有相同名字的处理方法
2017/05/05 Python
Python学习小技巧之利用字典的默认行为
2017/05/20 Python
Python键盘输入转换为列表的实例
2018/06/23 Python
Django 1.10以上版本 url 配置注意事项详解
2019/08/05 Python
Numpy 中的矩阵求逆实例
2019/08/26 Python
试用期员工考核制度
2014/01/22 职场文书
小学教师读书活动总结
2014/07/08 职场文书
白酒营销策划方案
2014/08/17 职场文书
售房协议书范本
2015/08/11 职场文书
Python调用腾讯API实现人脸身份证比对功能
2022/04/04 Python
html原生table实现合并单元格以及合并表头的示例代码
2023/05/07 HTML / CSS