React+高德地圖實時獲取經(jīng)緯度,定位地址
1.根據(jù)高德官方的教程進行前期的配置 高德地圖JSAPI 1.4.15文檔
2.參照官方示例中心完成地圖的創(chuàng)建 示例中心
接下來,首先看效果圖:

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

首先實現(xiàn)在地圖上繪制一個中心點,需要實現(xiàn)的效果:
- 不能隨著地圖的拖動而移動
- 在地圖容器的中心位置
地圖盒子作為父元素,扎點進行絕對定位,實現(xiàn)了第一點;
Dom: <div id='map_container'> //地圖容器
<div id='center_icon' style={{left: `${實例.centerPixel.x}px`, top: `${實例.centerPixel.y}px` }}>
<img src='扎點圖片' /> // 文章結(jié)尾有扎點動畫介紹
</div>
</div>
css: #map_container {
flex: 1;
position: relative;
#center_icon {
position: absolute;
z-index: 101;
>img{
width: 52px;
height: 64px;
// --------以下代碼下面會做詳細(xì)介紹---------
position: relative;
top: -64px;
left: -26px;
}
}
}
然后需要設(shè)置扎點的left和top值,如何動態(tài)的扎點的像素值呢? 這里我們通過高德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
}
扎點圖片需要相對定位自身高度top:-自身高度 left:-自身寬度/2,原因是:定位點是以盒子的左上角定位到中心的(虛線盒子),所以我們需要將(虛線盒子)移動到(實線盒子)位置,這樣扎點的位置就準(zhǔn)確了。請看下圖:

3. 開啟定位
需要實現(xiàn):
- 進入地圖頁面自動開啟定位功能
- 定位成功后的位置作為地圖的中心點
這兩個都是通過api實現(xiàn),比較簡單;定位失敗后返回中文提示
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, //定位成功后在定位到的位置顯示點標(biāo)記
showCircle: false, //定位成功后用圓圈表示定位精度范圍
panToLocation: true, //定位成功后將定位到的位置作為地圖中心點---
zoomToAccuracy: true, //調(diào)整地圖視野范圍使定位位置及精度范圍視野內(nèi)可見
})
this.map.setZoom(16) // 縮放比例改變后重新定位時設(shè)置初始縮放比例
this.map.addControl(geolocation) // 添加控件
geolocation.getCurrentPosition() // 進入頁面時自動定位
AMap.event.addListener(geolocation, 'complete', (result) => {
// 不在這里取數(shù)據(jù),因為返回的經(jīng)緯度、詳細(xì)地址偏差比較大----下面有獲取精確地址的介紹
})
AMap.event.addListener(geolocation, 'error', (err) => { // 定位失敗的錯誤提示
let msg = mapError.get(err.message) || err.message
console.log(msg);
})
})
}
4. 監(jiān)聽地圖變化
通過api調(diào)用實現(xiàn)監(jiān)聽地圖變化:移動中、移動結(jié)束、縮放、拖拽等
mapMove() {
// * 地圖移動中
this.map.on('mapmove', () => {
this.mapMove = false
})
// * 地圖移動結(jié)束
this.map.on('moveend', () => {
this.mapMove = true
this.getCenterAddress() // 獲取地址----下面會做詳細(xì)介紹
})
}
5. 獲取詳細(xì)地址
在地圖移動結(jié)束后,通過API去獲取詳細(xì)地址。首先說下這兩個API:
- AMap.PlaceSearch().searchNearBy() 根據(jù)中心點經(jīng)緯度、半徑以及關(guān)鍵字進行周邊查詢
- AMap.Geocoder().getAddress() 地理編碼與逆地理編碼服務(wù),用于地址描述與坐標(biāo)間的相互轉(zhuǎn)換
🤔按理來說感覺第二種返回比第一種要精確,但是經(jīng)過多次試驗,第一種反而更精確;可以將兩種方式做個兼容,這里只舉例第一種
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è)施|地名地址信息|政府機構(gòu)及社會團體|樓宇|產(chǎn)業(yè)園區(qū)|風(fēng)景名勝|(zhì)機場出發(fā)/到達(dá)|火車站|港口碼頭|長途汽車站|地鐵站|輕軌站|公交車站',
})
let center = [lnglat.lng, lnglat.lat]
placeSearch.searchNearBy('', center, 50, (sta, result) => {
if (sta === 'complete' && result.info === 'OK') {
// result.poiList.pois 數(shù)組第一項就是獲取的精確地址
})
})
}
6. 扎點動畫😄

在地圖移動結(jié)束后給扎點添加一個上下跳動的動畫,移動時取消動畫
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. 結(jié)束
思路其實沒有那么復(fù)雜,把地圖想成一個盒子容器,地圖中心點想成盒子中心點;扎點在【地圖中心點】不會動,當(dāng)移動地圖時,去獲取【地圖中心點】經(jīng)緯度,設(shè)置某個位置的時候,將經(jīng)緯度設(shè)置為【地圖中心點】即可。
還有一些其他功能,比如:推薦位置設(shè)置、繪制路線、路徑規(guī)劃、汽車行駛、雷達(dá)動畫、等 感興趣的可以一起研究下。在手機定位也會有一些定位失敗,定位超時等的問題,也可以一起研究下。
以上就是React+高德地圖實時獲取經(jīng)緯度,定位地址的詳細(xì)內(nèi)容,更多關(guān)于React 定位地址的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
基于Webpack5 Module Federation的業(yè)務(wù)解耦實踐示例
這篇文章主要為大家介紹了基于Webpack5 Module Federation的業(yè)務(wù)解耦實踐示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12
淺談webpack+react多頁面開發(fā)終極架構(gòu)
這篇文章主要介紹了淺談webpack+react多頁面開發(fā)終極架構(gòu),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-11-11
阿里低代碼框架lowcode-engine設(shè)置默認(rèn)容器詳解
這篇文章主要為大家介紹了阿里低代碼框架lowcode-engine設(shè)置默認(rèn)容器詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02
React使用hook如何實現(xiàn)數(shù)據(jù)雙向綁定
這篇文章主要介紹了React使用hook如何實現(xiàn)數(shù)據(jù)雙向綁定方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03
react antd-design Select全選功能實例
這篇文章主要介紹了react antd-design Select全選功能實例,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03

