flinfo/dc-App/pages/index/newMap.vue
2025-03-01 10:26:49 +08:00

387 lines
12 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="container">
<view class="title">定位权限</view>
<button @click="jianchadingweiquanxian">申请定位权限</button>
<view class="title">定位功能</view>
<button @click="getOnceLocation">高德单次定位</button>
<button @click="startLocation">开始持续后台定位</button>
<button @click="stopLocation">结束持续后台定位</button>
<view class="title">地图功能</view>
<button @click="gotoMapView">进入地图页面</button>
<button @click="gotoChooseLocation">选择地址</button>
<view class='title'>离线地图-无需自己开发页面</view>
<button @click="gotoOffline">进入高德自带离线地图页面</button>
<view class='title'>离线地图-接口-用于自己后台管理</view>
<button @click="kexiazaiCities">获取支持离线地图的城市列表</button>
<button @click="xiazaiCity">下载某个城市</button>
<button @click="xiazaijinduCity">检查城市下载进度</button>
<button @click="xinbanbenCity">检查城市是否有新版本离线包</button>
<button @click="shanchuCity">删除某个已下载的城市</button>
<view class="title">导航功能</view>
<button @click="daohang">开始高德导航</button>
<view class="title">TTS功能</view>
<input class="voice-input" placeholder="播放文字" :value="ttsText" @input="inputTTSText" />
<button @click="readTTS">播放上面的文字</button>
<view class="title">搜索功能</view>
<button @click="searchRegeocode">搜索逆地理信息</button>
<button @click="searchPoiNearby">搜索附近的poi</button>
<button @click="searchPoiWithKeyword">根据关键字搜索poi</button>
<view class="title">其他功能</view>
<button @click="zuobiaozhuanhuan">坐标转换</button>
</view>
</template>
<script>
// import {
// amapPrivacyDidShow,
// amapUserDidAgreePrivacy,
// setAmapKey,
// getAmapLocation,
// startAmapLocation,
// stopAmapLocation,
// startAmapNavi,
// amapTTS,
// manageOfflineMap,
// checkAndRequestLocationPermission,
// searchAmapRegeocode,
// searchAmapPoisNearby,
// searchAmapPoisWithKeywords,
// addMarkerToAmapNavi, //注意:必须在导航页面弹出来之后调用才能生效。
// removeMarkerFromAmapNavi,
// removeAllMarkersFromAmapNavi,
// offlineMapCities,
// offlineMapDownloadCity,
// offlineMapCityDownloadPercent,
// offlineMapCityHasNewVersion,
// offlineMapDeleteCity,
// amapCoordFromOtherCoord
// } from '@/uni_modules/pow-amapall'
export default {
data() {
return {
ttsText: '我是文字转语音,支持英语,hello'
}
},
onReady() {
uni.setNavigationBarTitle({
title: '高德demo'
})
amapPrivacyDidShow()
amapUserDidAgreePrivacy()
setAmapKey('6e3f2dda4c289ea1ff974f125474fd36', '6c8e2e555ca97ab6fba1f23dd668d013') // 参数依次是ioskey、安卓key
},
methods: {
zuobiaozhuanhuan() {
//把其他坐标系的坐标,转成高德坐标
let from = 'baidu' // baidu、gps、mapbar、aliyun、google、sosomap、mapabc 只支持小写
let lat = 29.579084
let lon = 114.230751
let amapCoord = amapCoordFromOtherCoord(from, lat, lon)
uni.showToast({
title: `高德坐标:${JSON.stringify(amapCoord)}`,
icon: 'none',
})
},
shanchuCity() {
//把offlineMapCities获取到的城市的name传入
// 不加回调ios高德没给回调
offlineMapDeleteCity('合肥市')
},
xinbanbenCity() {
offlineMapCityHasNewVersion('合肥市', res => {
uni.showToast({
title: `是否有新版本:${JSON.stringify(res)}`,
icon: 'none',
duration: 1000,
mask: true,
})
})
},
xiazaiCity() {
//把offlineMapCities获取到的城市的name传入如果本地已经有了该城市就不会再次下载
offlineMapDownloadCity('合肥市')
},
xiazaijinduCity() {
// 0-1000表示未开始下载100表示下载完成-1表示没有这个城市
// 这个接口ios暂时不可用
offlineMapCityDownloadPercent('合肥市', res => {
let percent = res['percent']
uni.showToast({
title: `下载进度:${percent}`,
icon: 'none',
duration: 1000,
mask: true,
})
})
},
kexiazaiCities() {
offlineMapCities(res => {
let citiesArray = res['list']
let toastTitle = '支持下载的城市个数:' + citiesArray.length
uni.showToast({
title: toastTitle,
icon: 'none'
})
if (citiesArray.length == 0) return
let firstCity = citiesArray[0]
console.log(`某个城市:${JSON.stringify(firstCity)}`);
})
},
searchRegeocode() {
uni.showLoading()
searchAmapRegeocode(
31.96875, //纬度
118.798039, //经度
res => {
uni.hideLoading()
console.log('逆地理信息:', JSON.stringify(res))
uni.showToast({
title: `逆地理信息:${res.address}`,
icon: 'none',
})
})
},
searchPoiNearby() {
uni.showLoading()
searchAmapPoisNearby(
31.96875, //纬度
118.798039, //经度
1000, //搜索半径
res => {
uni.hideLoading()
console.log('附近的poi:', JSON.stringify(res))
uni.showToast({
title: `附近的poi:${res.pois.length}`,
icon: 'none',
})
})
},
searchPoiWithKeyword() {
uni.showLoading()
searchAmapPoisWithKeywords(
'餐厅', //关键字
'南京', //城市
res => {
uni.hideLoading()
console.log('关键字搜索poi:', JSON.stringify(res))
uni.showToast({
title: `关键字搜索poi:${res.pois.length}`,
icon: 'none',
})
})
},
jianchadingweiquanxian() {
checkAndRequestLocationPermission((res) => {
console.log(`请求权限结果:${JSON.stringify(res)}`)
uni.showToast({
title: `请求权限结果:${res.msg}`,
icon: 'none'
})
})
},
gotoOffline() {
manageOfflineMap()
},
gotoMapView() {
uni.navigateTo({
url: './mapview'
})
},
gotoChooseLocation() {
uni.navigateTo({
url: './chooseLocation',
events: {
chooseLocation: (res) => {
console.log('用户选择的地址:', JSON.stringify(res))
}
}
})
},
inputTTSText(e) {
console.log('输入了文字:', e.detail.value)
this.ttsText = e.detail.value
},
readTTS() {
if (this.ttsText == '') {
uni.showToast({
title: '输入播放文字',
icon: 'error'
})
return
}
amapTTS(this.ttsText)
},
getOnceLocation() {
uni.showLoading({
title: '获取定位',
mask: true
})
getAmapLocation({
needAddress: true, //是否需要返回位置描述文字信息此功能需要iOS和安卓的key在高德后台正确配置
accuracy: 200 //期望的定位误差,单位:米,一般填 5 、100、200 ,误差越大,定位速度越快,在安卓端:<=10 会传 Hight_Accuracy 给高德10到 100传 Device_Sensors100以上传 Battery_Saving
}, res => {
let log = `单次定位回调 ${JSON.stringify(res)}`
console.log(log)
uni.hideLoading()
uni.showToast({
title: log,
icon: 'none'
})
})
},
startLocation() {
startAmapLocation({
need_bg: true, //默认需要后台定位,插件内会实现高德的推荐方案,出现通知栏展示持续定位中。参考: https://lbs.Amap.com/faq/api?title=android-locsdk/guide/addition-func/android8-notice。如果不需要传入false即可
needAddress: true, //是否需要返回位置描述文字信息此功能需要iOS和安卓的key在高德后台正确配置
bg_title: '正在后台定位', //安卓机器后台定位时通知栏展示的文字,
interval: 2000 //定位周期单位毫秒不传的话默认2000ms
}, (res) => {
// res是回调结果拿到之后可以自己处理
let log = `定位回调 ${JSON.stringify(res)}`
console.log(log)
uni.showToast({
title: log,
icon: 'none'
})
})
},
stopLocation() {
stopAmapLocation()
},
daohang() {
let naviTypeOptions = [{
title: '驾车',
type: 'drive'
}, {
title: '骑行',
type: 'ride'
}, {
title: '步行',
type: 'walk'
}]
uni.showActionSheet({
title: '骑行方式',
itemList: naviTypeOptions.map(item => `${item.title}`),
success: (res) => {
let naviType = naviTypeOptions[res.tapIndex].type
startAmapNavi({
// --------------------必传参数----------------------
end: {
lon: 118.798039,
lat: 31.96875,
name: '南京南站',
poiId: 'B00190YPLY' //name和poiId可以不设置
},
// --------------------可选参数----------------------
startNaviDirectly: false, //是否跳过路径规划页面默认为false
naviType: naviType, //默认为'drive'
start: {
lon: 118.779613,
lat: 32.055085,
name: '南京大学鼓楼校区',
poiId: 'B00190B4AC'
},
//只有驾车导航支持途径点,骑行和步行不支持途径点
via: [{
poiId: "B001905HYA",
name: "南京站",
lon: 118.797499,
lat: 32.087104
}],
//货车导航设置车辆参数即可
carInfo: {
plateNumber: '京N66Y66', //车牌号
type: '1', //0:燃油客车; 1:燃油货车; 2:纯电动客车; 3:纯电动货车; 4:插电式混动客车; 5:插电式混动货车; 11:摩托车. 默认0(小车). 注意:只有设置了货车, 其他关于货车的属性设置才会生效
size: '4', //设置货车的大小1-微型货车 2-轻型/小型货车 3-中型货车 4-重型货车默认为2
width: '2.5', //设置货车的最大宽度单位mCarType = 1时候生效取值[0-25.5]默认2.5米
height: '3.5', //设置货车的高度单位mCarType = 1时候生效取值[0-25.5],默认1.6米
length: '7.3', //设置货车的最大长度单位mCarType = 1时候生效取值[0-25]默认6米
load: '0', //设置货车的总重,即车重+核定载重单位mCarType = 1时候生效取值[0-6553.5]
weight: '2.5', //设置货车的核定载重单位mCarType = 1时候生效取值[0-6553.5]
axies: '2', //设置货车的轴数mCarType = 1时候生效取值[0-255]默认为2
restriction: true, //设置是否躲避车辆限行true代表躲避车辆限行false代表不躲避车辆限行,默认为true
loadSwitch: true //设置货车重量是否参与算路true-重量会参与算路false-重量不会参与算路。默认为false
}
}, (res) => {
// res是回调结果拿到之后可以自己处理
let log = `导航回调 ${JSON.stringify(res)}`
console.log(log)
uni.showToast({
title: log,
icon: 'none'
})
})
// 演示在导航底图上添加 marker 的功能(该方法可用,只是demo中暂时注释掉了)
// setTimeout(() => {
// let markers = [{
// id: 'uuid111', //marker的唯一id不能重复
// lat: 32.07634127,
// lng: 118.77755662,
// title: '天安门',
// icon: 'https://s11.ax1x.com/2023/03/17/ppGtKhD.png', //目前只支持网络图片,免费生成网络图片的地址 imgse.com
// iconWidth: 60,
// iconHeight: 60, //单位 px , iconWidth和iconHeight成对传否则不生效
// zIndex: 1
// }]
// addMarkerToAmapNavi(JSON.stringify(markers))
// }, 3000)
// 演示在导航底图上添加 marker 的功能(该方法可用,只是demo中暂时注释掉了)
// setTimeout(()=>{
// let markerIds = ['uuid111']
// removeMarkerFromAmapNavi(JSON.stringify(markerIds))
// // removeAllMarkersFromAmapNavi()
// }, 10000)
}
})
}
}
}
</script>
<style>
page {
width: 100%;
height: 100%;
background-color: white;
}
.container {
width: 100%;
background-color: white;
padding-bottom: 20rpx;
}
button {
margin: 10px 10px 0 10px;
}
.voice-input {
border-radius: 4px;
border: 1px solid #ccc;
margin-top: 10px;
margin-left: 10px;
margin-right: 10px;
padding: 5px;
}
.title {
margin-top: 20px;
margin-left: 10px;
font-size: 20px;
font-weight: bold;
}
</style>