欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

React+高德地圖實(shí)時(shí)獲取經(jīng)緯度,定位地址

 更新時(shí)間:2021年06月19日 17:16:39   作者:XiaoRui  
思路其實(shí)沒有那么復(fù)雜,把地圖想成一個(gè)盒子容器,地圖中心點(diǎn)想成盒子中心點(diǎn);扎點(diǎn)在【地圖中心點(diǎn)】不會(huì)動(dòng),當(dāng)移動(dòng)地圖時(shí),去獲取【地圖中心點(diǎn)】經(jīng)緯度,設(shè)置某個(gè)位置的時(shí)候,將經(jīng)緯度設(shè)置為【地圖中心點(diǎn)】即可

1.根據(jù)高德官方的教程進(jìn)行前期的配置 高德地圖JSAPI 1.4.15文檔
2.參照官方示例中心完成地圖的創(chuàng)建 示例中心

接下來,首先看效果圖:

1. 初始化地圖

地圖容器創(chuàng)建后,初始化時(shí)需要配置一些默認(rèn)的參數(shù),這里配置了常用的幾個(gè),其他的效果自己可以參考api去添加

Dom:<div id='map_container'>
        //地圖容器
    </div>
    
//定義一個(gè)地圖類
class GeoMap {
    constructor() {
        this.el = 'map_container'
        this.defaultConfig = { //默認(rèn)配置
            zoom: 16,              // 默認(rèn)縮放級(jí)別
            touchZoomCenter: 1,    // 為1時(shí)縮放以地圖中心
            resizeEnable: true,    // 監(jiān)控地圖容器尺寸變化
            doubleClickZoom: true, // 雙擊放大地圖
        }
        this.map = null   // 地圖實(shí)例
        this.mapMove = false // 地圖是否移動(dòng)中
        this.centerPixel = { y: '-999', x: '-999' } // 扎點(diǎn)默認(rèn)位置
    }
    // 初始化地圖
    initFn() {
        this.createMap()
        // ...
    }
    // 創(chuàng)建實(shí)例
    createMap() {
        this.map = new AMap.Map(this.el, this.defaultConfig)
        // 給地圖添加自己喜歡的風(fēng)格(背景顏色)
        this.map.setMapStyle('amap://styles/28d5c5df182464d14316bfa41383096c')
    }
    // ...
 }
 export default new GeoMap()

2. 地圖扎點(diǎn)

首先實(shí)現(xiàn)在地圖上繪制一個(gè)中心點(diǎn),需要實(shí)現(xiàn)的效果:

  1. 不能隨著地圖的拖動(dòng)而移動(dòng)
  2. 在地圖容器的中心位置

地圖盒子作為父元素,扎點(diǎn)進(jìn)行絕對(duì)定位,實(shí)現(xiàn)了第一點(diǎn);

    Dom: <div id='map_container'> //地圖容器
          <div id='center_icon' style={{left: `${實(shí)例.centerPixel.x}px`, top: `${實(shí)例.centerPixel.y}px` }}>
            <img src='扎點(diǎn)圖片' /> // 文章結(jié)尾有扎點(diǎn)動(dòng)畫介紹
          </div>
       </div>
    css: #map_container {
            flex: 1;
            position: relative;
            #center_icon {
                position: absolute;
                z-index: 101;
                >img{  
                    width: 52px;
                    height: 64px;
                    // --------以下代碼下面會(huì)做詳細(xì)介紹---------
                    position: relative;
                    top: -64px;
                    left: -26px;
                }
            }
         }

然后需要設(shè)置扎點(diǎn)的left和top值,如何動(dòng)態(tài)的扎點(diǎn)的像素值呢? 這里我們通過高德api, getCenter()獲取地圖中心經(jīng)緯度坐標(biāo) lngLatToContainer() 地圖經(jīng)緯度坐標(biāo)轉(zhuǎn)為地圖容器像素坐標(biāo)

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

扎點(diǎn)圖片需要相對(duì)定位自身高度top:-自身高度 left:-自身寬度/2,原因是:定位點(diǎn)是以盒子的左上角定位到中心的(虛線盒子),所以我們需要將(虛線盒子)移動(dòng)到(實(shí)線盒子)位置,這樣扎點(diǎn)的位置就準(zhǔn)確了。請(qǐng)看下圖:

3. 開啟定位

需要實(shí)現(xiàn):

  • 進(jìn)入地圖頁面自動(dòng)開啟定位功能
  • 定位成功后的位置作為地圖的中心點(diǎn)

這兩個(gè)都是通過api實(shí)現(xiàn),比較簡(jiǎn)單;定位失敗后返回中文提示

    getLocation() {
        const mapError = new Map([
            ['Get ipLocation failed.', 'IP精確定位失敗'],
            ['Browser not Support html5 geolocation.', '瀏覽器不支持原生定位接口'],
            ['Geolocation permission denied.', '瀏覽器禁止了非安全域的定位請(qǐng)求'],
            ['Get geolocation time out.', '瀏覽器定位超時(shí)'],
            ['Get geolocation failed.', '定位失敗']
        ])
        this.map.plugin('AMap.Geolocation', () => {
            const geolocation = new AMap.Geolocation({
                enableHighAccuracy: true, //是否使用高精度定位
                timeout: 30000,           //超過n秒后停止定位
                showButton: false,        //顯示定位按鈕
                showMarker: true,         //定位成功后在定位到的位置顯示點(diǎn)標(biāo)記
                showCircle: false,        //定位成功后用圓圈表示定位精度范圍
                panToLocation: true,      //定位成功后將定位到的位置作為地圖中心點(diǎn)---
                zoomToAccuracy: true,     //調(diào)整地圖視野范圍使定位位置及精度范圍視野內(nèi)可見
            })
            this.map.setZoom(16) // 縮放比例改變后重新定位時(shí)設(shè)置初始縮放比例
            this.map.addControl(geolocation)  // 添加控件
            geolocation.getCurrentPosition()  // 進(jìn)入頁面時(shí)自動(dòng)定位
            AMap.event.addListener(geolocation, 'complete', (result) => {
                // 不在這里取數(shù)據(jù),因?yàn)榉祷氐慕?jīng)緯度、詳細(xì)地址偏差比較大----下面有獲取精確地址的介紹
            })
            AMap.event.addListener(geolocation, 'error', (err) => { // 定位失敗的錯(cuò)誤提示
                let msg = mapError.get(err.message) || err.message
                console.log(msg);
            })
        })
    }

4. 監(jiān)聽地圖變化

通過api調(diào)用實(shí)現(xiàn)監(jiān)聽地圖變化:移動(dòng)中、移動(dòng)結(jié)束、縮放、拖拽等

    mapMove() {
        // * 地圖移動(dòng)中
        this.map.on('mapmove', () => {
           this.mapMove = false
        })
        // * 地圖移動(dòng)結(jié)束
        this.map.on('moveend', () => {
            this.mapMove = true
            this.getCenterAddress() // 獲取地址----下面會(huì)做詳細(xì)介紹
        })
    }

5. 獲取詳細(xì)地址

在地圖移動(dòng)結(jié)束后,通過API去獲取詳細(xì)地址。首先說下這兩個(gè)API:

  1. AMap.PlaceSearch().searchNearBy() 根據(jù)中心點(diǎn)經(jīng)緯度、半徑以及關(guān)鍵字進(jìn)行周邊查詢
  2. AMap.Geocoder().getAddress() 地理編碼與逆地理編碼服務(wù),用于地址描述與坐標(biāo)間的相互轉(zhuǎn)換

🤔按理來說感覺第二種返回比第一種要精確,但是經(jīng)過多次試驗(yàn),第一種反而更精確;可以將兩種方式做個(gè)兼容,這里只舉例第一種

    getCenterAddress() {
        let lnglat = this.map.getCenter()
        AMap.service('AMap.PlaceSearch', () => {
            let placeSearch = new AMap.PlaceSearch({
                    pageSize: 10,
                    pageIndex: 1,
                    children: 1,
                    extensions: 'all',
                    type: '通行設(shè)施|地名地址信息|政府機(jī)構(gòu)及社會(huì)團(tuán)體|樓宇|產(chǎn)業(yè)園區(qū)|風(fēng)景名勝|(zhì)機(jī)場(chǎng)出發(fā)/到達(dá)|火車站|港口碼頭|長途汽車站|地鐵站|輕軌站|公交車站',
                })
            let center = [lnglat.lng, lnglat.lat]
            placeSearch.searchNearBy('', center, 50, (sta, result) => {
                if (sta === 'complete' && result.info === 'OK') {
                    // result.poiList.pois 數(shù)組第一項(xiàng)就是獲取的精確地址
                })
            })
    }

6. 扎點(diǎn)動(dòng)畫😄

在地圖移動(dòng)結(jié)束后給扎點(diǎn)添加一個(gè)上下跳動(dòng)的動(dòng)畫,移動(dòng)時(shí)取消動(dòng)畫

    Dom: <img src='扎點(diǎn)圖片' className={實(shí)例.mapMove ? 'pinAnima' : ''}/>
    
    css: 
        .pinAnima{
            animation: bounce 0.75s;
        }
        
    @keyframes bounce {
    0% {
        transform: translateY(0)
    }
    50% {
        transform: translateY(-20px);
    }
    100% {
        transform: translateY(0)
    }
}

7. 結(jié)束

思路其實(shí)沒有那么復(fù)雜,把地圖想成一個(gè)盒子容器,地圖中心點(diǎn)想成盒子中心點(diǎn);扎點(diǎn)在【地圖中心點(diǎn)】不會(huì)動(dòng),當(dāng)移動(dòng)地圖時(shí),去獲取【地圖中心點(diǎn)】經(jīng)緯度,設(shè)置某個(gè)位置的時(shí)候,將經(jīng)緯度設(shè)置為【地圖中心點(diǎn)】即可。

還有一些其他功能,比如:推薦位置設(shè)置、繪制路線、路徑規(guī)劃、汽車行駛、雷達(dá)動(dòng)畫、等 感興趣的可以一起研究下。在手機(jī)定位也會(huì)有一些定位失敗,定位超時(shí)等的問題,也可以一起研究下。

以上就是React+高德地圖實(shí)時(shí)獲取經(jīng)緯度,定位地址的詳細(xì)內(nèi)容,更多關(guān)于React 定位地址的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 基于Webpack5 Module Federation的業(yè)務(wù)解耦實(shí)踐示例

    基于Webpack5 Module Federation的業(yè)務(wù)解耦實(shí)踐示例

    這篇文章主要為大家介紹了基于Webpack5 Module Federation的業(yè)務(wù)解耦實(shí)踐示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • 淺談webpack+react多頁面開發(fā)終極架構(gòu)

    淺談webpack+react多頁面開發(fā)終極架構(gòu)

    這篇文章主要介紹了淺談webpack+react多頁面開發(fā)終極架構(gòu),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-11-11
  • 阿里低代碼框架lowcode-engine設(shè)置默認(rèn)容器詳解

    阿里低代碼框架lowcode-engine設(shè)置默認(rèn)容器詳解

    這篇文章主要為大家介紹了阿里低代碼框架lowcode-engine設(shè)置默認(rèn)容器詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • useEffect支持async及await使用方式

    useEffect支持async及await使用方式

    這篇文章主要為大家介紹了useEffect支持async及await的使用方式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • React使用hook如何實(shí)現(xiàn)數(shù)據(jù)雙向綁定

    React使用hook如何實(shí)現(xiàn)數(shù)據(jù)雙向綁定

    這篇文章主要介紹了React使用hook如何實(shí)現(xiàn)數(shù)據(jù)雙向綁定方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 在react中使用mockjs的方法你知道嗎

    在react中使用mockjs的方法你知道嗎

    這篇文章主要為大家詳細(xì)介紹了在react中使用mockjs的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • React改變?cè)貥邮降牟僮鞔a

    React改變?cè)貥邮降牟僮鞔a

    這篇文章主要介紹了React技巧之改變?cè)貥邮?本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • react antd-design Select全選功能實(shí)例

    react antd-design Select全選功能實(shí)例

    這篇文章主要介紹了react antd-design Select全選功能實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • react實(shí)現(xiàn)todolist的增刪改查詳解

    react實(shí)現(xiàn)todolist的增刪改查詳解

    這篇文章主要為大家介紹了react實(shí)現(xiàn)todolist的增刪改查,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • 詳解React 16 中的異常處理

    詳解React 16 中的異常處理

    這篇文章主要介紹了詳解React 16 中的異常處理的相關(guān)資料,React 16.x 版本中,引入了所謂 Error Boundary 的概念,從而保證了發(fā)生在 UI 層的錯(cuò)誤不會(huì)連鎖導(dǎo)致整個(gè)應(yīng)用程序崩潰;未被任何異常邊界捕獲的異常可能會(huì)導(dǎo)致整個(gè) React 組件樹被卸載,需要的朋友可以參考下
    2017-07-07

最新評(píng)論