uniapp下各端调用三方地图导航

技术栈

  • 开发框架: uniapp
  • vue 版本: 2.x

需求

使用uniappapp端(Android,IOS)中显示宿主机已有的三方导航应用,由用户自主选择使用哪家地图软件进行导航,选择后,自动将目标地址设为终点在导航页面。 使用uniapp微信小程序中调用微信内置地图导航。

https://juejin.cn/post/7262941534528700453

https://blog.zhanghaoran.ren/article/html/uniappXiaGeDuanDiaoYongSanFangDiTuDaoHang.html

实现

微信小程序调用微信内置地图导航

使用uni.openLocation()方法可直接调用,微信比较简单

uni文档:https://uniapp.dcloud.net.cn/api/location/open-location.html

传值字段

名称说明是否必传
latitude纬度,范围为-90~90,负数表示南纬,使用 gcj02 国测局坐标系
longitude经度,范围为-180~180,负数表示西经,使用 gcj02 国测局坐标系
name位置名称非必传,但不传不显示目标地址名称
address地址的详细说明非必传,但不传不显示目标地址名称详情

具体代码

经纬度需转为float数据类型

uni.openLocation({
    latitude: parseFloat('地址纬度'),
    longitude: parseFloat('地址经度'),
    name: ‘地址名称,
    address: '地址详情',
    success: function (res) {
        console.log('打开系统位置地图成功')
    },
    fail: function (error) {
        console.log(error)
    }
})

app端调用宿主机三方地图导航

步骤:

  1. 获取宿主机已安装的三方地图应用并显示,没有安装提示宿主机。
  2. 根据宿主机选择的三方地图,打开对应的三方地图进行导航。

使用plus调用原生API知识点:

  1. 获取宿主机系统环境

uniapp文档:https://uniapp.dcloud.net.cn/api/system/info.html#getsysteminfo

使用uniappuni.getSystemInfoSync().platform方法获取宿主机系统环境,结果为androidios

  1. 获取宿主机是否安装某个应用

H5产业联盟文档:https://www.html5plus.org/doc/zh_cn/runtime.html#plus.runtime.isApplicationExist

使用H5产业联盟中的 plus.runtime.isApplicationExist来判断宿主机是否安装指定应用,已安装返回True

Android平台需要通过设置appInf的pname属性(包名)进行查询。 iOS平台需要通过设置appInf的action属性(Scheme)进行查询,在iOS9以后需要添加白名单才可查询,在manifest.json文件plus->distribute->apple->urlschemewhitelist节点下添加(如urlschemewhitelist:["weixin"])。

调用示例

// Android
plus.runtime.isApplicationExist({pname: 'com.autonavi.minimap'})
// iOS
plus.runtime.isApplicationExist({action: 'iosamap://'})
  1. 调用系统级选择菜单显示已安装地图列表

H5产业联盟文档:https://www.html5plus.org/doc/zh_cn/nativeui.html#plus.nativeUI.actionSheet

调用示例

plus.nativeUI.actionSheet({ //选择菜单
    title: "选择地图应用",
    cancel: "取消",
    buttons: [
        {title: '1'},
        {title: '2'}
    ]
}, function (e) {
    console.log("您点击的是第几个:"+e.index)
})

  1. 打开三方某个应用

H5产业联盟文档:https://www.html5plus.org/doc/zh_cn/runtime.html#plus.runtime.openURL

调用示例

 
// Android
plus.runtime.openURL('三方应用地址', function(res){
    // todo...
}, 'com.xxx.xxxapp');

// ios
plus.runtime.openURL('三方应用地址', function(res){
    // todo...
});
具体代码:
 
<template>
    <view @click.stop="handleNavigation">导航</view>
</template>

<script>
    ...
    data() {
        return {
            // 目标纬度
            latitude: '',
            // 目标经度
            longitude: '',
            // 目标地址名称
            name: '',
            // 目标地址详细信息
            address: '',
            // 我自己的位置经纬度(百度地图需要传入自己的经纬度进行导航)
            selfLocation: {
                latitude: '',
                longitude: ''
            }
        }
    },
    methods: {
        handleNavigation() {
            const _this = this
            if (!this.latitude || !this.longitude || !this.name) return
            // 微信
            // #ifdef MP-WEIXIN
            let _obj = {
                latitude: parseFloat(this.latitude),
                longitude: parseFloat(this.longitude),
                name: this.name,
            }
            if (this.address) {
                _obj['address'] = this.address
            }
            uni.openLocation({
                ..._obj,
                success: function (res) {
                console.log('打开系统位置地图成功')
                },
                fail: function (error) {
                console.log(error)
                }
            })
            // #endif

            // #ifdef APP-PLUS
            // 判断系统安装的地图应用有哪些, 并生成菜单按钮
            let _mapName = [
                {title: '高德地图', name: 'amap', androidName: 'com.autonavi.minimap', iosName: 'iosamap://'},
                {title: '百度地图', name: 'baidumap', androidName: 'com.baidu.BaiduMap', iosName: 'baidumap://'},
                {title: '腾讯地图', name: 'qqmap', androidName: 'com.tencent.map', iosName: 'qqmap://'},
            ]
            // 根据真机有的地图软件 生成的 操作菜单
            let buttons = []
            let platform = uni.getSystemInfoSync().platform
            platform === 'android' && _mapName.forEach(item => {
                if (plus.runtime.isApplicationExist({pname: item.androidName})) {
                    buttons.push(item)
                }
            })
            platform === 'ios' && _mapName.forEach(item => {
                console.log(item.iosName)
                if (plus.runtime.isApplicationExist({action: item.iosName})) {
                    buttons.push(item)
                }
            })
            if (buttons.length) {
                plus.nativeUI.actionSheet({ //选择菜单
                title: "选择地图应用",
                cancel: "取消",
                buttons: buttons
                }, function (e) {
                    let _map = buttons[e.index - 1]
                    _this.openURL(_map, platform)
                })
            } else {
                uni.showToast({
                    title: '请安装地图软件',
                    icon: 'none'
                })
                return
            }
            // #endif
        },

        // 打开第三方程序实际应用
        openURL(map, platform) {
        let _defaultUrl = {
            android: {
            "amap": `amapuri://route/plan/?sid=&did=&dlat=${this.latitude}&dlon=${this.longitude}&dname=${this.name}&dev=0&t=0`,
            'qqmap': `qqmap://map/routeplan?type=drive&to=${this.name}&tocoord=${this.latitude},${this.longitude}&referer=fuxishan_uni_client`,
            'baidumap': `baidumap://map/direction?origin=${this.selfLocation.latitude},${this.selfLocation.longitude}&destination=name:${this.name}|latlng:${this.latitude},${this.longitude}&coord_type=wgs84&mode=driving&src=andr.baidu.openAPIdemo"`
            },
            ios: {
            "amap": `iosamap://path?sourceApplication=fuxishan_uni_client&dlat=${this.latitude}&dlon=${this.longitude}&dname=${this.name}&dev=0&t=0`,
            'qqmap': `qqmap://map/routeplan?type=drive&to=${this.name}&tocoord=${this.latitude},${this.longitude}&referer=fuxishan_uni_client`,
            'baidumap': `baidumap://map/direction?origin=${this.selfLocation.latitude},${this.selfLocation.longitude}&destination=name:${this.name}|latlng:${this.latitude},${this.longitude}&mode=driving&src=ios.baidu.openAPIdemo`
            }
        }
        let newurl = encodeURI(_defaultUrl[platform][map.name]);
        console.log(newurl)
        plus.runtime.openURL( newurl, function(res){
            console.log(res)
            uni.showModal({
            content: res.message
            })
        }, map.androidName ? map.androidName : '');
        }

    }
</script>

最终效果图

  1. 微信

微信地图.jpg

  1. app端

    https://blog.zhanghaoran.ren/image/1691035758346Screenshot_2023-08-03-12-08-23-298_com.zzrb.fuxishanapp.jpg

最后

参考链接: H5产业联盟:HTML5+ API Reference

                   uniapp: https://uniapp.dcloud.net.cn/api/

百度、高德、腾讯地图,三方APP调用其的文档。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/322320.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

宋仕强论道之华强北的“熵增”定律(四十二)

熵增”是热力学第二定律概念&#xff0c;描述了关于生命体的能量耗散的问题&#xff0c;即当一个封闭系统内没有新的能量输入时&#xff0c;就会逐渐失能无序发展至混乱直至混沌状态,后面我还会讲到“华强北的焓值”。华强北目前的情况就是“熵增”现象非常严重&#xff0c;人流…

SpringBoot---CRUD测试案例:

1. 概述 本次案例模拟公司后端人员开发场景&#xff1a; 当前案例的前端工程&#xff0c;前端人员已经帮我们开发好了&#xff0c;我们只需要关注服务端接口的开发。 1.1 页面原型 产品经理绘制的的页面原型的展示效果&#xff1a; 成品展示&#xff1a;完成部门管理和员工…

曲线生成 | 图解贝塞尔曲线生成原理(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 贝塞尔曲线的应用2 图解贝塞尔曲线3 贝塞尔曲线的性质4 算法仿真4.1 ROS C仿真4.2 Python仿真4.3 Matlab仿真 0 专栏介绍 &#x1f525;附C/Python/Matlab全套代码&#x1f525;课程设计、毕业设计、创新竞赛必备&#xff01;详细介绍全局规划(图搜索、采样法…

CAN工具 - ValueCAN3 - 基础介绍

关注菲益科公众号—>对话窗口发送 “CANoe ”或“INCA”&#xff0c;即可获得canoe入门到精通电子书和INCA软件安装包&#xff08;不带授权码&#xff09;下载地址。 CAN/CANFD通讯广泛存在于整个车载网络中&#xff0c;几乎每一块软硬件的开发都需要用到CAN工具&#xff0c…

iOS UIViewContentMode 不同效果图文对比

一. iOS提供了的ContentMode有如下几种 其中默认mode是UIViewContentModeScaleToFill typedef NS_ENUM(NSInteger, UIViewContentMode) {UIViewContentModeScaleToFill,UIViewContentModeScaleAspectFit, // contents scaled to fit with fixed aspect. remainder is tr…

leetcode第365题:水壶问题

有两个水壶&#xff0c;容量分别为 jug1Capacity 和 jug2Capacity 升。水的供应是无限的。确定是否有可能使用这两个壶准确得到 targetCapacity 升。 如果可以得到 targetCapacity 升水&#xff0c;最后请用以上水壶中的一或两个来盛放取得的 targetCapacity 升水。 你可以&a…

使用composer构建软件包时文件(夹)权限设置

在构建软件包的时候你可能会需要对包源内文件或文件夹的权限做出相应的调整&#xff0c;以确保软件包在部署到客户端后可以正常运行。在此之前我们先来了解一下Apple文件系统内文件或文件夹的权限设定。 常见的文件或文件夹会有Owner, Group, Everyone这三种类型的所有权&#…

C++力扣题目108--有序数组转换为二叉平衡搜索树

给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输…

数据结构学习 数位dp

关键词&#xff1a;数位dp 记忆化搜索 dfs 数位dp属于比较难的题目&#xff0c;所有数位dp在leetcode都是hard。 因为没有做出jz43.里面用到了数位dp&#xff0c;所以去学习了一下&#xff0c;学习看了这位大神的基础知识。 题目基本上是跟着这位灵大哥的题单做的。 学完数…

Hive分区表实战 - 多分区字段

文章目录 一、实战概述二、实战步骤&#xff08;一&#xff09;创建学校数据库&#xff08;二&#xff09;创建省市分区的大学表&#xff08;三&#xff09;在本地创建数据文件1、创建四川成都学校数据文件2、创建四川泸州学校数据文件3、创建江苏南京学校数据文件4、创建江苏苏…

ubuntu打开epub格式的文件

Koodo Reader 是一个开源免费的电子书阅读器&#xff0c;支持多达15种主流电子书格式&#xff0c; 内置笔记、高亮、翻译功能&#xff0c;助力高效书籍阅读和学习。 官网地址 拖拽到此处即可添加图书 支持滚轮和点击翻页 菜单在这里 可以记笔记 查看笔记

大数据开发之Hive(压缩和存储)

第 9 章&#xff1a;压缩和存储 Hive不会强制要求将数据转换成特定的格式才能使用。利用Hadoop的InputFormat API可以从不同数据源读取数据&#xff0c;使用OutputFormat API可以将数据写成不同的格式输出。 对数据进行压缩虽然会增加额外的CPU开销&#xff0c;但是会节约客观…

CTFhub-phpinfo

CTFhub-Web-信息泄露-“phpinfo” 题目信息 解题过程 ctrlF搜索关键字…

【Linux驱动】设备树中指定中断 | 驱动中获得中断 | 按键中断实验

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《Linux驱动》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f3c0;在设备树中指定中断&#x1f3c0;代码中获得中断&#x1f3c0;按键中断⚽驱动…

Python教程79:关于海龟画图,Turtle模块需要学习的知识点

1.海龟画图的基本步骤&#xff1a;A-B-C-D-E-F A.导入turtle模块&#xff1a;首先需要导入Python中的turtle模块&#xff0c;该模块提供了海龟绘图所需的基本函数和属性。 import turtle as tB.设置画布大小 使用turtle.screensize()函数。该函数可以设置画布的宽度高度背景…

中小企业如何做好信息化规划?

中小企业需不需要做信息化规划&#xff1f;什么时候做信息化规划比较好&#xff1f; 企业的信息化规划&#xff0c;一定是越早越好&#xff0c;越快越好。 因为信息化是一个过程&#xff0c;不是一个结果&#xff0c;它不是一天完成的事情&#xff0c;而是贯穿着企业经营管理…

FPGA引脚 Bank认知--FPGA 选型的一些常识

关键字 HP I/O Banks, High performance The HP I/O banks are deisgned to meet the performance requirements of high-speed memory and other chip-to-chip interface with voltages up to 1.8V. HR I/O Banks, High Range The HR I/O banks are designed to support a wid…

用python提取PDF中各类文本内容的方法

从PDF文档中提取信息&#xff0c;是很多类似RAG这样的应用第一步要处理的事情&#xff0c;这里需要做好三件事&#xff1a; 提取出来的文本要保持信息完整性&#xff0c;也就是准确性提出的结果需要有附加信息&#xff0c;也就是要保存元数据提取过程要完成自动化&#xff0c;…

FPGA四选一的多路选择器(用三元运算符?:解决)

一. 三元运算符? :用法 ?:符号通常用于条件运算符&#xff0c;表示条件判断。它类似于C语言中的三元运算符&#xff0c;用于根据条件选择不同的操作或值。 例如&#xff0c;在Verilog中&#xff0c;条件运算符?:可以用于if-else语句的简写形式。它的一般语法格式如下&#x…

市场复盘总结 20240113

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 昨日主题投资 连板进级率 100% 二进三&#xff1a; 进级率低 14% 最常用的二种方法&#xff1a; 方法一&a…
最新文章