国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

解決高德地圖因被transform縮放導(dǎo)致獲取鼠標(biāo)點(diǎn)擊地圖某點(diǎn)的經(jīng)緯度不準(zhǔn)問(wèn)題

這篇具有很好參考價(jià)值的文章主要介紹了解決高德地圖因被transform縮放導(dǎo)致獲取鼠標(biāo)點(diǎn)擊地圖某點(diǎn)的經(jīng)緯度不準(zhǔn)問(wèn)題。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

本文完整demo在下面。

大屏

在做大屏的時(shí)候,為了保證大屏完整的呈現(xiàn)在窗口中,一種簡(jiǎn)單的做法是大屏尺寸根據(jù)窗口尺寸做縮放調(diào)整,就像這樣:
解決高德地圖因被transform縮放導(dǎo)致獲取鼠標(biāo)點(diǎn)擊地圖某點(diǎn)的經(jīng)緯度不準(zhǔn)問(wèn)題
想實(shí)現(xiàn)上面這種效果,非常容易,監(jiān)聽(tīng)window的resize事件,當(dāng)window的resize事件觸發(fā)時(shí),根據(jù)此時(shí)window的尺寸與大屏的設(shè)計(jì)尺寸計(jì)算出一個(gè)縮放值,將大屏按照此縮放值進(jìn)行transform:scale縮放。下面我用react簡(jiǎn)單做一個(gè):
App.jsx

// App.jsx

import Screen from './components/Screen'

export default function(){
  return <Screen desginWidth={1920} desginHeight={1080}>
      <div>大屏區(qū)域</div>
	</Screen> 
}

Screen.jsx

// Screen.jsx

import { useState, useEffect } from "react"

// 大屏容器樣式
const style = {
  position: "absolute",
  left: "50%",
  top: "50%",
  backgroundColor: 'red'
}

// 生成一個(gè)防抖函數(shù)
function debounce(callback, time){
  let timer = null 
  return function(...arg){
    if(timer) clearTimeout(timer)
    timer = setTimeout(() => {
      callback(...arg)
    }, time)
  } 
}

// 計(jì)算縮放值
function calculate(desginWidth, desginHeight){
  const { innerWidth, innerHeight } = window
  if(innerWidth / innerHeight < desginWidth / desginHeight) {
    return innerWidth / desginWidth
  }
  return innerHeight / desginHeight
}

// props: { designWidth:number, desginHeight:number }
export default (props) => {

  // 縮放值
  const [scale, setScale] = useState(1)

  // 組件首次加載時(shí)執(zhí)行的邏輯
  useEffect(() => {
  
    // 當(dāng)窗口觸發(fā)resize事件時(shí)的回調(diào)函數(shù)
    const resizeHandler = debounce(() => {
      setScale(calculate(props.desginWidth, props.desginHeight))
    }, 300)
    
	// 注冊(cè)窗口的resize事件
    window.addEventListener('resize', resizeHandler)
    
    resizeHandler()
    
    // 當(dāng)組件卸載時(shí)移除之前窗口注冊(cè)的resize事件
    return () => { window.removeEventListener('resize', resizeHandler) }
  }, [])

  return <div 
    style={{
      ...style, 
      width: `${props.desginWidth}px`,
      height: `${props.desginHeight}px`,
      transform:`translate(-50%, -50%) scale(${scale})`
    }}
  >
    {props.children}
  </div>
}

地圖

大屏組件有了,接下來(lái)利用高德地圖api封裝一個(gè)地圖組件:
Map.jsx

// Map.jsx

import AMapLoader from '@amap/amap-jsapi-loader'
import { useRef } from 'react'

const style = {
  width: "100%",
  height: "100%"
}

export default () => {
  const map = useRef(null)
  
  AMapLoader.load({
    key: "2a49071d959081b738749e17f8207278",
  }).then(() => {
    const {AMap} = window
    
    // 創(chuàng)建一個(gè)地圖
    map.current = new AMap.Map('container', {
      center: [105.602725,37.076636],
    })
  })

  return <div id='container' style={style}></div>
}

將地圖組件安置到大屏里:
App.jsx

// App.jsx
import Screen from './components/Screen'
import Map from './components/Map'

export default function(){
  return <Screen desginWidth={1920} desginHeight={1080}>
      <Map />
   </Screen> 
}

到目前,效果是這樣的:
解決高德地圖因被transform縮放導(dǎo)致獲取鼠標(biāo)點(diǎn)擊地圖某點(diǎn)的經(jīng)緯度不準(zhǔn)問(wèn)題
接下來(lái)實(shí)現(xiàn)鼠標(biāo)點(diǎn)擊地圖某點(diǎn)就在該點(diǎn)樹(shù)立一個(gè)標(biāo)記點(diǎn)的功能。監(jiān)聽(tīng)地圖點(diǎn)擊事件,事件參數(shù)中會(huì)有鼠標(biāo)點(diǎn)擊點(diǎn)的經(jīng)緯度,高德地圖api提供了點(diǎn)標(biāo)記功能,能根據(jù)經(jīng)緯度在地圖上樹(shù)立標(biāo)記點(diǎn)。
解決高德地圖因被transform縮放導(dǎo)致獲取鼠標(biāo)點(diǎn)擊地圖某點(diǎn)的經(jīng)緯度不準(zhǔn)問(wèn)題
試試效果:
解決高德地圖因被transform縮放導(dǎo)致獲取鼠標(biāo)點(diǎn)擊地圖某點(diǎn)的經(jīng)緯度不準(zhǔn)問(wèn)題
期望的效果是在鼠標(biāo)點(diǎn)擊處產(chǎn)生標(biāo)記點(diǎn),但是實(shí)際上標(biāo)記點(diǎn)的位置離鼠標(biāo)點(diǎn)擊位置有很大的偏差。

產(chǎn)生問(wèn)題的原因

下圖這個(gè)是大屏縮放正好是1的情況【transform:scale(1) 】,這個(gè)五角星的像素坐標(biāo)是(784,321)。
解決高德地圖因被transform縮放導(dǎo)致獲取鼠標(biāo)點(diǎn)擊地圖某點(diǎn)的經(jīng)緯度不準(zhǔn)問(wèn)題
如果將窗口縮小,大屏也會(huì)跟著縮?。?br>解決高德地圖因被transform縮放導(dǎo)致獲取鼠標(biāo)點(diǎn)擊地圖某點(diǎn)的經(jīng)緯度不準(zhǔn)問(wèn)題比如上圖這樣,此時(shí)的大屏縮放變成0.8286792452830188的情況【transform: scale(0.8286792452830188)】,五角星的像素坐標(biāo)是(652,266)。你會(huì)發(fā)現(xiàn)像素坐標(biāo)除以縮放值得到的是大屏縮放為1的情況【transform:scale(1)】的像素坐標(biāo),比如652除以0.8286792452830188得到的786,266除以0.8286792452830188得到320(計(jì)算結(jié)果有輕微偏差,因?yàn)橛行?shù)除不盡,以及我測(cè)量的也不是很準(zhǔn)確導(dǎo)致)。

鼠標(biāo)點(diǎn)擊點(diǎn)的經(jīng)緯度應(yīng)該來(lái)自大屏縮放為1的情況【transform: scale(1)】的像素坐標(biāo)。所以你需要將得到的像素坐標(biāo)除以縮放值后再轉(zhuǎn)換成經(jīng)緯度,再根據(jù)該經(jīng)緯度立標(biāo)記點(diǎn),具體實(shí)施步驟見(jiàn)下面的實(shí)施解決方案。

實(shí)施解決方案

通過(guò)點(diǎn)擊地圖事件的事件參數(shù)除了能拿到點(diǎn)擊地圖點(diǎn)的經(jīng)緯度外,還可以拿到點(diǎn)擊地圖點(diǎn)的像素坐標(biāo),將像素坐標(biāo)除以大屏目前的縮放值會(huì)得到一個(gè)新的坐標(biāo),將這個(gè)新的坐標(biāo)轉(zhuǎn)換成對(duì)應(yīng)的經(jīng)緯度(通過(guò)地圖實(shí)例身上的containerToLngLat函數(shù))作為標(biāo)記點(diǎn)的經(jīng)緯度。
解決高德地圖因被transform縮放導(dǎo)致獲取鼠標(biāo)點(diǎn)擊地圖某點(diǎn)的經(jīng)緯度不準(zhǔn)問(wèn)題
試試效果:
解決高德地圖因被transform縮放導(dǎo)致獲取鼠標(biāo)點(diǎn)擊地圖某點(diǎn)的經(jīng)緯度不準(zhǔn)問(wèn)題
nice

完整demo

/ -
  - App.jsx
  - components
  	 - Screen.jsx
  	 - Map.jsx
   - node_modules
   - package.json

Screen.jsx:

import { useState, useEffect, createContext } from "react"

export const context = createContext({
  scale: 1
})

// 大屏容器樣式
const style = {
  position: "absolute",
  left: "50%",
  top: "50%",
  backgroundColor: 'red'
}

// 生成一個(gè)防抖函數(shù)
function debounce(callback, time){
  let timer = null 
  return function(...arg){
    if(timer) clearTimeout(timer)
    timer = setTimeout(() => {
      callback(...arg)
    }, time)
  } 
}

// 計(jì)算縮放值
function calculate(desginWidth, desginHeight){
  const { innerWidth, innerHeight } = window
  if(innerWidth / innerHeight < desginWidth / desginHeight) {
    return innerWidth / desginWidth
  }
  return innerHeight / desginHeight
}

// props: { designWidth:number, desginHeight:number }
export default (props) => {

  // 縮放值
  const [scale, setScale] = useState(1)

  // 組件首次加載時(shí)執(zhí)行的邏輯
  useEffect(() => {
  
    // 當(dāng)窗口觸發(fā)resize事件時(shí)的回調(diào)函數(shù)
    const resizeHandler = debounce(() => {
      setScale(calculate(props.desginWidth, props.desginHeight))
    }, 300)
    
	// 注冊(cè)窗口的resize事件
    window.addEventListener('resize', resizeHandler)
    
    resizeHandler()
    
    // 當(dāng)組件卸載時(shí)移除之前窗口注冊(cè)的resize事件
    return () => { window.removeEventListener('resize', resizeHandler) }
  }, [])

  return <div 
    style={{
      ...style, 
      width: `${props.desginWidth}px`,
      height: `${props.desginHeight}px`,
      transform:`translate(-50%, -50%) scale(${scale})`
    }}
  >
    <context.Provider value={{ scale }}>
      {props.children}
    </context.Provider>
  </div>
}

Map.jsx:

import AMapLoader from '@amap/amap-jsapi-loader'
import { useRef, useContext } from 'react'
import { context } from '../components/Screen'

const style = {
  width: "100%",
  height: "100%",
}

export default () => {
  const map = useRef(null)
  const {scale} = useContext(context)
  AMapLoader.load({
    key: "2a49071d959081b738749e17f8207278",
  }).then(() => {
    const {AMap} = window

    // 創(chuàng)建一個(gè)地圖
    map.current = new AMap.Map('container', {
      center: [105.602725,37.076636],
    })

    //監(jiān)聽(tīng)點(diǎn)擊地圖事件
    map.current.on('click', function(e) {

      // 鼠標(biāo)點(diǎn)擊地圖點(diǎn)的像素坐標(biāo)
      const {x, y} = e.pixel

      // 像素坐標(biāo)除以大屏縮放值得到一個(gè)新的坐標(biāo)
      const pixel2 = new AMap.Pixel(x / scale, y / scale)

      // 新的坐標(biāo)轉(zhuǎn)換成對(duì)應(yīng)的經(jīng)緯度
      const {lng, lat} = map.current.containerToLngLat(pixel2)
      
      // 創(chuàng)建點(diǎn)標(biāo)記
      const marker = new AMap.Marker({
        position: new AMap.LngLat(lng,lat),
        title: "一個(gè)標(biāo)記點(diǎn)"
      })

      // 將點(diǎn)標(biāo)記添加到地圖上
      map.current.add(marker)
    })

  })

  return <div id='container' style={style}></div>
}

App.jsx:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-491235.html

import Screen from './components/Screen'
import Map from './components/Map'

export default function(){
  return <Screen desginWidth={1920} desginHeight={1080}>
      <Map />
  </Screen> 
}

到了這里,關(guān)于解決高德地圖因被transform縮放導(dǎo)致獲取鼠標(biāo)點(diǎn)擊地圖某點(diǎn)的經(jīng)緯度不準(zhǔn)問(wèn)題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Echarts+高德地圖,獲取全國(guó)省市區(qū),區(qū)域板塊地圖獲取并高亮顯示

    Echarts+高德地圖,獲取全國(guó)省市區(qū),區(qū)域板塊地圖獲取并高亮顯示

    當(dāng)用戶(hù)選擇省市區(qū)之后,可以看到對(duì)應(yīng)區(qū)域的高亮顯示。 如圖: 之前用戶(hù)選擇的是江蘇省,因此當(dāng)前高亮顯示的是江蘇省地圖板塊,如果之前用戶(hù)選擇的是成都市,那么地圖則會(huì)變成四川省的版圖,高亮顯示成都市,如下圖: 可以繼續(xù)下鉆,選擇區(qū)域高亮顯示。 這里分享一個(gè)

    2024年02月16日
    瀏覽(25)
  • 高德API JS 高德地圖獲取多個(gè)坐標(biāo)點(diǎn)的中心點(diǎn)

    高德API JS 高德地圖獲取多個(gè)坐標(biāo)點(diǎn)的中心點(diǎn)

    我需要: 在地圖上展示多個(gè)地點(diǎn) 地圖縮放到合適的大小,要求剛好能顯示全部點(diǎn)位 邊緣留有一部分間隔。 做成如圖所示這樣。 經(jīng)過(guò)一下午的研究,弄出來(lái)了。 需要以下這些 AMap 的類(lèi)庫(kù): AMap.Bounds() 區(qū)域 AMap.LngLat() 點(diǎn)坐標(biāo)(基礎(chǔ)點(diǎn)位) AMap.setBounds() 設(shè)置地圖區(qū)域,這會(huì)自動(dòng)

    2024年02月07日
    瀏覽(220)
  • 高德地圖根據(jù)經(jīng)緯度獲取地址信息

    高德地圖根據(jù)經(jīng)緯度獲取地址信息

    主要是使用高德里面 地理編碼與逆地理編碼 的 getAddress 這個(gè)方法, 根據(jù)逆向地理編碼:將地理坐標(biāo)(經(jīng)緯度)轉(zhuǎn)換成地址描述信息,對(duì)應(yīng)為AMap.Geocoder的getAddress方法。 具體使用的代碼為 最后看效果 這是傳的經(jīng)緯度與解析出來(lái)的地理位置 如果需要正向解析將地理位置變成經(jīng)

    2024年02月11日
    瀏覽(23)
  • 微信小程序使用高德地圖獲取當(dāng)前定位

    微信小程序使用高德地圖獲取當(dāng)前定位

    1.在騰訊地圖官網(wǎng)注冊(cè)一個(gè)key(創(chuàng)建一個(gè)應(yīng)用會(huì)自動(dòng)生成一個(gè)key,詳細(xì)步驟如圖) 騰訊位置服務(wù) - 立足生態(tài),連接未來(lái) 注意點(diǎn):開(kāi)通webserviceAPI服務(wù):控制臺(tái) -應(yīng)用管理 -?我的應(yīng)用?-添加key- 勾選WebServiceAPI - 保存 (小程序SDK需要用到webserviceAPI的部分服務(wù),所以使用該功能的KEY需

    2024年02月06日
    瀏覽(104)
  • vue項(xiàng)目接入高德地圖點(diǎn)擊地圖獲取經(jīng)緯度及省市區(qū)

    vue項(xiàng)目接入高德地圖點(diǎn)擊地圖獲取經(jīng)緯度及省市區(qū)

    準(zhǔn)備工作,可以先看官方的介紹,JSAPI結(jié)合Vue使用,這個(gè)不需要在main.js中引入 index.html中 index.vue的html部分 index.vue的script部分 index.vue的css部分 頁(yè)面效果 逆解析經(jīng)緯度得到的詳細(xì)地址

    2024年02月16日
    瀏覽(25)
  • 小程序通過(guò)經(jīng)緯度獲取省市區(qū)(高德地圖)

    小程序通過(guò)經(jīng)緯度獲取省市區(qū)(高德地圖)

    在app.js文件中引入高德地圖的js文件 獲取當(dāng)前定位 ? amap-wx.130.js文件

    2024年02月08日
    瀏覽(30)
  • uniapp h5獲取用戶(hù)地理位置信息(高德地圖)

    uniapp h5獲取用戶(hù)地理位置信息(高德地圖)

    ?使用uni.getLocation()先獲取到當(dāng)前位置信息的經(jīng)緯度 H5端測(cè)試可以使用http,上線打包需要設(shè)置為https模式 谷歌瀏覽器可能會(huì)獲取不到任何信息,因?yàn)楣雀铻g覽器位置信息是連接谷歌服務(wù)器獲取的,國(guó)內(nèi)用戶(hù)可能獲取位置信息失敗 使用高德開(kāi)發(fā)平臺(tái)注冊(cè)一個(gè)key 高德開(kāi)發(fā)平臺(tái):高

    2024年02月13日
    瀏覽(25)
  • 高德地圖的簡(jiǎn)單使用:點(diǎn)擊標(biāo)記獲取經(jīng)緯度和詳細(xì)地址

    高德地圖的簡(jiǎn)單使用:點(diǎn)擊標(biāo)記獲取經(jīng)緯度和詳細(xì)地址

    1. 先進(jìn)入高德開(kāi)發(fā)平臺(tái)注冊(cè)登錄 2.進(jìn)入地圖 js Api 按照步驟申請(qǐng)key 3 使用npm安裝依賴(lài)包 npm i @amap/amap-jsapi-loader --save 4. 高德api 都有說(shuō)明 下面看下我實(shí)現(xiàn)的功能和代碼 1. 初始化地圖加載地圖將自動(dòng)定位到您所在城市并顯示,點(diǎn)擊地圖實(shí)現(xiàn)了打點(diǎn)獲取經(jīng)緯度和詳情地址。 2.輸入提

    2024年02月12日
    瀏覽(21)
  • Java調(diào)用高德地圖API根據(jù)詳細(xì)地址獲取經(jīng)緯度

    Java調(diào)用高德地圖API根據(jù)詳細(xì)地址獲取經(jīng)緯度

    訪問(wèn)高德開(kāi)放平臺(tái)https://lbs.amap.com/ 登錄后,在控制臺(tái)中創(chuàng)建一個(gè)應(yīng)用,獲取生成的應(yīng)用key。這個(gè)key將用于訪問(wèn)高德地圖API。 ? 您可以使用Java中的 HttpURLConnection 或 HttpClient 等工具發(fā)送HTTP請(qǐng)求到高德地圖API,并傳遞參數(shù)以獲取經(jīng)緯度信息。以下是一個(gè)使用 HttpURLConnection 的示例

    2024年02月05日
    瀏覽(161)
  • uniapp---- 微信小程序中獲取當(dāng)前地理位置(高德地圖)

    uniapp---- 微信小程序中獲取當(dāng)前地理位置(高德地圖)

    1.在manifest.json中選擇微信小程序配置,勾選上位置接口。 2.在manifest.json中選擇源碼視圖,添加permission和requiredPrivateInfos 3.進(jìn)入微信公眾平臺(tái)添加合法域名(不能少但是可以放在最后添加,調(diào)試期間可以打開(kāi)開(kāi)發(fā)者工具的不校驗(yàn)合法域名) 4.下載amap-wx.130.js,并且進(jìn)行引用,

    2024年02月12日
    瀏覽(100)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包