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

leaflet學(xué)習(xí)筆記-帶有方位角信息的圓的繪制(七)

這篇具有很好參考價(jià)值的文章主要介紹了leaflet學(xué)習(xí)筆記-帶有方位角信息的圓的繪制(七)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前言

項(xiàng)目中有一個(gè)需求,就是需要繪制一個(gè)圓,并且繪制的時(shí)候還要設(shè)置方位角,最后返回圓的坐標(biāo)集合和方位角。本功能使用Leaflet-Geoman+Turf.js+leaflet實(shí)現(xiàn)。

方位角簡(jiǎn)介

在陸地導(dǎo)航中,方位角通常表示為 alpha、α,并定義為從北基線或子午線順時(shí)針測(cè)量的水平角。方位角也被更廣泛地定義為從任何固定參考平面或容易建立的基準(zhǔn)方向線順時(shí)針測(cè)量的水平角度。
今天,方位角的參考平面通常是真北,測(cè)量為 0° 方位角,但也可以使用其他角度單位(grad、mil)。 在 360 度圓上順時(shí)針移動(dòng),東方位角為 90°,南方位角為 180°,西方位角為 270°。也有例外:一些導(dǎo)航系統(tǒng)使用南方作為參考矢量。任何方向都可以作為參考向量,只要明確定義即可。
很常見(jiàn)的是,方位角或羅盤(pán)方位在一個(gè)系統(tǒng)中表示,其中北或南可以是零,并且可以從零順時(shí)針或逆時(shí)針測(cè)量角度。
首先說(shuō)明的參考方向始終是北或南,最后說(shuō)明的轉(zhuǎn)向方向是東或西。選擇方向,使它們之間的角度為正,介于 0 和 90 度之間。如果方位恰好在基點(diǎn)之一的方向上,則使用不同的符號(hào)。

**注意:**項(xiàng)目中我們規(guī)定正北為0° 方位角,順時(shí)針逐漸增加,直到360° 方位角

Leaflet-Geoman簡(jiǎn)介

我的理解就是一個(gè)leaflet的繪制插件,具體可以查看Leaflet-Geoman官網(wǎng),本功能就是使用它繪制Circle

Turf.js簡(jiǎn)介

Turf.js 是一個(gè)用于地理空間計(jì)算的 JavaScript 庫(kù)。它提供了許多地理空間操作的函數(shù),如點(diǎn)線面的創(chuàng)建、緩沖區(qū)計(jì)算、距離計(jì)算、區(qū)域合并等,方便在前端應(yīng)用中處理地理空間數(shù)據(jù)和實(shí)現(xiàn)地圖相關(guān)功能。Turf.js 不依賴于任何地圖庫(kù),可以在任何 JavaScript 環(huán)境中使用。

繪制Circle可以使用Leaflet-Geoman繪制,但是方位角的話不能直接獲取,所以我想用turf.js里面的**bearing**,取兩點(diǎn),找出它們之間的地理方位,即從北線(0度)開(kāi)始測(cè)量的角度。這兩點(diǎn)就是繪制的圓的圓心(start),鼠標(biāo)移動(dòng)的坐標(biāo)點(diǎn)(end),這樣就能實(shí)時(shí)得到方位角了。

UseWindCircle.js完整代碼

/**
 * @ClassName UseWindCircle.js
 * @Description 風(fēng)圈繪制操作hook
 * @Author ZhangJun
 * @Date  2024/1/9 15:38
 **/
import 'leaflet.pm'
import 'leaflet.pm/dist/leaflet.pm.css'
import * as turf from '@turf/turf'
import { ref, onUnmounted, reactive } from 'vue'
import BigNumber from 'bignumber.js'

export function useWindCircle(mainMap, geometryType = 'Circle', drawComplete = null, drawLayer = undefined) {
  //繪制完成后的要素幾何圖層
  let targetFeatureLayer = null

  //繪制事件狀態(tài)
  let status = ref('start')

  //生成圓的坐標(biāo)的精度
  let steps = ref(10)

  //生成圓的單位距離
  let units = ref('kilometers')//meters

  //方向角
  let direction = ref(null)

  //繪制的圓的坐標(biāo)集合
  let coords = ref([])

  //用于標(biāo)記方向的popup
  let directionPopup = new L.popup({ closeButton: false })

  //圓心坐標(biāo)
  let centerPosition = null

  if (mainMap) {
    //關(guān)閉的時(shí)候一定要銷毀
    onUnmounted(() => {
      closeDraw()
      mainMap?.removeLayer(drawLayer)
    })

    if (!drawLayer) {
      drawLayer = L.featureGroup([])
      drawLayer.addTo(mainMap)
    }

    // 添加繪制工具
    mainMap.pm.setLang('zh')
    mainMap.pm.addControls({
      position: 'topleft',
      drawPolygon: false, //繪制多邊形
      drawMarker: false, //繪制標(biāo)記點(diǎn)
      drawCircleMarker: false, //繪制圓形標(biāo)記
      drawPolyline: false, //繪制線條
      drawRectangle: false, //繪制矩形
      drawCircle: false, //繪制圓圈
      editMode: false, //編輯多邊形
      dragMode: false, //拖動(dòng)多邊形
      cutPolygon: false, //添加?個(gè)按鈕以刪除多邊形??的部分內(nèi)容
      removalMode: false, //清除多邊形
    })

    // 全局設(shè)置繪制樣式
    mainMap.pm.setPathOptions({
      color: 'orange',
      fillColor: 'green',
      fillOpacity: 0.4,
    })


    //初始化事件
    let initEvents = () => {
      //繪制開(kāi)始(可以多次繪制)
      mainMap.on('pm:drawstart', ({ workingLayer }) => {
        //中心點(diǎn)改變就進(jìn)這里
        workingLayer.on('pm:centerplaced', (e) => {
          status.value = 'start'
          centerPosition = e.latlng

          //打開(kāi)方向的popup
          directionPopup?.setLatLng(centerPosition).openOn(mainMap)
        })
      })

      mainMap.on('mousemove', (e) => {
        if (centerPosition) {
          let latLng = e.latlng

          let startPoint = turf.point([centerPosition.lng, centerPosition.lat])
          let endPoint = turf.point([latLng.lng, latLng.lat])

          //獲取圓心和現(xiàn)在鼠標(biāo)坐標(biāo)的中心點(diǎn)數(shù)據(jù)
          let popupPosition = turf.midpoint(startPoint, endPoint)
          let [lng, lat] = popupPosition.geometry.coordinates
          //計(jì)算現(xiàn)在的方向位置,并賦值方向
          let direction_temp = getDirection(centerPosition, latLng)
          direction.value = new BigNumber(direction_temp).toFixed(2)
          setPopupContent({ lat, lng }, `<b>風(fēng)向:</b>${direction.value}°`)
        }
      })

      //繪制完成
      mainMap.on('pm:create', (e) => {
        //清除上一個(gè)繪制的緩沖區(qū)
        clearDrawLayer()

        status.value = 'end'
        let { layer } = e
        targetFeatureLayer = layer
        layer.remove()
        addLayersToDrawLayer([targetFeatureLayer])
        mainMap.pm.enableDraw(geometryType)

        mainMap.closePopup(directionPopup)

        //繪制完成的回調(diào)
        if (typeof drawComplete === 'function') {
          let result = getResult(targetFeatureLayer)
          drawComplete(result)
        }
      })

      mainMap.on('pm:globalremovalmodetoggled', (e) => {
        console.log(e, '清除圖層時(shí)調(diào)用')
      })
    }

    //移除事件
    let removeEvents = () => {
      //取消時(shí)間的監(jiān)聽(tīng)
      mainMap?.off('pm:drawstart')
      mainMap?.off('pm:create')
      mainMap?.off('mousemove')
    }

    //清除原來(lái)繪制的內(nèi)容
    let clearDrawLayer = () => {
      drawLayer?.clearLayers()
      targetFeatureLayer = null
    }

    //添加要素到drawLayer
    let addLayersToDrawLayer = (features = []) => {
      features?.forEach(feature => {
        drawLayer.addLayer(feature)
      })
    }

    //關(guān)閉繪制功能
    let closeDraw = () => {
      mainMap.pm.disableDraw(geometryType)
      //清空繪制的幾何
      clearDrawLayer()
      //一定要移除事件,否則事件之間會(huì)有干擾
      removeEvents()
    }

    //開(kāi)始繪制
    let startDraw = (type = geometryType) => {
      //初始化事件
      initEvents()

      if (type !== geometryType) {
        geometryType = type
      }
      if (type) {
        //默認(rèn)繪制幾何
        mainMap.pm.enableDraw(type)
      }
    }

    //設(shè)置需要顯示的方位popup內(nèi)容
    let setPopupContent = (latLng, content = '') => {
      directionPopup.setLatLng(latLng).setContent(content)
    }

    //獲取緩沖區(qū)的坐標(biāo)集合
    let getResult = (target = targetFeatureLayer) => {
      if (target) {
        let { lat, lng } = target.getLatLng()
        let center = [lng, lat]
        let radius = target.getRadius()

        let options = { steps: steps.value, units: units.value, properties: { foo: 'bar' } }
        let circle = turf.circle(center, radius, options)
        if (circle?.geometry) {
          //獲取輸入 feature 并將它們的所有坐標(biāo)從 [x, y] 翻轉(zhuǎn)為 [y, x]。
          let temp = turf.flip(circle)
          coords.value = turf.getCoords(temp)

          return { direction: direction.value, coords: coords.value }
        }
      }
      return { direction: direction.value, coords: coords.value }
    }

    //取兩點(diǎn),找出它們之間的地理方位,即從北線(0度)開(kāi)始測(cè)量的角度。
    let getDirection = (start = centerPosition, end) => {
      start = [start.lng, start.lat]
      end = [end.lng, end.lat]
      return turf.bearing(start, end, { final: true })
    }

    return { status, closeDraw, drawLayer, startDraw, steps, units, coords, direction }
  }

  return {}
}

UseWindCircle.js使用

//風(fēng)圈使用的hook
let {
  startDraw: startWindCircle,
  closeDraw: closeWindCircle,
  units,
  steps,
} = useWindCircle(props.lMap, undefined, e => {
  alert(JSON.stringify(e))
})

使用startWindCircle()開(kāi)始繪制,closeWindCircle()結(jié)束繪制,繪制完成會(huì)進(jìn)入上面的回調(diào)函數(shù),并返回我們要的圓的輪廓坐標(biāo)還有方向角({direction:xxx,coords:[]})

效果如下

leaflet學(xué)習(xí)筆記-帶有方位角信息的圓的繪制(七),leaflet學(xué)習(xí)筆記,學(xué)習(xí),筆記,vue.js,arcgis


本文為學(xué)習(xí)筆記,僅供參考文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-821567.html

到了這里,關(guān)于leaflet學(xué)習(xí)筆記-帶有方位角信息的圓的繪制(七)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(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)文章

  • 基于SpringBoot和Leaflet的地震臺(tái)網(wǎng)信息預(yù)警可視化

    基于SpringBoot和Leaflet的地震臺(tái)網(wǎng)信息預(yù)警可視化

    目錄 前言 一、后臺(tái)管理設(shè)計(jì)與實(shí)現(xiàn) 1、Model層 2、業(yè)務(wù)層 3、控制層 二、前端預(yù)警可視化設(shè)計(jì)與實(shí)現(xiàn) 1、網(wǎng)頁(yè)結(jié)構(gòu) 2、數(shù)據(jù)綁定 三、效果展示 總結(jié) ????????在之前的幾篇博客中,我們講解了如何在Leaflet中進(jìn)行預(yù)警信息提示效果,以及基于XxlCrawler進(jìn)行中國(guó)地震臺(tái)網(wǎng)信息的采

    2024年04月27日
    瀏覽(14)
  • 141:vue+leaflet 利用高德逆地理編碼,點(diǎn)擊地圖標(biāo)記marker,popup地址信息

    141:vue+leaflet 利用高德逆地理編碼,點(diǎn)擊地圖標(biāo)記marker,popup地址信息

    第141個(gè) 點(diǎn)擊查看專欄目錄 本示例的目的是介紹演示如何在vue+leaflet中利用高德逆地理編碼,點(diǎn)擊地圖標(biāo)記marker,popup地址信息 。主要利用高德地圖的api將坐標(biāo)轉(zhuǎn)化為地址,然后在點(diǎn)擊的位置,彈出彈窗,在里面顯示出地址信息。 直接復(fù)制下面的 vue+leaflet源代碼,操作2分鐘即

    2024年01月24日
    瀏覽(30)
  • vue+leaflet筆記之熱力圖

    vue+leaflet筆記之熱力圖

    本文介紹了Web端使用 Leaflet 開(kāi)發(fā)庫(kù)展示熱力圖方法 (底圖來(lái)源:天地圖),結(jié)合leaflet.heat插件可以很容易的做出熱力圖,通過(guò)調(diào)整其配置參數(shù)可以優(yōu)化熱力圖的顯示,以達(dá)到最佳的可視化效果,顯示效果如下圖所示。 Vue 開(kāi)發(fā)庫(kù):3.2.37 Leaflet 開(kāi)發(fā)庫(kù):1.9.3 Leaflet主要插件: leaflet

    2024年02月10日
    瀏覽(28)
  • 如何全方位了解購(gòu)房信息?VR全景技術(shù)為您解答

    如何全方位了解購(gòu)房信息?VR全景技術(shù)為您解答

    在存量房貸利率下調(diào)政策下,房子逐漸回歸到居住屬性,在對(duì)于有購(gòu)房剛需的客戶來(lái)說(shuō),無(wú)疑是一大利好政策,此類客戶有著強(qiáng)烈的看房購(gòu)房需求,那么該如何全方位的了解購(gòu)房信息呢? 房企通過(guò)VR全景展示、3D樣板房、VR數(shù)字沙盤(pán)等功能,將線下房源實(shí)景展示在網(wǎng)上,三維、

    2024年02月09日
    瀏覽(34)
  • 【信息安全案例】——信息內(nèi)容安全(學(xué)習(xí)筆記)

    【信息安全案例】——信息內(nèi)容安全(學(xué)習(xí)筆記)

    ?? 前言:在數(shù)字化時(shí)代,信息內(nèi)容安全問(wèn)題越來(lái)越引起人們的關(guān)注。信息內(nèi)容安全主要包括對(duì)數(shù)據(jù)的機(jī)密性、完整性和可用性的保護(hù),以及對(duì)用戶隱私的保護(hù)等方面。針對(duì)信息內(nèi)容安全的威脅,采取科學(xué)有效的安全措施和技術(shù)手段至關(guān)重要。本文介紹信息內(nèi)容安全的相關(guān)概

    2024年02月07日
    瀏覽(29)
  • 【信息安全案例】——網(wǎng)絡(luò)信息面臨的安全威脅(學(xué)習(xí)筆記)

    【信息安全案例】——網(wǎng)絡(luò)信息面臨的安全威脅(學(xué)習(xí)筆記)

    ?? 前言:2010年,震網(wǎng)病毒(Stuxnet)席卷全球工業(yè)界。其目標(biāo)是從物理上摧毀一個(gè)軍事目標(biāo),這使得網(wǎng)絡(luò)武器不僅僅只存在于那個(gè)人類創(chuàng)造的空間。網(wǎng)絡(luò)武器的潘多拉魔盒已經(jīng)打開(kāi)。 ?? 1.1.1 信息的定義 被交流的知識(shí) 關(guān)于客體(如事實(shí)、概念、事件、思想、過(guò)程等)的知識(shí)

    2023年04月24日
    瀏覽(23)
  • 《信息安全技術(shù)》學(xué)習(xí)筆記02

    《信息安全技術(shù)》學(xué)習(xí)筆記02

    目錄 一、計(jì)算機(jī)病毒概念 二、計(jì)算機(jī)病毒的主要特征: 三、計(jì)算機(jī)病毒分類 1.按照感染位置/傳染途徑: 2.按照操作系統(tǒng)類型: 3.按照寄生方式: 4.常見(jiàn)的惡意代碼術(shù)語(yǔ): 四、計(jì)算機(jī)病毒結(jié)構(gòu)一般結(jié)構(gòu)為: 五、計(jì)算機(jī)病毒的發(fā)展趨勢(shì): 計(jì)算機(jī)病毒的分析與防范 一、PE文件病

    2024年02月02日
    瀏覽(26)
  • 信息物理系統(tǒng)技術(shù)-學(xué)習(xí)筆記

    一.信息物理系統(tǒng)的概念 信息物理系統(tǒng)(cyber-physical system,CPS)這一術(shù)語(yǔ),最早由美國(guó)國(guó)家航空航天局于1992年提出。信息物理系統(tǒng)是控制系統(tǒng),嵌入式系統(tǒng)的擴(kuò)展與延伸,其涉及的相關(guān)底層理論技術(shù)源于對(duì)嵌入式技術(shù)的應(yīng)用與提升。然而,隨著信息化和工業(yè)化的 深度融合發(fā)展

    2024年02月11日
    瀏覽(26)
  • 網(wǎng)絡(luò)安全/信息安全—學(xué)習(xí)筆記

    網(wǎng)絡(luò)安全/信息安全—學(xué)習(xí)筆記

    網(wǎng)絡(luò)安全可以基于攻擊和防御視角來(lái)分類,我們經(jīng)常聽(tīng)到的 “紅隊(duì)”、“滲透測(cè)試” 等就是研究攻擊技術(shù),而“藍(lán)隊(duì)”、“安全運(yùn)營(yíng)”、“安全運(yùn)維”則研究防御技術(shù)。 無(wú)論網(wǎng)絡(luò)、Web、移動(dòng)、桌面、云等哪個(gè)領(lǐng)域,都有攻與防兩面性,例如 Web 安全技術(shù),既有 Web 滲透,也有

    2024年02月11日
    瀏覽(28)
  • .NET Core反射獲取帶有自定義特性的類,通過(guò)依賴注入根據(jù)Attribute元數(shù)據(jù)信息調(diào)用對(duì)應(yīng)的方法

    .NET Core反射獲取帶有自定義特性的類,通過(guò)依賴注入根據(jù)Attribute元數(shù)據(jù)信息調(diào)用對(duì)應(yīng)的方法

    前段時(shí)間有朋友問(wèn)道一個(gè)這樣的問(wèn)題,.NET Core中如何通過(guò)Attribute的元數(shù)據(jù)信息來(lái)調(diào)用標(biāo)記的對(duì)應(yīng)方法。我第一時(shí)間想到的就是通過(guò)C#反射獲取帶有Custom Attribute標(biāo)記的類,然后通過(guò)依賴注入(DI)的方式獲取對(duì)應(yīng)服務(wù)的方法并通過(guò)反射動(dòng)態(tài)執(zhí)行類的方法,從而實(shí)現(xiàn)更靈活的編程

    2023年04月15日
    瀏覽(31)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包