【uni-app】腾讯地图选点

小程序实现地图选点
小程序前提配置appId和位置接口
在这里插入图片描述
需求效果图

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
代码

<template>
 	<view class="content">
		<view class="flexBox">
			<uni-text data-v-2ddb064c="" style="margin-right: 10upx;" class="lg text-gray cuIcon-search"><span></span></uni-text><input style="width: 90%;" type="text" placeholder="搜索地点" :value="searchKey" @input="search"/>
		<view class="" @click="closeCircle">
			<uni-text data-v-2ddb064c="" v-if="empty"  class="lg text-gray cuIcon-roundclose"><span></span></uni-text>
		</view>
		</view>
		<scroll-view scroll-y="true" class="option" v-show="IsOption">
			<view class='column_item' v-for='(item,index) in data' :key='index' @click="tapOption(item)" >
				{{item.title}}
				<view style="font-size: 12px;color: #ccc;">
					{{item.address}}
				</view>
			</view>
		</scroll-view>
 		<view v-show="!IsOption">
 			<view class="page-section page-section-gap">
 			  <map
 			    id="myMap"
 			    style="width: 100%; height: 280px;"
 			    :latitude="latitude"
 			    :longitude="longitude"
 			    :markers="markers"
 				 @poitap = "poitap"
 			    show-location
 			  ></map>
 			</view>
 		</view>
		<view v-show="!IsOption">
			<scroll-view scroll-y="" style="height: 700upx;"  @scrolltolower="moreMessage">
				<view class="" v-for="(item, index) in poitList">
					<view class="poitItem" @click="choosePoit(item,index)">
						<view class="poitDetil">
							<view class="title">
								{{item.title}}
							</view>
							<view class="address">
								{{item.address}}
							</view>
						</view>
						<view class="" v-if="choosePoitFlag == index">
							<uni-text data-v-2ddb064c="" style="color: #0081FF;font-size: 20px;" class="lg text-gray cuIcon-roundcheck"><span></span></uni-text>
						</view>
					</view>
				</view>
			</scroll-view>
		</view>
 	</view>
 </template>
 
 
 <script>
	 import QQMapWX  from '@/static/js/qqmap-wx-jssdk.js';
 	var self ,mapCtx
	var qqmapsdk
 	export default {
 		onLoad() {
 			self = this
 			// 获取当前map
 			mapCtx =  wx.createMapContext('myMap')
 			self.getAuthorizeInfo()
			 qqmapsdk = new QQMapWX({
							            key: 'BJSBZ-BJ6WJ-CPJFG-KJVTS-SDZU6-P4FHY'
							        });
 		},
 		//相关配置参数
 		data() {
 		
 		  return {
 			  // 初始化的中心位置
 				latitude: 23.099994,
 				longitude: 113.324520,
 				// 标记点
 				markers: [{
 							id: 1,
 							latitude: 23.099994,
 							longitude: 113.324520,
 							name: 'T.I.T 创意园'
 					    }],
			    poitList:[], // 周边地址
				choosePoitFlag: -1,
				data:[],
				IsOption:false,
				searchKey:"",
				empty:false,
				tapOpitItem:{},
				pageIndex:1
 		  }
 		
 		},
 		
 		methods:{
 			// 位置授权
 			 getAuthorizeInfo(){
 			              uni.authorize({
 			                  scope: 'scope.userLocation',
 			                  success() { // 允许授权
							  console.log("确定了")
 			                      self.getLocationInfo();
 			                  },
 			                  fail(){    // 拒绝授权
 			                      self.openConfirm();
 			                      console.log("你拒绝了授权,无法获得周边信息")
 			                  }
 			              })
 			          },
 			 // 获取当前地理位置
 			getLocationInfo(){  
 			              uni.getLocation({
 			                  type: 'wgs84',
 			                  success (res) {
 			                      console.log(res,"当前位置");
 								  // 移动到当前位置
 								 self.toLocation(res)
 								 self.latitude = res.latitude;
 								 self.longitude = res.longitude;
								 self.mapRange(res.latitude,res.longitude)
 			                  }
 			              });
 			          },
 			   // 再次获取授权
 			  // 当用户第一次拒绝后再次请求授权
 			openConfirm(){
 			              uni.showModal({
 			                  title: '请求授权当前位置',
 			                  content: '需要获取您的地理位置,请确认授权',
 			                  success: (res)=> {
 			                      if (res.confirm) {
 			                          uni.openSetting();// 打开地图权限设置
 			                      } else if (res.cancel) {
 			                          uni.showToast({
 			                              title: '你拒绝了授权,无法获得周边信息',
 			                              icon: 'none',
 			                              duration: 1000
 			                          })
 			                      }
 			                  }
 			              });
 			 },
			 // 点击地图位置改变中心位置
			 poitap: function(e){
			 	console.log(e,"poitap")
			 	var obj = e.detail
			 	self.toLocation(obj)
			 },
 			 toLocation:function(obj){
				 // self.choosePoitFlag = -1
				 // 改变地图中心位置
 			 	mapCtx.moveToLocation(obj)
				 // 查询中心点范围内的地址
				 self.mapRange(obj.latitude,obj.longitude)
 				// 移动标记点并添加动画效果
 			 	mapCtx.translateMarker({
 			 	  markerId: 1,
 			 	  autoRotate: true,
 			 	  duration: 100,
 			 	  destination: {
 			 	    latitude:obj.latitude,
 			 	    longitude:obj.longitude,
 			 	  },
 			 	  animationEnd() {
 			 	    console.log('animation end')
 			 	  }
 			 	})
 			 },
			// 查询地址范围
			 mapRange(latitude,longitude){
					let promise = new Promise(function(resolve, reject) {
					// 调用接口
						qqmapsdk.reverseGeocoder({
							location: {
								latitude: latitude,
								longitude: longitude
										},
							get_poi:1,
							poi_options: 'policy=2;radius=3000;page_size=20;page_index='+self.pageIndex,
							success: function (res) {
									if(res.result.pois){
										self.poitList = [...self.poitList,...res.result.pois]
										if(self.tapOpitItem){
											console.log(self.tapOpitItem)
										    console.log(self.poitList)
											self.poitList.map((poitTime,index)=>{
													if(poitTime.title == self.tapOpitItem.title){
														 console.log(index)
														self.choosePoitFlag = index
														}
											})	
										}
									}
									resolve(res)
							},
							 fail: function (res) {
									 reject(res)
							}
						});
					})
							return promise
			},
			// 选择列表地址
			choosePoit(item,index){
				console.log(index)
				self.choosePoitFlag = index
				let obj = {
					latitude: item.location.lat,
					longitude: item.location.lng
				}
				mapCtx.moveToLocation(obj)
				mapCtx.translateMarker({
				  markerId: 1,
				  autoRotate: true,
				  duration: 100,
				  destination: {
				    latitude:obj.latitude,
				    longitude:obj.longitude,
				  },
				})
			},
			//搜索地址
			search:  function(e){
				console.log(e)
				self.searchKey = e.detail.value
				if(self.searchKey){
					self.empty = true
					self.choosePoitFlag = -1
					self.poitList = []
					self.pageIndex = 1
				}else{
					self.empty = false
					self.IsOption = false
				    self.getLocationInfo();
					self.poitList = []
				}
				self.data = []
				var	location = self.latitude+","+ self.longitude
				 self.mapSearch(self.searchKey,location).then(res => {
							self.data = res.data
							if(self.searchKey && self.data.length){
								self.IsOption = true
							}else{
								self.IsOption = false
							}
							
				  		},error => {
							// self.$api.msg('请求失败')
							// console.log(error,"aaaaaaaaaaa");
					})
				
			},
			mapSearch(keyword,location){
				let promise = new Promise(function(resolve, reject) {
					// 调用接口
					      qqmapsdk.search({
								keyword: keyword,//搜索关键词
								location:location ,  //设置周边搜索中心点
					          success: function (res) {
					             resolve(res)
					          },
					          fail: function (res) {
					             reject(res)
					          }
					  });
				})
				return promise
				  
			},
 		    // 清空搜索框
			closeCircle(){
				self.data = []
				self.searchKey = ''
				self.empty = false
				self.IsOption = false
			    self.choosePoitFlag = -1
				self.poitList = []
				self.pageIndex = 1
				self.getLocationInfo();
			},
			// 选择搜索地址
			tapOption(item){
				console.log(item)
				self.tapOpitItem = item
				self.IsOption = false
				let obj = {
					latitude: item.location.lat,
					longitude: item.location.lng
				}
				self.toLocation(obj)
			},
			// 上拉加载
			moreMessage(){
						self.pageIndex += 1;
						self.mapRange(self.latitude,self.longitude);
					},
 		}
 	}
 </script>
 
 <style>
	 page{
		 background-color: #fff;
	 }
 	.page-section-gap{
 	  box-sizing: border-box;
 	  padding: 0 30rpx;
 	}
 	
 	.page-body-button {
 	  margin-bottom: 30rpx;
 	}
	.poitItem{
		display: flex;
		align-items: center;
		width: 100%;
	}
	.poitDetil{
		width: 90%;
		padding: 30upx;
	
	}
	.poitDetil .title{
		font-size: 18px;
	}
	.address{
		overflow: hidden;
		text-overflow: ellipsis;
		white-space: nowrap;
		font-size: 14px;
		color: #808080;
	}
	.flexBox{
			display: flex;
			align-items: center;
			background-color: #f4f4f4;
			padding: 10upx 20upx;
			border-radius: 50upx;
			margin: 30upx 20upx;
		}
		.iconPadding{
			padding-left: 20upx;
		}
		.citystyle{
			border-right: 2upx solid #ccc;
			padding-right: 20upx;
		}
		.close-btn{
			display: flex;
			justify-content: space-evenly;
			margin: 20upx;
			margin-top: 40upx;
			}
		.pop-box{
			margin-top: 30upx;
			font-size: 14px;
		}
		.pop-title{
			font-weight: 700;
			display: flex;
			justify-content: center;
			align-items: center;
		}
		.pop-detile{
			margin: 20upx;
		}
		.pop-input{
			display: flex;
			margin-top: 20upx;
		}
	.option{
		line-height: 45rpx;
		position: fixed;
		top: 128rpx;
		z-index: 9999;
	}
	.column_item{
		padding:10upx 40rpx;
		/* height: 60rpx; */
		overflow: hidden;
		margin:0rpx auto;
		background-color: #fff;
		text-overflow: ellipsis;
		white-space: nowrap;
		border-bottom: 2upx solid #ccc;
	}
	.column_item:active{
		background-color: #8F8F94;
	}
	
	.page-section-gap{
	  box-sizing: border-box;
	}
	.text-gray{
		font-size: 18px;
		}
 </style>

h5和浏览器实现地图选点**

看官网即可https://lbs.qq.com/webApi/component/componentGuide/componentPicker
需要在官网申请key值

<web-view src="https://apis.map.qq.com/tools/locpicker?search=1&type=1&key=你的key值&referer=myapp"></web-view>

监听点击地址返回的信息

// #ifdef H5
window.addEventListener('message', event=> {
  // 接收位置信息,用户选择确认位置点后选点组件会触发该事件,回传用户的位置信息
    var loc = event.data;
	if (loc && loc.module == 'locationPicker') {
        //防止其他应用也会向该页面post信息,需判断module是否为'locationPicker'
        console.log('location', loc);
	}
}, false);
// #endif
<think>好的,我现在需要帮助用户解决在UniApp中集成腾讯地图实现选点功能的问题。用户提到了教程或示例代码,所以我要先回忆之前提供的引用内容,看看有哪些相关信息可以整合。 首先,引用[1]和[3]提到了在H5中使用腾讯地图的配置步骤,包括申请密钥和配置manifest.json。引用[4]则具体说明了如何在微信小程序中加入地图选点插件,需要在manifest里添加插件代码和权限声明。虽然用户的问题可能主要针对小程序,但可能需要区分不同平台的处理方式。 接下来,用户需要的是选点功能的示例代码。根据引用[2]和[4],微信小程序的选点功能可以通过调用插件API,比如wx.chooseLocation。而对于H5,可能需要使用JavaScript API,但需要处理跨域等问题,不过用户可能更关注小程序的实现,因为选点功能在小程序中更常见。 需要确保步骤清晰,首先配置插件和权限,然后编写触发选点的方法,处理返回的位置数据,并在地图上显示标记。同时,要提醒用户替换自己的腾讯地图密钥,并注意不同平台的差异,比如H5可能需要不同的配置,但主要示例可能以小程序为主,因为引用中更多涉及小程序的部分。 另外,要检查是否有必要提到地图组件的使用,比如map组件的属性设置,以及markers的配置,这样用户选点后可以在地图上显示标记。同时,需要确保代码示例正确,比如在methods中定义chooseLocation方法,并在页面中放置按钮和map组件。 最后,考虑到用户可能需要常见问题的解答,比如密钥配置错误、插件无法使用、权限问题等,这些都需要在注意事项中提及。另外,跨平台兼容性也是需要注意的点,可能需要用户根据平台进行条件编译或不同的处理。</think>以下是在 UniApp 中集成腾讯地图选点功能的详细实现步骤和示例代码: ### 一、配置腾讯地图服务 1. **申请腾讯位置服务密钥** - 访问[腾讯位置服务控制台](https://lbs.qq.com/dev/console/application/mine)[^3] - 创建应用并获取`WebService Key`(H5)和`小程序Key`(微信平台) 2. **manifest.json 配置** ```json // 微信小程序配置 "mp-weixin": { "plugins": { "chooseLocation": { "version": "1.0.9", "provider": "wx76a9a06e5b4e693e" } }, "permission": { "scope.userLocation": { "desc": "需要获取您的位置信息用于位置选择" } } } ``` ### 二、选点功能核心代码 ```vue <template> <view> <button @click="chooseLocation">选择位置</button> <map id="myMap" :latitude="latitude" :longitude="longitude" :markers="markers" style="width: 100%; height: 400rpx;"> </map> </view> </template> <script> export default { data() { return { latitude: 39.90469, // 默认北京坐标 longitude: 116.40717, markers: [] } }, methods: { async chooseLocation() { // 微信小程序选点 const location = await uni.chooseLocation({ mapId: 'myMap', // 关联map组件 keyword: '地标名称' // 可选搜索关键词 }); if (location) { this.latitude = location.latitude this.longitude = location.longitude this.markers = [{ id: 1, latitude: location.latitude, longitude: location.longitude, iconPath: '/static/marker.png', width: 30, height: 30 }] } } } } </script> ``` ### 三、跨平台兼容方案 1. **条件编译处理** ```javascript // #ifdef H5 // H5使用JavaScript API import TMap from './utils/qqmap-wx-jssdk.min.js' const qqmapsdk = new TMap({ key: '您的WEB_KEY' }); // #endif // #ifdef MP-WEIXIN // 小程序直接使用插件API // #endif ``` ### 四、注意事项 1. **密钥配置验证** - 确保各平台密钥与申请的应用类型匹配 - 域名白名单需包含项目部署域名[^1] 2. **常见问题处理** - 定位失败:检查用户是否授权地理位置权限 - 地图不显示:确认map组件宽高设置有效 - 插件加载失败:检查manifest.json版本号是否为最新[^4] 3. **扩展功能建议** - 地址逆解析:通过`qqmapsdk.reverseGeocoder()` - 周边搜索:使用`qqmapsdk.search()` - 路线规划:调用`qqmapsdk.direction()`
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值