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 相关文章推荐
解析jquery获取父窗口的元素
Jun 26 Javascript
Javascript中的apply()方法浅析
Mar 15 Javascript
js正则表达式匹配数字字母下划线等
Apr 14 Javascript
JavaScript对象数组的排序处理方法
Oct 21 Javascript
JavaScript实现字符串与日期的互相转换及日期的格式化
Mar 07 Javascript
深入解析JavaScript中的立即执行函数
May 21 Javascript
Angular.js中控制器之间的传值详解
Apr 24 Javascript
详解a标签添加onclick事件的几种方式
Mar 29 Javascript
vue element-ui之怎么封装一个自己的组件的详解
May 20 Javascript
详解element-ui设置下拉选择切换必填和非必填
Jun 17 Javascript
javascript头像上传代码实例
Sep 28 Javascript
js实现踩五彩块游戏
Feb 08 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多线程异步请求的3种方法
2014/01/17 PHP
php curl 上传文件代码实例
2015/04/27 PHP
javascript的函数
2007/01/31 Javascript
从父页面读取和操作iframe中内容方法
2009/07/25 Javascript
Node.js实战 建立简单的Web服务器
2012/03/08 Javascript
Javascript中数组sort和reverse用法分析
2014/12/30 Javascript
使用nodejs开发cli项目实例
2015/06/03 NodeJs
javascript实现base64 md5 sha1 密码加密
2015/09/09 Javascript
js删除数组元素、清空数组的简单方法(必看)
2016/07/27 Javascript
JavaScript实战(原生range和自定义特效)简单实例
2016/08/21 Javascript
bootstrap中使用google prettify让代码高亮的方法
2016/10/21 Javascript
你真的了解BOM中的history对象吗
2017/02/13 Javascript
如何将 jQuery 从你的 Bootstrap 项目中移除(取而代之使用Vue.js)
2017/07/17 jQuery
基于jQuery对象和DOM对象和字符串之间的转化实例
2017/08/08 jQuery
nodeJS微信分享
2017/12/20 NodeJs
基于vue+axios+lrz.js微信端图片压缩上传方法
2019/06/25 Javascript
js实现弹窗猜数字游戏
2020/11/26 Javascript
CentOS 8.2服务器上安装最新版Node.js的方法
2020/12/16 Javascript
[01:45]2014DOTA2 TI预选赛预选赛 大神专访第二弹!
2014/05/20 DOTA
简述Python中的进程、线程、协程
2016/03/18 Python
Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
2016/06/14 Python
浅谈python新手中常见的疑惑及解答
2016/06/14 Python
linux环境下的python安装过程图解(含setuptools)
2017/11/22 Python
浅谈python3.x pool.map()方法的实质
2019/01/16 Python
Python散点图与折线图绘制过程解析
2019/11/30 Python
Pytest参数化parametrize使用代码实例
2020/02/22 Python
Python绘图之二维图与三维图详解
2020/08/04 Python
利用python绘制中国地图(含省界、河流等)
2020/09/21 Python
联想法国官方网站:Lenovo法国
2018/10/18 全球购物
家得宝官网:The Home Depot(全球最大的家居装饰专业零售商)
2018/12/17 全球购物
意大利男装网店:Vrients
2019/05/02 全球购物
电大自我鉴定范文
2013/10/01 职场文书
暑期实践思想汇报
2014/01/06 职场文书
应届毕业生自荐信
2015/03/04 职场文书
python基于tkinter制作下班倒计时工具
2021/04/28 Python
世界无敌的ICOM IC-R9500宽频接收机
2022/03/25 无线电