uniapp app端使用谷歌地图选点定位

news2024/10/5 2:13:45

国内需要vpn 和申请谷歌地图的Maps JavaScript API 类型的 key,指引链接这里不详细介绍

一 、我们得通过webview 跳转谷歌地图 ,需要创建一个webview页面,里面跳转承载谷歌地图的html页面,如果是放在本地的话 html文件须遵守规范 放在 “项目根目录下->hybrid->html->google-map.html” 或static目录下
image.png

//跳转谷歌地图前页面,比如选择地址 
<template>
	<view @click="onSkip('/pages/mapWeb')">
		即将前往选择地址
	</view>
</template>
<script>
	export default {
		data() {
			return {}
		},
		onLoad(e) {
			//接收webview传值,能拿到经纬度 详细地址等信息
			uni.$on('googleMsg', (data) => {
				console.log('接收到值,继续业务处理', data)
			});
		},
		methods: {
			//跳转webview
			onSkip(url) {
				uni.navigateTo({
					url: url
				})
			},
		}
	}
</script>
//webview 页面  ,如果谷歌地图不是放本地 src 放线上路径即可
<template>
	<view>
		<web-view style="width: 100vw;height: 100vh;" src="../hybrid/html/google-map.html"
			@message="postMessageFun"></web-view>
	</view>
</template>

<script>
	export default {
		data() {
			return {	}
		},
		methods: {
//监听html返回的数据
			postMessageFun(e) {
				console.log(e.detail.data[0], "77777")
			uni.$emit("googleMsg", e.detail.data[0])
			}
		}
	}
</script>
//google-map.html 页面
<!DOCTYPE html>
<html style="width: 100vw;height: 100vh;">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<script src="https://maps.googleapis.com/maps/api/js?key=你的谷歌地图key&sensor=false">
		</script>
     //引入uniapp webview才能接收到数据 监听到事件
		<script type="text/javascript" src="https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.2.js">
		</script>
		<script>
			function onBack(data) {
				var timer = setInterval(function() {
					if (window.uni) {
						clearInterval(timer);
						uni.postMessage({
								data: data
							}),
							console.log("谷歌地图返回:",data)
							uni.navigateBack()
					}
				}, 10)

			}
			// 谷歌地址解析
			function reverseGeocode(lat, lng) {
				var geocoder = new google.maps.Geocoder();
				var latlng = new google.maps.LatLng(lat, lng);
				// 调用地理编码服务的geocode方法
				geocoder.geocode({
					'location': latlng
				}, (results, status) => {
					if (status === 'OK') {
						if (results[0]) {
							const obj = {
								address: results[0].formatted_address,
								lat: lat,
								lng: lng
							}
							console.log(results)
							// console.log('地址:', obj);
							onBack(obj)
						} else {
							console.log('未找到地址');
						}
					} else {
						console.log('逆地理编码失败:' + status);
					}
				});
			}

			function get() {
				function success(position) {
					console.log(position)
					var latitude = position.coords.latitude;
					var longitude = position.coords.longitude;
					var yourmap = {
						center: new google.maps.LatLng(latitude, longitude),
						zoom: 11,
						mapTypeId: google.maps.MapTypeId.ROADMAP
					};
					var map = new google.maps.Map(document.getElementById("googleMap"), yourmap);
					var marker = new google.maps.Marker({
						position: new google.maps.LatLng(latitude, longitude),
					});

					marker.setMap(map);
					var infowindow = new google.maps.InfoWindow({
						content: "当前位置!"
					});
					infowindow.open(map, marker);
					google.maps.event.addListener(map, 'click', function(e) {
						reverseGeocode(e.latLng.lat(), e.latLng.lng())
					})
				};

				function addMarker(longitude, latitude) {
					const marker = {
						id: this.markers.length + 1,
						longitude,
						latitude,
						iconPath: '/static/marker.png',
						width: 20,
						height: 20
					};
					this.markers.push(marker);
					this.mapContext.addMarkers({
						markers: this.markers,
						clear: true
					});
				}

				function error(e) {
					alert('地理位置不可用fa',e);
				};


				if ("geolocation" in navigator) {
					navigator.geolocation.getCurrentPosition(success, error);
				} else {
					alert('地理位置不可用ter');
				}
			};
			google.maps.event.addDomListener(window, 'load', initialize);
		</script>
	</head>
	<body>
		<div id="googleMap" style="width:100vw;height:100vh;"></div>
	</body>
</html>
//本段代码来源于网络 仅作自己记录方便后期查询,和给正在踩坑的友友们一个借鉴 侵删

以上就是所有获取谷歌选点定位的流程
以下是当用户输入地址 ,实现地址解析的方法

	// 解析地址
//用户输入时可以动态调用这个函数 也可以当用户输入完成,根据自己的业务逻辑调整
			getGoogleLocation(address) {
				if (!address) return
						const apiKey = '你的谷歌地图key';
				const url =`https://maps.googleapis.com/maps/api/geocode/json?address=${encodeURIComponent(address)}&key=${apiKey}`;
				uni.request({
					url: url,
					method: 'GET',
					success: (res) => {
						console.log("res:", res)
						// 解析API响应
						const results = res.data.results;
						if (results.length > 0) {
							// 获取解析后的位置信息
							const location = results[0].geometry.location;
							const latitude = location.lat;
							const longitude = location.lng;
							this.userInfo.newAddress = address
							this.userInfo.longitude = longitude
							this.userInfo.latitude = latitude
							this.userInfo.address = address
							// 在这里可以使用解析后的位置信息进行后续操作
							console.log("Latitude:", latitude);
							console.log("Longitude:", longitude);
						} else {
							uni.showToast({
								title: '未查询到该地址,请重试',
								icon: 'none'
							})
							console.log("No results found.");
						}
					},
					fail: (err) => {
						console.log("Error:", err);
					}
				});
			},

奇葩需求: app内嵌套h5的另一套代码系统里面也需要使用谷歌地图,这怎么办呢 h5接收不到webview返回的值;原理都大差不差就得用原生js的方法来实现,下面纸列出了有变动的代码 其他的都和上面一样

//跳转谷歌地图前页面 
mounted(){
		const key = 'LocationAddress';
				const data = localStorage.getItem(key);
				localStorage.removeItem(key);
				if (typeof data !== "string") return;
				const x = JSON.parse(data);
				console.log('===x拿到返回的数据 处理业务逻辑啦', x);
}
/webview 页面 
<template>
	<view>
		<iframe id="iframe" src="../../../static/html/google-map.html"></iframe>
	</view>
</template>

<script>
	var iframe = document.getElementById('iframe');
	window.addEventListener('message', (e) => {
		console.log(e, 'eeeeee')
	}, false);
</script>
//google-map.html 页面 的返回函数改成这样
      function onBack(data) {
			localStorage.setItem('LocationAddress', JSON.stringify(data));
			history.back();
        }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring三级缓存流程再梳理

本文主要是说下在使用spring时遇到了循环依赖&#xff0c;Spring利用三级缓存怎么解决 getBean(beanName)doGetBean(name, null, null, false);getSingleton(beanName)方法&#xff0c; 最后会通过addSingleton(beanName, singletonObject)存到一级缓存里面去createBean(beanN…

如何进行pyhon的虚拟环境创建及管理

无论服务器或者本地&#xff0c;创建虚拟环境都是&#xff1a; 【Python】搭建虚拟环境_python创建虚拟环境_今天自洽了吗的博客-CSDN博客 虚拟环境绑定到项目 这个是运行环境&#xff0c;可以切换任意运行环境 如果是服务器上&#xff1a;可以先source xx/bin/active&#xf…

颠覆性语音识别:单词级时间戳和说话人分离 | 开源日报 No.53

vbenjs/vue-vben-admin Stars: 19.7k License: MIT Vue Vben Admin 是一个免费开源的中后台模板&#xff0c;使用最新的 vue3、vite4 和 TypeScript 等主流技术进行开发。该项目提供了现成的中后台前端解决方案&#xff0c;并可用于学习参考。 使用先进的前端技术如 Vue3/vit…

[电源选项]没有系统散热方式,没有被动散热选项

背景 笔记本的风扇声音太大&#xff0c;想改成被动散热方式&#xff0c;又不想影响性能。 于是我打开了控制面板\所有控制面板项\电源选项&#xff0c;点更改计划设置-> 更改高级电源设置。 想把散热方式改成被动散热。发现win11中好像没有这个选项了&#xff01; 如何…

JVM(一)

字节码文件的组成: 基础信息:魔数&#xff0c;字节码文件对应的java版本号&#xff0c;访问表示public final以及父类和接口 常量池:保存了字符串常量&#xff0c;类或者是接口名&#xff0c;字段名&#xff0c;主要在接口中使用 字段:当前类或者是接口声明的字段信息 方法:当…

win10 wsl安装步骤

参考&#xff1a; 安装 WSL | Microsoft Learn 一、安装wsl 1.若要查看可通过在线商店下载的可用 Linux 发行版列表&#xff0c;请输入&#xff1a; wsl --list --online 或 wsl -l -o> wsl -l -o 以下是可安装的有效分发的列表。 使用 wsl.exe --install <Distro>…

知识体系图谱

知识体系图谱 最近更新简历的时候&#xff0c;有种好像去年到今年学了很多&#xff0c;但是都零零散散的&#xff0c;不成体系&#xff0c;就想着抽时间总结归纳一下知识体系&#xff0c;目前我个人的技术栈是这样的&#xff1a; 还是稍微有点乱&#xff0c;下一次更新的时候再…

HQChart支持的画图工具列表

HQChart支持的画图工具列表 线段类线段射线标价线垂直线箭头趋势线水平线水平线段平行射线平行线平行通道价格通道线M头W底头肩型波浪尺AB波浪尺箱型线涂鸦线段 图形类圆弧线矩形平行四边形三角形圆对称角度 文字类文本箭头NoteAnchoredTextPriceLabelPriceNote 其他江恩角度线…

Ubuntu下怎么配置vsftpd

2023年10月12日&#xff0c;周四中午 目录 首先要添加一个系统用户然后设置这个系统用户的密码给新创建的系统用户创建主目录启动vsftpd服务查看vsftpd服务的状态打开外界访问vsftpd服务所需的端口获取服务器的IP地址大功告成 首先要添加一个系统用户 useradd 用户名然后设置…

如何应对量化交易,个人股票账户如何实现量化程序化自动交易

目前股票量化交易是对个人账户开放的&#xff0c;如果你没开通&#xff0c;可能是没有找对渠道&#xff0c;很多券商的手机客户端是包含某些简易版的策略交易&#xff0c;如网格策略&#xff0c;自动止盈止损等&#xff0c;这些策略交易虽然简单、灵活性差&#xff0c;但也是量…

【数据安全】数据安全运维是什么意思?有什么意义?

随着数字化大力发展&#xff0c;保障企业重要资产数据的安全越发重要&#xff0c;因此衍生了数据安全运维工作。那你知道数据安全运维是什么意思&#xff1f;有什么意义&#xff1f; 数据安全运维是什么意思&#xff1f; 数据安全运维是将数据分析技术用于管理数据的过程&…

【萌新向】Sql Server保姆级安装教程-图文详解手把手教你安sql

首先打开百度&#xff0c;搜索sql server&#xff0c;找到图示词条&#xff0c;点击进去。 一般版本是需要付费的&#xff0c;正常开发可以使用免费版本【Express】&#xff0c;点击下载 下载完成后打开下载的文件。三个选项&#xff0c;我们选自定义方式。 选择语言和位置…

第四范式破发,AI大模型之殇?

9月28日&#xff0c;决策类AI独角兽第四范式敲钟挂牌港交所&#xff0c;发行价为55.60港元/股&#xff0c;IPO首日报收58.50港元/股&#xff0c;涨幅5.22%。不过也就日内富贵&#xff0c;在之后的几个交易日里&#xff0c;市值蒸发超20亿港元&#xff0c;截止目前&#xff0c;股…

Air001 TIM1高级定时器单脉冲输出模式使用

Air001 TIM1高级定时器单脉冲输出模式使用 ✨本例程基于合宙官方提供的标准库以及Demo工程作为验证参考。&#x1f4cd;官方提供的SDK包资源&#xff1a;https://gitee.com/openLuat/luatos-soc-air001&#x1f33f;想了解STM32高级定时器单脉冲输出模式了解可以参考阅读:https…

C++ 黑马程序员通讯录管理系统源码

/* 通讯录管理系统 通讯录是一个可以记录亲人、好友信息的工具。 本教程主要利用C来实现一个通讯录管理系统系统中需要实现的功能如下: 添加联系人:向通讯录中添加新人&#xff0c;信息包括 (姓名、性别、年龄、联系电话、家庭住址))最多记录1000人 显示联系人:显示通讯录中所有…

前端开发工具vscode

一、下载安装 https://code.visualstudio.com/ 二、安装插件 三、使用 ①、创建一个空目录 ②、利用vscode工具打开该目录 ③、将该目录设置为工作区 在工作区中添加文件&#xff0c;还可以进行浏览器访问&#xff08;提前安装了Live Server插件&#xff09;

linux下安装ffmpeg的详细教程、ffmpeg is not installed

1、下载解压 wget http://www.ffmpeg.org/releases/ffmpeg-6.0.tar.gz tar -zxvf ffmpeg-6.0.tar.gz 2、 进入解压后目录,输入如下命令/usr/local/ffmpeg为自己指定的安装目录 cd ffmpeg-6.0 ./configure --prefix/usr/local/ffmpeg make sudo make install 3、配置变量 v…

在Windows下自己从源码编译Python3.10.13成安装包

文章目录 &#xff08;一&#xff09;Python 3.10 的生命周期&#xff08;一&#xff09;下载源码&#xff08;二&#xff09;准备环境&#xff08;三&#xff09;编译&#xff08;3.1&#xff09;解压源码到目录&#xff08;3.2&#xff09;下载依赖&#xff08;PCBuild&#…

推荐一款AI写作大师、问答、绘画工具-「智元兔 AI」

在当今技术飞速发展的时代&#xff0c;人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;的应用已经深入到各个领域。其中&#xff0c;AI写作大师、问答、绘画工具是备受关注和追捧的热门应用之一。在众多的选择中&#xff0c;有一款笔者在使用过程中…

分享一下做一个电商小程序可以实现什么功能

电商小程序是一种基于微信小程序平台的电子商务应用&#xff0c;它可以帮助商家展示商品信息、提供在线支付、订单管理等功能&#xff0c;从而吸引更多的用户进行消费。本文将介绍电商小程序可以实现的一些主要功能&#xff0c;以帮助读者了解其优势和应用场景。 商品展示与搜索…