react中基于腾讯地图的地图选点,地址搜索逆向定位获取经纬度

react中基于腾讯地图的地图选点,地址搜索逆向定位获取经纬度

    • 效果示例图
    • 地图组件tencentMap/index.jsx
      • 样式map.scss
    • 使用案例

效果示例图

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

地图组件tencentMap/index.jsx

import { useEffect, useRef, useState } from "react";
import "./map.scss";function loadTMap(key) {return new Promise((resolve, reject) => {if (typeof window.TMap !== "undefined") {resolve(window.TMap);return true;}window.onTMapCallback = function () {resolve(window.TMap);return true;};const script = document.createElement("script");script.type = "text/javascript";script.src = `https://map.qq.com/api/gljs?v=1.exp&key=${key}&callback=onTMapCallback&s=1&libraries=service`;script.onerror = reject;document.head.appendChild(script);return true;});
}function TencentMap(props) {let mapInit = useRef(null);let Map = useRef(null);let markerLayer = useRef(null);let [keyword, setKeyword] = useState("");let [suggestionList, setSuggestionList] = useState([]);//初始化腾讯地图function initMap() {document.querySelector("#tencentContainer").innerHTML = "";mapInit.current = loadTMap("PZHBZ-G6A34-QV7UJ-X4QXK-YIMRK-RAFZS");mapInit.current.then((TMap) => {//定义map变量,调用TMap.Map构造函数创建地图容器Map.current = new TMap.Map(document.querySelector("#tencentContainer"), {zoom: 17, //设置地图缩放级别});//修改地图中心点Map.current.setCenter(new TMap.LatLng(31.230355, 121.47371));//创建并初始化MultiMarker(用于实现在地图中的点标注功能)markerLayer.current = new TMap.MultiMarker({id: "marker-layer",map: Map.current, //指定地图容器geometries: [],});//给地图设置点击事件Map.current.on("click", (evt) => {if (markerLayer.current) {markerLayer.current.setGeometries([]);}const lat = evt.latLng.getLat().toFixed(6);const lng = evt.latLng.getLng().toFixed(6);let location = new TMap.LatLng(lat, lng);// 创建一个正逆地址解析类const geocoder = new TMap.service.Geocoder();// 将给定的坐标位置转换为地址geocoder.getAddress({ location: location }).then((response) => {setKeyword(response.result.address);props.click({keyword: response.result.address,position: {lat: lat,lng: lng,},});markerLayer.current.add([{id: "1", //点标记唯一标识,后续如果有删除、修改位置等操作,都需要此idposition: evt.latLng, //点标记坐标位置},]);});});});}//根据输入值进行逆向定位function searchHandle(e) {let value = trim(e);if (value.length > 0) {setKeyword(value);searchSuggestionAPI(value);} else {setKeyword("");}}function searchSuggestionAPI(value) {mapInit.current.then((TMap) => {// 新建一个关键字输入提示类let suggest = new TMap.service.Suggestion({pageSize: 10, // 返回结果每页条目数});suggest.getSuggestions({keyword: value,}).then((result) => {// 以当前所输入关键字获取输入提示if (result.data.length > 0) {setSuggestionList(result.data);}}).catch((error) => {console.log("[error]", error);});});}//   点击选中下拉数据function selectSuggestionHandle(row) {mapInit.current.then((TMap) => {//修改地图中心点Map.current.setCenter(new TMap.LatLng(row.location.lat, row.location.lng));if (markerLayer.current) {markerLayer.current.setGeometries([]);}setKeyword(row.address);props.click({keyword: row.address,position: {lat: row.location.lat,lng: row.location.lng,},});markerLayer.current.add([{id: "1", //点标记唯一标识,后续如果有删除、修改位置等操作,都需要此idposition: new TMap.LatLng(row.location.lat, row.location.lng), //点标记坐标位置},]);setSuggestionList([]);});}//防抖function debounce(fn, delay = 1000) {let timer = null;return function () {if (timer) {clearTimeout(timer);}timer = setTimeout(() => {fn.apply(this, arguments);}, delay);};}/*** 去除空格,type: 1-所有空格 2-前后空格 3-前空格 4-后空格*/function trim(str, type) {str = str || "";type = type || 1;switch (type) {case 1:return str.replace(/\s+/g, "");case 2:return str.replace(/(^\s*)|(\s*$)/g, "");case 3:return str.replace(/(^\s*)/g, "");case 4:return str.replace(/(\s*$)/g, "");default:return str;}}useEffect(() => {initMap();}, []);return (<><div className="tencentMap-wrap"><div className="tencent" id="tencentContainer"></div><div className="tencent-search"><div className="search-header"><inputtype="text"placeholder="请输入地址"value={keyword}onChange={(e) => searchHandle(e.target.value)}/></div>{suggestionList.length > 0 ? (<ul className="suggestion-wrap">{suggestionList.map((item, index) => (<likey={index}className="suggestion-item"onClick={() => {selectSuggestionHandle(item);}}>{item.title}</li>))}</ul>) : ("")}</div></div></>);
}
export default TencentMap;

样式map.scss

.tencentMap-wrap {width: 90%;margin: 12px auto;.tencent {width: 100%;height: 400px;}.tencent-search {width: 100%;margin-top: 12px;display: flex;flex-direction: column;position: relative;.search-header {width: 100%;position: relative;input,input:focus {border-radius: 4px;outline: none;padding: 0px 12px;border: 1px solid #dcdcdc;border-radius: 4px;width: 100%;height: 40px;}input::placeholder,input::-moz-placeholder,input::-webkit-input-placeholder {color: #999;}}.suggestion-wrap {border: 1px solid #dcdcdc;border-radius: 4px;width: 100%;position: absolute;left: 0px;top: 44px;background-color: #fff;box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.3);z-index: 9;padding: 12px 0px;display: flex;flex-direction: column;.suggestion-item {border-bottom: 1px solid #dcdcdc;width: 100%;cursor: pointer;padding: 12px 12px;font-size: 16px;color: #333;}.suggestion-item:last-child {border-bottom: 0px;}.suggestion-item:hover {background-color: rgba(220, 220, 220, 0.5);}}}
}

使用案例

import { useEffect } from "react";
import TencentMap from "../../components/tencentMap";function Tencent() {function mapHandle(row) {console.log("[row]", row);}useEffect(() => {}, []);return (<><TencentMap click={mapHandle} /></>);
}
export default Tencent;

腾讯地图Javascript API,功能扩展请参考官网

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构--单链表的插入删除

数据结构–单链表的插入&删除 目标 单链表的插入&#xff08;位插、前插、后插&#xff09; 单链表的删除 单链表的插入 按为序插入(带头结点) ListInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e。 思路&#xff1a;找到第i-1个结点,将新结点插入其…

SpringMVC

SpringMVC常用注解: 1&#xff1a;Controller:用于标记控制器类&#xff0c;表示该类是可以处理HTTP请求的。 2&#xff1a;RequestMapping:用于映射URL和处理方法。可以在类和方法上&#xff0c;类级别的RequestMapping会对其中所有的方法进行URL映射。参数支持Ant-style路径…

01.网络编程-基础概念

网络编程就是指编写互联网项目&#xff0c;项目可以通过网络传输数据进行通讯 网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包&#xff0c;在接收端按照规定好的协议把包进行解析&#xff0c;从而提取出对应的信息&#xff0c;达到通信的目的 1.1 软件结构…

掌握GDB调试工具,轻松排除bug!

一、什么是GDB gdb是GNU debugger的缩写&#xff0c;是编程调试工具。 GDB官网&#xff1a; https://www.gnu.org/software/gdb/GDB适用的编程语言&#xff1a; Ada / C / C / objective-c / Pascal 等。GDB的工作方式&#xff1a; 本地调试和远程调试。 目前release的最新版…

PG系列4:linux下编译安装PG15

文章目录 一. 源码安装1.1 下载并解压1.2 安装依赖包1.3 开始编译安装1.4 创建用户1.5 创建目录及修改权限1.6 设置环境变量1.7 初始化数据库1.8 启动和关闭数据库 二. 验证2.1 查看数据库后台进程2.2 验证和登陆数据库2.3 查看数据库版本2.4 查看数据库运行状态2.5 修改白名单…

Docker 安装 Redis

一、官方推荐安装方式&#xff1a; 1、执行 docker pull redis:4.0.1 命令&#xff0c;下载 redis 镜像&#xff0c;如下所示&#xff1a; 2、执行命令&#xff0c;创建并启动 redis 容器 docker run --rm -d --name redis6379 -p 6379:6379 redis:4.0.1 --requirepass "…

【QT】如何自定义QMessageBox的窗口大小,通过继承QDialog重新实现美观的弹窗

目录 1. QMessageBox原有的弹窗2. 网上第一种方法&#xff1a;通过样式表setStyleSheet实现改变弹窗大小&#xff08;总体不美观&#xff09;3. 网上第二种方法&#xff1a;重写ShowEvent()改变弹窗大小&#xff08;总体也不美观&#xff09;4. 最好的办法&#xff1a;继承QDia…

webstorm2022 TS1109: Expression expected.

在使用webstorm2022&#xff0c;加入ESLint&#xff08;已禁用&#xff09;的情况下&#xff0c;编写vue3的typescript代码时&#xff0c;报错&#xff1a; TS1109: Expression expected. 原因&#xff1a;2022版本不支持volar&#xff0c;需升级到2023版本。 官方描述为&am…

IAM风险CTF挑战赛

wiz启动了一个名为“The Big IAM Challenge”云安全CTF挑战赛。旨在让白帽子识别和利用 IAM错误配置&#xff0c;并从现实场景中学习&#xff0c;从而更好的认识和了解IAM相关的风险。比赛包括6个场景&#xff0c;每个场景都专注于各种AWS服务中常见的IAM配置错误。 Challenge…

Linux下vim的常见命令操作(快速复查)

目录 前言1、Vim常用操作1.1、环境参数1.2、方向1.3、插入命令1.4、定位命令1.5、删除命令1.6、复制和剪切命令1.7、替换和取消命令1.8、搜索和搜索替换命令1.9、保存和退出命令1.10、其他命令1.11、可视模式 前言 本篇文章不面向新手&#xff0c;全文几乎都是命令&#xff0c;…

使用python编程数学建模-常见excel数据使用python以行的方式按需读取

读取原始数据 首先导入pandas库   接着使用pandas库里面的read_csv方法来读取我们的文件&#xff0c;由于数据文件和程序文件是在统一目录下&#xff0c;因此无需使用绝对路径 import pandas as pd data1 pd.read_csv("data1.csv")读取数据的前20行数据 这里我们…

Java Web HTMLCSS(1)23.6.29

HTML&CSS 1&#xff0c;HTML 1.1 介绍 HTML 是一门语言&#xff0c;所有的网页都是用HTML 这门语言编写出来的&#xff0c;也就是HTML是用来写网页的&#xff0c;像京东&#xff0c;12306等网站有很多网页。 这些都是网页展示出来的效果。而HTML也有专业的解释 HTML(Hy…