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

news2024/9/25 5:23:29

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", //点标记唯一标识,后续如果有删除、修改位置等操作,都需要此id
              position: 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", //点标记唯一标识,后续如果有删除、修改位置等操作,都需要此id
          position: 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">
            <input
              type="text"
              placeholder="请输入地址"
              value={keyword}
              onChange={(e) => searchHandle(e.target.value)}
            />
          </div>
          {suggestionList.length > 0 ? (
            <ul className="suggestion-wrap">
              {suggestionList.map((item, index) => (
                <li
                  key={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.coloradmin.cn/o/696462.html

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

相关文章

PHP函数、数组和错误处理:简单实用的开发技巧和错误处理方法

目录 PHP函数 函数的基本概念&#xff1a; 函数定义语法&#xff1a; 函数命名关系&#xff1a; 参数详解 形参 实参 ​编辑 默认值 引用传递 函数体 函数返回值 作用域 静态变量 可变函数 匿名函数 基本概念 闭包 伪类型 库函数 有关输出的函数 有关时间…

Linux守护进程详解、范例演示 ( 6 ) -【Linux通信架构系列 】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 期待你的关注哦&#xff01;&#xff01;&#xff01; 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the…

gitee 上传、下载代码

gitee push 代码 四步走 $ git add . $ git commit -m "修改了什么东西&#xff0c;改了哪个bug&#xff0c;加了一条long服务" $ git remote add origin https://gitee.com/666666666666666666.git $ git push -u origin master1. 先安装git &#xff0c;自行百度 …

大数据到底要学习一些什么内容

大数据本质上是海量数据。 以往的数据开发&#xff0c;需要一定的Java基础和工作经验&#xff0c;门槛高&#xff0c;入门难。 如果零基础入门数据开发行业的小伙伴&#xff0c;可以从Python语言入手。 Python语言简单易懂&#xff0c;适合零基础入门&#xff0c;在编程语言…

Spring Boot 中的 @CachePut 注解是什么,原理,如何使用

Spring Boot 中的 CachePut 注解是什么&#xff0c;原理&#xff0c;如何使用 简介 在 Spring Boot 中&#xff0c;CachePut 注解是用于缓存的注解之一&#xff0c;用于更新缓存中的数据。相比于 Cacheable 注解&#xff0c;CachePut 注解可以用于更新缓存中的数据&#xff0…

鞍山万象汇钢都夜巷3.0炫目回归——“钢刚好”遇见快乐

6月21日晚&#xff0c;鞍山万象汇钢都夜巷3.0市集快意回归&#xff0c;盛大启幕。在清爽宜人的晚风里、在热烈肆意的旋律中&#xff0c;这一场以快乐为基调的暑期市集&#xff0c;正式奏响钢都夏夜狂欢的乐章。汇聚多元场景&#xff0c;搜罗热门美食&#xff0c;消解盛夏酷暑&a…

VORS、CCDM模型、GeoDetector、GWR模型集成技术在城镇化与生态系统健康空间关系分析及影响效应中的应用

城市群是一国经济发展水平的象征&#xff0c;也是一国经济发展到一定阶段的标志&#xff0c;我国城市群建设体量不断增加&#xff0c;将成为全球经济的核心&#xff0c;中国城市群的建设逐步引领全球进入到了21世纪的中国新时代。然而&#xff0c;高速的城镇化发展&#xff0c;…

DBeaver使用ssh隧道远程连接

1&#xff0c;ssh 隧道的作用 SSH 隧道&#xff08;SSH tunnel&#xff09;是通过安全外壳协议&#xff08;SSH&#xff09;在公共网络上创建一个安全的通信通道的技术。它的作用是加密和保护数据通信&#xff0c;同时允许在不安全的网络环境中安全地传输数据。 以下是一些 SS…

《一步到位,走进一站式服务治理时代:Redis管理16个数据库的最佳实践》

目录 1. 我们为什么要使用Redis缓存数据库&#xff1f; 2. 关系型与非关系型数据库有哪些区别&#xff1f; 3. Redis中的缓存问题与解决方案&#xff1a;穿透、击穿、雪崩 4. 为什么要在一个项目中使用/管理16个数据库呢&#xff1f; 5. 使用16个数据库比使用1个数据库的…

OpenStack(T版)——网络(Neutron)服务介绍与安装

文章目录 OpenStack(T版)——网络(Neutron)服务介绍与安装安装和配置(controller)准备(1)创建数据库(2)加载admin user的环境变量(3)创建服务凭证 配置Neutron网络服务组件(1)安装软件(2)编辑文件/etc/neutron/neutron.conf&#xff0c;完成以下操作(3)配置Layer 2 (ML2)plug-i…

时序数据库 TDengine 与腾讯云多个产品线完成兼容性互认证明

随着数字经济蓬勃发展&#xff0c;数据成为驱动企业数字化转型的关键生产要素&#xff0c;如何加强对数据资源的治理利用、实现数据洞察、激活数据价值正成为亟待解决的问题。在此背景下&#xff0c;数据库与操作系统、云平台等国产化软件相互结合赋能成为解决问题的思路之一。…

Java中的String类真的不可变吗?java面试常见问题

其实在Java中&#xff0c;String类被final修饰&#xff0c;主要是为了保证字符串的不可变性&#xff0c;进而保证了它的安全性。那么final到底是怎么保证字符串安全性的呢&#xff1f;接下来就让我们一起来看看吧。 一. final的作用 1. final关键词修饰的类不可以被其他类继承…

车载通讯USB开发,增强车内娱乐体验

车载通讯开发中使用的 USB 协议常见于车内娱乐系统、车载设备和汽车诊断工具等应用。USB&#xff08;Universal Serial Bus&#xff0c;通用串行总线&#xff09;是一种常见的数字通信接口标准&#xff0c;用于连接计算机、外部设备及其他电子设备之间的数据传输和通信。 USB …

Python面向对象编程到底怎么用才是最好的(两个小案例告诉你其中优势)

目录 前言案例一&#xff1a;图书管理系统案例二&#xff1a;汽车制造系统 总结 前言 大家好&#xff0c;我是辣条哥~ 当谈到Python编程语言时&#xff0c;面向对象编程&#xff08;Object-Oriented Programming&#xff0c;简称OOP&#xff09;是一个重要的概念。 OOP是一种…

Leetcode52 N 皇后 II

n 皇后问题 研究的是如何将 n 个皇后放置在 n n 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回 n 皇后问题 不同的解决方案的数量。 示例 1&#xff1a; 输入&#xff1a;n 4 输出&#xff1a;2 解释&#xff1a;如上图所示&…

uin-app项目实现pdf文件预览以及下载

由于项目需要&#xff0c;需要对于pdf格式的文件进行预览由用户进行选择性下载&#xff0c;查阅相关文档后方知针对于这种 pdf.js有奇效 一、下载 官网地址https://mozilla.github.io/pdf.js/getting_started/#download 文档下载解压成功后&#xff0c;按照这种格式放入uin-…

认识GBK编码和UTF-8编码

GBK编码和UTF-8编码是两种不同的字符编码方式&#xff1b; 1、主要区别如下&#xff1a; &#xff08;1&#xff09;字符集范围不同&#xff1a;GBK编码支持中文字符和日韩字符&#xff0c;而UTF-8编码支持全球范围内的字符&#xff1b; &#xff08;2&#xff09;编码方式不…

4.28 poll API介绍及代码编写

4.28 poll API介绍及代码编写 #include <poll.h> struct pollfd{int fd;//委托内核检测的文件描述符short events;//委托内核检测文件描述符的什么事件short revents;//文件描述符实际发生的事件 }; int poll(struct pollfd *fds,nfds_t nfds,int timeout);-参数&#x…

EDA云实证Vol.13:暴力堆机器之王——Calibre

Siemens的Calibre是业内权威的版图验证软件&#xff0c;被各大Foundry厂广泛认可。用户可以直接在Virtuoso界面集成Calibre接口&#xff0c;调用版图验证结果数据&#xff0c;使用起来极为方便。 今天&#xff0c;我们就来聊聊这款软件。 版图验证是芯片设计中非常重要的一环…

3.5.1MapReduce原理详解

单机程序计算流程 输入数据—>读取数据—>处理数据—>写入数据—>输出数据 Hadoop计算流程 input data&#xff1a;输入数据 InputFormat&#xff1a;对数据进行切分&#xff0c;格式化处理 map&#xff1a;将前面切分的数据做map处理(将数据进行分类&#xf…