React+高德地图实时获取经纬度,定位地址

目录
  • 1. 初始化地图
  • 2. 地图扎点
  • 3. 开启定位
  • 4. 监听地图变化
  • 5. 获取详细地址
  • 6. 扎点动画😄
  • 7. 结束

1.根据高德官方的教程进行前期的配置 高德地图JSAPI 1.4.15文档
2.参照官方示例中心完成地图的创建 示例中心

接下来,首先看效果图:

1. 初始化地图

地图容器创建后,初始化时需要配置一些默认的参数,这里配置了常用的几个,其他的效果自己可以参考api去添加

Dom:<div id='map_container'>
        //地图容器
    </div>

//定义一个地图类
class GeoMap {
    constructor() {
        this.el = 'map_container'
        this.defaultConfig = { //默认配置
            zoom: 16,              // 默认缩放级别
            touchZoomCenter: 1,    // 为1时缩放以地图中心
            resizeEnable: true,    // 监控地图容器尺寸变化
            doubleClickZoom: true, // 双击放大地图
        }
        this.map = null   // 地图实例
        this.mapMove = false // 地图是否移动中
        this.centerPixel = { y: '-999', x: '-999' } // 扎点默认位置
    }
    // 初始化地图
    initFn() {
        this.createMap()
        // ...
    }
    // 创建实例
    createMap() {
        this.map = new AMap.Map(this.el, this.defaultConfig)
        // 给地图添加自己喜欢的风格(背景颜色)
        this.map.setMapStyle('amap://styles/28d5c5df182464d14316bfa41383096c')
    }
    // ...
 }
 export default new GeoMap()

2. 地图扎点

首先实现在地图上绘制一个中心点,需要实现的效果:

  1. 不能随着地图的拖动而移动
  2. 在地图容器的中心位置

地图盒子作为父元素,扎点进行绝对定位,实现了第一点;

    Dom: <div id='map_container'> //地图容器
          <div id='center_icon' style={{left: `${实例.centerPixel.x}px`, top: `${实例.centerPixel.y}px` }}>
            <img src='扎点图片' /> // 文章结尾有扎点动画介绍
          </div>
       </div>
    css: #map_container {
            flex: 1;
            position: relative;
            #center_icon {
                position: absolute;
                z-index: 101;
                >img{
                    width: 52px;
                    height: 64px;
                    // --------以下代码下面会做详细介绍---------
                    position: relative;
                    top: -64px;
                    left: -26px;
                }
            }
         }

然后需要设置扎点的left和top值,如何动态的扎点的像素值呢? 这里我们通过高德api, getCenter()获取地图中心经纬度坐标 lngLatToContainer() 地图经纬度坐标转为地图容器像素坐标

    setCenterIcon() {
        let lnglat = this.map.getCenter()
        let pixel = this.map.lngLatToContainer(lnglat)
        this.centerPixel = pixel
    }

扎点图片需要相对定位自身高度top:-自身高度 left:-自身宽度/2,原因是:定位点是以盒子的左上角定位到中心的(虚线盒子),所以我们需要将(虚线盒子)移动到(实线盒子)位置,这样扎点的位置就准确了。请看下图:

3. 开启定位

需要实现:

  • 进入地图页面自动开启定位功能
  • 定位成功后的位置作为地图的中心点

这两个都是通过api实现,比较简单;定位失败后返回中文提示

    getLocation() {
        const mapError = new Map([
            ['Get ipLocation failed.', 'IP精确定位失败'],
            ['Browser not Support html5 geolocation.', '浏览器不支持原生定位接口'],
            ['Geolocation permission denied.', '浏览器禁止了非安全域的定位请求'],
            ['Get geolocation time out.', '浏览器定位超时'],
            ['Get geolocation failed.', '定位失败']
        ])
        this.map.plugin('AMap.Geolocation', () => {
            const geolocation = new AMap.Geolocation({
                enableHighAccuracy: true, //是否使用高精度定位
                timeout: 30000,           //超过n秒后停止定位
                showButton: false,        //显示定位按钮
                showMarker: true,         //定位成功后在定位到的位置显示点标记
                showCircle: false,        //定位成功后用圆圈表示定位精度范围
                panToLocation: true,      //定位成功后将定位到的位置作为地图中心点---
                zoomToAccuracy: true,     //调整地图视野范围使定位位置及精度范围视野内可见
            })
            this.map.setZoom(16) // 缩放比例改变后重新定位时设置初始缩放比例
            this.map.addControl(geolocation)  // 添加控件
            geolocation.getCurrentPosition()  // 进入页面时自动定位
            AMap.event.addListener(geolocation, 'complete', (result) => {
                // 不在这里取数据,因为返回的经纬度、详细地址偏差比较大----下面有获取精确地址的介绍
            })
            AMap.event.addListener(geolocation, 'error', (err) => { // 定位失败的错误提示
                let msg = mapError.get(err.message) || err.message
                console.log(msg);
            })
        })
    }

4. 监听地图变化

通过api调用实现监听地图变化:移动中、移动结束、缩放、拖拽等

    mapMove() {
        // * 地图移动中
        this.map.on('mapmove', () => {
           this.mapMove = false
        })
        // * 地图移动结束
        this.map.on('moveend', () => {
            this.mapMove = true
            this.getCenterAddress() // 获取地址----下面会做详细介绍
        })
    }

5. 获取详细地址

在地图移动结束后,通过API去获取详细地址。首先说下这两个API:

  1. AMap.PlaceSearch().searchNearBy() 根据中心点经纬度、半径以及关键字进行周边查询
  2. AMap.Geocoder().getAddress() 地理编码与逆地理编码服务,用于地址描述与坐标间的相互转换

🤔按理来说感觉第二种返回比第一种要精确,但是经过多次试验,第一种反而更精确;可以将两种方式做个兼容,这里只举例第一种

    getCenterAddress() {
        let lnglat = this.map.getCenter()
        AMap.service('AMap.PlaceSearch', () => {
            let placeSearch = new AMap.PlaceSearch({
                    pageSize: 10,
                    pageIndex: 1,
                    children: 1,
                    extensions: 'all',
                    type: '通行设施|地名地址信息|政府机构及社会团体|楼宇|产业园区|风景名胜|机场出发/到达|火车站|港口码头|长途汽车站|地铁站|轻轨站|公交车站',
                })
            let center = [lnglat.lng, lnglat.lat]
            placeSearch.searchNearBy('', center, 50, (sta, result) => {
                if (sta === 'complete' && result.info === 'OK') {
                    // result.poiList.pois 数组第一项就是获取的精确地址
                })
            })
    }

6. 扎点动画😄

在地图移动结束后给扎点添加一个上下跳动的动画,移动时取消动画

    Dom: <img src='扎点图片' className={实例.mapMove ? 'pinAnima' : ''}/>

    css:
        .pinAnima{
            animation: bounce 0.75s;
        }

    @keyframes bounce {
    0% {
        transform: translateY(0)
    }
    50% {
        transform: translateY(-20px);
    }
    100% {
        transform: translateY(0)
    }
}

7. 结束

思路其实没有那么复杂,把地图想成一个盒子容器,地图中心点想成盒子中心点;扎点在【地图中心点】不会动,当移动地图时,去获取【地图中心点】经纬度,设置某个位置的时候,将经纬度设置为【地图中心点】即可。

还有一些其他功能,比如:推荐位置设置、绘制路线、路径规划、汽车行驶、雷达动画、等 感兴趣的可以一起研究下。在手机定位也会有一些定位失败,定位超时等的问题,也可以一起研究下。

以上就是React+高德地图实时获取经纬度,定位地址的详细内容,更多关于React 定位地址的资料请关注我们其它相关文章!

(0)

相关推荐

  • 前端vue如何使用高德地图

    首先,注册Key 1.注册开发者账号,成为高德开放平台开发者 2.登陆之后,在进入「应用管理」 页面「创建新应用」 3.为应用添加 Key,「服务平台」一项请选择「 Web 端 ( JSAPI ) 」 然后,书写代码 在vuecli  public文件夹中的index.html添加导入 JS API 的入口脚本标签 <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8

  • vue+高德地图实现地图搜索及点击定位操作

    首先需要在index.html中引入高德地图的js链接,key需要换成你自己的key 最近有个需求是实现一个使用地图搜索定位的功能,在网上参考了下其他的文章,感觉不是很完善,自己整理了一下,可以实现点击定位,搜索列表定位等功能,可能有些地方是多余的,需要的自己看着改下 <script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.14&key=你的key"></

  • SpringBoot整合Mybatis实现高德地图定位并将数据存入数据库的步骤详解

    第一步配置yml文件 server: port: 8080 spring: datasource: username: root password: 123456 url: jdbc:mysql://localhost:3306/spring?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC driver-class-name: com.mysql.cj.jdbc.Driver thymel

  • Java环境下高德地图Api的使用方式

    Java高德地图Api的使用 使用高德经纬度获取地址信息 一些准备用到的常量 /** * 高德地图请求秘钥 */ private static final String KEY = "密钥,可以去高德地图免费申请"; /** * 返回值类型 */ private static final String OUTPUT = "JSON"; /** * 根据地名获取高德经纬度Api */ private static final String GET_LNG_LAT_UR

  • 微信小程序基于高德地图API实现天气组件(动态效果)

    ​在社区翻腾了许久,没有找到合适的天气插件.迫不得已,只好借鉴互联网上的web项目,手动迁移到小程序中使用.现在分享到互联网社区中,帮助后续有需要的开发者. 1.组件介绍 1.1 组件效果预览图 ​小程序组件继承了外部样式colorui的色彩,但实际动画会根据父节点的color属性自动填充颜色,即使不引入colorui这个样式库,也可以在该组件引用外定义一个有color属性的块包裹该组件,同样可以达到如图的效果. 1.2 构造形式 1.3 支持的动画效果 简单介绍下,动画由3个部分组成 一个是主

  • React使用高德地图的实现示例(react-amap)

    pc版React重构,使用到了高德地图.搜了资料,发现有一个针对React进行封装的地图插件react-amap.官方网址:https://elemefe.github.io/react-amap/components/map,有兴趣的可以看下里面的API. react-amap 安装 1.使用npm进行安装,目前是1.2.8版本: cnpm i react-amap 2.直接使用sdn方式引入 <script src="https://unpkg.com/react-amap@0.2.5

  • 微信小程序之高德地图多点路线规划过程示例详解

    调用 如何调用高德api? 高德官方给出的https://lbs.amap.com/api/wx/summary/开放文档比较详细: 第一步,注册高德开发者 第二部,去控制台创建应用 即点击右上角的控制平台创建应用 创建应用绑定服务记得选择微信小程序:同时在https://lbs.amap.com/api/wx/gettingstarted中下载开发包 第三步,登陆微信公众平台在开发设置中将高德域名配置上 https://restapi.amap.com 第四步,打开微信开发者工具,打开微信小程

  • Android高德地图marker自定义弹框窗口

    本文实例为大家分享了Android高德地图marker自定义弹框窗口的具体代码,供大家参考,具体内容如下 最终效果: 1.gradle里添加高德地图依赖 implementation 'com.amap.api:map2d:latest.integration'//2d地图功能 implementation 'com.amap.api:location:latest.integration'//定位功能 2.如果要用到定位的话,就首先到高德控制台里面加入本应用的信息获取到key,再在Applic

  • React+高德地图实时获取经纬度,定位地址

    目录 1. 初始化地图 2. 地图扎点 3. 开启定位 4. 监听地图变化 5. 获取详细地址 6. 扎点动画

  • Python 利用高德地图api实现经纬度与地址的批量转换

    我们都知道,可以使用高德地图api实现经纬度与地址的转换.那么,当我们有很多个地址与经纬度,需要批量转换的时候,应该怎么办呢? 在这里,选用高德Web服务的API,其中的地址/逆地址编码,可以实现经纬度与地址的转换. 高德API地址: 地理/逆地理编码:http://lbs.amap.com/api/webservice/guide/api/georegeo 坐标转换:http://lbs.amap.com/api/webservice/guide/api/convert 1.申请key 2.坐

  • 微信公众号JS-SDK获取当前经纬度以及地址信息的方法

    目录 前言 一.微信 JS-SDK是什么? 二.使用步骤 1.绑定域名 2.引入 JS 文件 3.通过 config 接口注入权限验证配置 4.在这过程中我遇到的问题及解决方法(提示错误invalid signature) 总结 前言 这篇文章带大家掌握 从0到1掌握微信公众平台js-sdk调用 微信公众平台js-sdk调用到底哪几步 安全域名怎么配置 代码怎么写 出了问题怎么查找 例如:随着微信生态的不断发展,基于微信平台的网页开发业务场景也越来越多,很多人都开启了学习微信网页开发,本文就介绍

  • vue使用高德地图实现实时定位天气预报功能

    目录 JSAPI 的加载 使用 JSAPI Loader (推荐) JSAPI key和安全密钥的使用 项目代码步骤: 1.在index.html页面body中添加密钥 2.安装@amap/amap-jsapi-loader 使用 3.实现代码: 实现效果: 需求:根据定位功能,使用高德地图实现定位当前城市的天气预报功能. JSAPI 的加载 JS API 2.0 版本提供了两种方案引入地图 JSAPI: 1. 使用官网提供的 JSAPI Loader 进行加载: 2. 以常规 JavaScri

  • python通过百度地图API获取某地址的经纬度详解

    前言 这几天比较空闲,就接触了下百度地图的API(开发者中心链接地址:http://developer.baidu.com),发现调用还是挺方便的,本文将给大家详细的介绍关于python通过百度地图API获取某地址的经纬度的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 申请百度API 1.打开网页 http://lbsyun.baidu.com/index.php?title=首页 选择功能与服务中的地图,点击左边的获取密匙,然后按照要求申请即可,需要手机和百度账号

  • Android封装高德地图定位工具类Util的详细步骤

    目录 前提 第一步.去官网创建高德Key 第二步  通过Gradle集成SDK(方便): 第三步    配置参数 第四步   获取定位数据 总结 前提 每次做的项目中或者维护公司之前旧项目的时候,都会用到通过定位来获取经纬度,我们都知道,Android官方也提供了获取经纬度的方法,但是不太好使,所以就用了高德地图的API,不能每次用的时候都要写一堆代码,效率挺低的,于是就想着,封装成一个工具类,方便调用,为以后的项目,不管是管理方面还是查找方面都简洁了不少. 第一步.去官网创建高德Key 官网地

  • Android调用高德地图定位的方法

    在App中使用地图定位十分常见,购物功能的可以直接定位当前位置,发动态功能可以定位当前位置发出,社交功能可以定位周边用户等等.这里我使用高德地图定位当前位置并显示地址和经纬度. github代码传送门 先上效果图: 实现步骤: 1. 创建应用获取key: 接入第三方无一例外,去高德地图官网注册账号并创建应用.填入包名和keystore的Sha1. 创建应用 获取Sha1,输入命令keytool -v -list -keystore keystore文件路径,我在这里通过控制台获取调试版的: 进入

  • Vue组件之高德地图地址选择功能的实例代码

    注:本文基于上一篇文章[Vue-Cli 3.0 中配置高德地图 ] ,采用直接引入高德 SDK 的方式来使用高德地图api 一.效果图 二.组件要实现的功能 1. 如果有传入坐标点,则定位到坐标点 2. 如果没有传入坐标点,则定位到当前所在位置 3. 定位成功要在右侧显示经纬度和地址 4. 可以通过拖动 标记 来调整定位点 5. 标记 拖动后,右侧要显示拖动后的经纬度和地址 6. 点击确定按钮,返回最后的坐标点和地名给父组件 三. 组件实现具体代码 <template> <div cla

  • iOS 高德地图仿微信发送实时位置

    最近项目中要写一个微信那种发送位置的功能.具体功能在于: - 定位到当前位置 - 可定位当前位置附近的Poi - 可自行搜索目标位置,并展示附近的poi - 选择当前位置或者选择目标位置进行发送 一.准备工作 1.首先去高德地图官网下载相关的SDK(如下图): 2.按照高德地图官网的步骤继续添加所需要的依赖库 3.根据项目的bundleID前往高德地图API中创建引用并申请相关的key 高德地图应用管理后台 到这一步前期的准备工作基本差不多了,当然,我这写的不是很具体,详细的引入高德地图SDK还

随机推荐