在微信h5/浏览器上,使用百度地图定位,获取经纬度,再根据经纬度导航(高德/百度/腾讯)

<template>
	<div class="conter">
		<!-- <button @click="addbaidu">添加信息</button> -->
		<div id="map" class="map" style="" />
		<!-- {{form}} -->

		<view class="but_box">
			<view class="" style="margin-bottom: 20rpx;">
				<u-search @search="searchMap" @custom="searchMap" placeholder="输入要搜索的目的地" v-model="keyword"></u-search>
			</view>
			<view class="text">
				<!-- {{form.building}} -->
				<view class="" v-if="form.building">
					<view class="" style="font-weight: 600;margin-bottom: 6rpx;">
						{{form.building.split(",")[0]}}
					</view>
					<view class="">
						{{form.building.split(",")[1]}}
					</view>
				</view>
				<!-- <view class="" v-else style="color: #666;">
					选择位置
				</view> -->
			</view>
			<!-- {{form}} -->
			<view class="but_b" v-if="form.building">
				<!-- <u-button shape="circle" class="but_add" @click="no" text="导肮" color=""></u-button> -->
				<u-button type="success" plain shape="circle" class="but_add" @click="gogogo" text="导肮"
					color=""></u-button>
				<!-- color="#96C446" -->
				<u-button type="success" v-if="!state" shape="circle" class="but_add" @click="ok" text="确定"></u-button>
			</view>
		</view>
		<u-popup mode="bottom" :round="20" :show="selectMapShow" @close="closePop" @open="openPop">
			<view class="popup_con">
				<!-- <h1>选择</h1> -->
				<!--  ( 推荐 ) -->
				<u-button class="select_b" @click="goToApp('baidu')" text="百度地图" color=""></u-button>
				<u-button class="select_b" @click="goToApp('tencent')" text="腾讯地图" color=""></u-button>
				<u-button class="select_b" @click="goToApp('gaode')" text="高德地图" color=""></u-button>
				<u-button class="select_but" @click="selectMapShow = false" text="取消" color=""></u-button>

			</view>
		</u-popup>

	</div>
	<!-- <script type="text/javascript" src="//api.map.baidu.com/getscript?type=webgl&v=1.0&ak=你的密钥">
    </script> -->
</template>
<script type="text/javascript" src="//api.map.baidu.com/getscript?type=webgl&v=1.0&ak=你的密钥">
</script>

<script>
	// 引入第三方工具包
	export default {
		name: 'BaiDus',
		data() {
			return {
				local: null,
				keyword: '',
				myPlace: {
					longitude: "",
					latitude: "",
				},
				selectMapShow: false,
				// 地图实例
				map: null,
				// Marker实例
				mk: null,
				// 定时器
				initMapeq: null,
				// 表单开关
				dialogVisible: false,
				// 表单
				form: {
					latitude: '',
					longitude: '',
					building: ''
				},
				event: {},
				state: 0
			}
		},
		created() {},
		mounted() {
			// 页面加载完之后,加载百度地图
			// 加载引入BMapGL
			this.initMap()
			this.setNavigationBarTitle()
		},
		onLoad(event) {
			console.log('event');
			console.log(event);
			// this.event = event
			this.form.longitude = event.longitude
			this.form.latitude = event.latitude
			this.form.building = event.building
			this.state = event.state
		},
		methods: {
			searchMap() {
				console.log('keyword');
				console.log(this.keyword);
				this.local.search(this.keyword);
			},
			// 百度转腾讯或高德
			BaiduMapTransTxMap(lng, lat) {
				let x_pi = (3.14159265358979324 * 3000.0) / 180.0;
				let x = lng - 0.0065;
				let y = lat - 0.006;
				let z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
				let theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
				let lngs = z * Math.cos(theta);
				let lats = z * Math.sin(theta);
				return {
					longitudeTr: lngs,
					latitudeTr: lats
				};
			},
			openPop() {},
			goToApp(type) {
				const longitude = this.form.longitude // 百度的经纬度
				const latitude = this.form.latitude // 百度的经纬度
				const {
					longitudeTr,
					latitudeTr
				} = this.BaiduMapTransTxMap(longitude, latitude)
				// console.log('经纬度');
				// console.log(longitude, latitude);
				// console.log('转换后的');
				// console.log(longitudeTr, latitudeTr);
				// return
				const myLongitude = this.myPlace.longitude
				const myLatitude = this.myPlace.latitude
				const placeOne = this.form.building.split(",")[0]
				const placeTwo = this.form.building.split(",")[1]
				let url = '';
				const gaodeUrl =
					`https://uri.amap.com/marker?position=${longitudeTr},${latitudeTr}&name=${ placeTwo || placeOne}`;
				const baiduUrl =
					`http://api.map.baidu.com/marker?location=${latitude},${longitude}&title=${placeTwo || placeOne}&content=${placeOne}&output=html&src=webapp.baidu.openAPIdemo`;
				const tencentUrl =
					// `https://apis.map.qq.com/uri/v1/routeplan?type=bus&from=&fromcoord=39.980683,116.302&to=${placeTwo || placeOne}&tocoord=${latitude},${longitude}&policy=1&referer=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77`;
					`https://apis.map.qq.com/uri/v1/routeplan?type=bus&from我的位置=&fromcoord=${myLatitude},${myLongitude}&to=${placeTwo || placeOne}&tocoord=${latitudeTr},${longitudeTr}&policy=1&referer=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77`;

				// 根据选择的地图类型设置URL
				if (type === 'gaode') {
					url = gaodeUrl;
				} else if (type === 'baidu') {
					url = baiduUrl;
				} else if (type === 'tencent') {
					url = tencentUrl;
				}

				// 打开链接
				if (url) {
					window.open(url, '_blank');
					this.selectMapShow = false
				} else {
					console.error('地图类型错误');
				}
			},
			gogogo() {
				this.selectMapShow = true
			},
			setNavigationBarTitle() {
				uni.setNavigationBarTitle({
					title: '地图' // 设置导航栏的标题
				});
				document.title = '城乡环境建设';
			},
			on() {
				uni.navigateBack();
			},
			ok() {
				if (this.state != 1) {
					// 触发自定义事件,并返回上一页
					console.log('111');
					console.log(this.state);
					uni.$emit('refreshPreviousPage', this.form);
				}
				//返回上一页
				uni.navigateBack();

			},
			close() {
				// this.form = {};
			},
			// 添加开关
			addbaidu() {
				// debugger
				// 打开表单
				// this.dialogVisible = true
				// 加载地图
				this.getbaidu()
				// this.initMap();
			},
			// 加载地图方法
			getbaidu() {
				this.showDialog = true
				this.initMapeq = setInterval(() => {
					if (this.initMap()) {
						clearInterval(this.initMapeq)
					}
				})
			},
			// 百度地图封装方法
			// 初始化地图
			initMap() {
				//  var map = new BMapGLGL.Map('map');
				// map.centerAndZoom(new BMapGLGL.Point(116.331398,39.897445), 13);
				try {
					// console.log(123)
					var that = this
					// 1、挂载地图
					// 创建地图实例
					this.map = new BMapGL.Map('map')
					var geolocation = new BMapGL.Geolocation()

					// 开启SDK辅助定位
					geolocation.enableSDKLocation()
					geolocation.getCurrentPosition(function(res) {
						console.log('辅助定位')
						console.log(res)
						if (res) {
							that.myPlace.longitude = res.point.lng
							that.myPlace.latitude = res.point.lat
							if (that.form.longitude) return
							that.form.longitude = res.point.lng
							that.form.latitude = res.point.lat
							that.map.centerAndZoom(res.point, 14)
							that.getAddrByPoint(res.point)
							console.log(that.form)
						}
					})
					// 设置中心经纬度  这里我们使用BMapGLGL命名空间下的Point类来创建一个坐标点。Point类描述了一个地理坐标点,其中120.872845表示经度,32.021089表示纬度。(为南通濠河风景区坐标) 作者:星银色飞行船
					console.log(this.form)
					var point = new BMapGL.Point(
						this.form.longitude || 116.41338729034514,
						this.form.latitude || 39.910923647957596
					)
					// 3.在创建地图实例后,我们需要对其进行初始化,BMapGLGL.Map.centerAndZoom()方法要求设置中心点坐标和地图级别。 地图必须经过初始化才可以执行其他操作
					this.map.centerAndZoom(point, 14)
					// 滚轮缩放
					this.map.enableScrollWheelZoom()
					// // 3、设置图像标注并绑定拖拽标注结束后事件
					this.mk = new BMapGL.Marker(point, {
						enableDragging: true
					})
					this.map.addOverlay(this.mk)
					this.local = new window.BMapGL.LocalSearch(this.map, {
						renderOptions: {
							map: this.map
						}
					})
				} catch (err) {
					return false
				}
				// 4、添加(右上角)平移缩放控件
				// this.map.addControl(
				//   new BMapGL.NavigationControl({
				//     anchor: BMapGL_ANCHOR_TOP_RIGHT,
				//     type: BMapGL_NAVIGATION_CONTROL_SMALL
				//   })
				// )
				// 7、绑定点击地图任意点事件
				var that = this
				this.map.addEventListener('click', function(e) {
					// console.log('e');
					// console.log(e);
					// that.form.longitude = e.latlng.lng;
					// that.form.latitude = e.latlng.lat;
					// var geoc = new BMapGL.Geocoder();
					// var pt = e.latlng;
					// that.mk.setPosition(e.latlng);
					// geoc.getLocation(pt, function (rs) {
					//   var addComp = rs.addressComponents;
					//   console.log("点击了", addComp);
					//   that.form.building =
					//     addComp.city +
					//     addComp.district +
					//     addComp.street +
					//     addComp.streetNumber;
					//   console.log(that.form);
					// });
					that.getAddrByPoint(e.latlng)
				})
				return true
			},
			// 2、逆地址解析函数 根据坐标点获取详细地址  point   百度地图坐标点,必传
			getAddrByPoint(point) {
				var that = this
				var geco = new BMapGL.Geocoder()
				geco.getLocation(point, function(res) {
					console.log('res')
					console.log(res)
					// that.mk.setPosition(point);
					// that.map.panTo(point);
					that.mk.setPosition(res.point)
					that.form.building = res.address + res.content.poi_desc
					that.form.longitude = res.point.lng
					that.form.latitude = res.point.lat
				})
			},
			// 8-1、地址搜索
			blur() {
				// 根据状态码
				// console.log(this.map);
				// var options = {
				//   onSearchComplete: function (res) {
				//     var s = [];
				//     if (local.getStatus() == "BMapGL_STATUS_SUCCESS") {
				//       for (var i = 0; i < res.getCurrentNumPois(); i++) {
				//         s.push(res.getPoi(i));
				//       }
				//       cb(s);
				//     } else {
				//       cb(s);
				//     }
				//   },
				// };
				// var local = new BMapGL.LocalSearch(this.map, options);
				// console.log(local)
				// local.search(str);
				// cb(this.keyword)

				this.local.search(this.form.building)
			},
			// 8-2、选择地址
			handleSelect(item) {
				this.form.building = item.address + item.title
				console.log(item)
				this.form.longitude = item.point.lng
				this.form.latitude = item.point.lat
				console.log('lng', item.point.lng)
				console.log('lat', item.point.lat)
				this.map.clearOverlays()
				this.mk = new BMapGL.Marker(item.point)
				this.map.addOverlay(this.mk)
				this.map.panTo(item.point)
			}
		}
	}
</script>
<style lang="scss" scoped>
	.conter {
		position: relative;
		height: calc(100vh - 80rpx)
	}

	.but_box {
		padding: 22px 16px 16px 16px;
		border-top-left-radius: 20px;
		/* 左上角圆角 */
		border-top-right-radius: 20px;
		/* 右上角圆角 */
		background-color: #fff;
		width: 100%;
		// height: 150rpx;
		position: absolute;
		z-index: 9999;
		bottom: 0px;

		.text {
			// min-height: 50px;
			margin-bottom: 10rpx;
		}

		.but_b {
			display: flex;
			justify-content: end;

			.but_add {
				margin: 0 6PX;
				// margin-top: 30rpx;
				width: 180rpx;
				height: 68rpx;
				font-size: 36rpx;
			}
		}
	}

	.map {
		width: 100%;
		height: calc(100vh - 88rpx)
	}

	.popup_con {
		height: 420rpx;
		width: 100%;
		// margin-top: 20px;
	}

	.select_b {}



	::v-deep .select_b {
		height: 100rpx;
		border: none;
		background-color: rgba(255, 255, 255, 0);
		border-bottom: 1rpx solid #eee;
		/* 底部边框为2px的黑色实线 */
	}

	::v-deep .select_but {
		height: 100rpx;
		border: none;
		background-color: rgba(255, 255, 255, 0);
		border-top: 10rpx solid #fafafa;
	}

	::v-deep .u-popup__content {
		border-radius: 20rpx 20rpx 0 0;
	}
</style>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值