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 相关文章推荐
一个无限级XML绑定跨框架菜单(For IE)
Jan 27 Javascript
javascript 触发HTML元素绑定的函数
Sep 11 Javascript
基于jQuery的倒计时插件代码
May 07 Javascript
node.js 一个简单的页面输出实现代码
Mar 07 Javascript
子窗体与父窗体传值示例js代码
Aug 01 Javascript
php的文件上传入门教程(实例讲解)
Apr 10 Javascript
javascript 判断整数方法分享
Dec 16 Javascript
原生js编写autoComplete插件
Apr 13 Javascript
jQuery实现简易的输入框字数计数功能示例
Jan 16 Javascript
jquery.flot.js简单绘制折线图用法示例
Mar 13 Javascript
webpack配置proxyTable时pathRewrite无效的解决方法
Dec 13 Javascript
JS性能优化实现方法及优点进行
Aug 30 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
调频问题解答
2021/03/01 无线电
PHP两种快速排序算法实例
2015/02/15 PHP
php分页查询mysql结果的base64处理方法示例
2017/05/18 PHP
PHP7.3.10编译安装教程
2019/10/08 PHP
Auntion-TableSort国人写的一个javascript表格排序的东西
2007/11/12 Javascript
关闭页面window.location事件未执行的原因及解决方法
2014/09/01 Javascript
jquery获取当前日期的方法
2015/01/14 Javascript
js实现点击链接后窗口缩小并居中的方法
2015/03/02 Javascript
60行js代码实现俄罗斯方块
2015/03/31 Javascript
JS对字符串编码的几种方式使用指南
2015/05/14 Javascript
深入解析JavaScript编程中的this关键字使用
2015/11/09 Javascript
全面解析Bootstrap表单使用方法(表单控件)
2015/11/24 Javascript
浅析AngularJs HTTP响应拦截器
2015/12/28 Javascript
es6学习笔记之Async函数的使用示例
2017/05/11 Javascript
详解在vue-cli项目中安装node-sass
2017/06/21 Javascript
JS仿QQ好友列表展开、收缩功能(第二篇)
2017/07/07 Javascript
vue2.0 移动端实现下拉刷新和上拉加载更多的示例
2018/04/23 Javascript
微信小程序实现简单跑马灯效果
2020/05/26 Javascript
基于ts的动态接口数据配置的详解
2019/12/18 Javascript
简单了解three.js 着色器材质
2020/08/03 Javascript
[04:26]2014DOTA2西雅图国际邀请赛 总决赛TOPPLAY
2014/07/22 DOTA
[14:24]Optic Gaming vs PSG LGD BO3
2018/06/07 DOTA
Python实现文件复制删除
2016/04/19 Python
Python基于正则表达式实现文件内容替换的方法
2017/08/30 Python
python3模块smtplib实现发送邮件功能
2018/05/22 Python
python实现批量图片格式转换
2020/06/16 Python
PyCharm 配置远程python解释器和在本地修改服务器代码
2019/07/23 Python
Python数据分析模块pandas用法详解
2019/09/04 Python
Python Switch Case三种实现方法代码实例
2020/06/18 Python
Django中F函数的使用示例代码详解
2020/07/06 Python
Html5移动端适配IphoneX等机型的方法
2019/06/25 HTML / CSS
JAKO-O德国野酷台湾站:德国首屈一指的婴幼童用品品牌
2019/01/14 全球购物
房屋出售协议书
2014/04/10 职场文书
秋收起义观后感
2015/06/11 职场文书
创业计划书之游泳馆
2019/09/16 职场文书
浅谈JavaScript浅拷贝和深拷贝
2021/11/07 Javascript