167.在Vue3中使用OpenLayers模仿共享單車,判斷點是否放在規劃的電子圍欄內

一、前言

大家好,這里分享一個 Vue3 + OpenLayers 的小案例
模仿共享單車的電子圍欄功能,用戶在地圖上繪制停泊點時,系統會自動判斷該點是否在規劃好的電子圍欄內(多邊形或圓形)。

這個功能在實際項目中有很大應用場景,比如:

  • 共享單車/電動車:判斷用戶還車是否在規定區域;

  • 物流調度:判斷車輛停靠是否在任務范圍內;

  • 園區/景區管理:判斷人員是否進入限制區域。

下面我們通過一個完整的 Vue3 + OpenLayers 示例來實現。


三、功能效果


二、環境依賴

  • Vue3 + Vite + TypeScript

  • OpenLayers (ol)

  • Element Plus(消息提示用)

安裝依賴:

npm install ol element-plus

四、核心實現思路

  1. 初始化地圖:加載 OSM 底圖,添加一個點圖層和一個圍欄圖層。

  2. 繪制電子圍欄:提前設置一個多邊形區域和一個圓形區域。

  3. 交互繪制點:通過 Draw 交互讓用戶選擇停泊點。

  4. 判斷點是否在圍欄內:利用 geometry.intersectsCoordinate(coord) 方法判斷坐標是否落在圍欄內。

  5. 消息提示:使用 ElMessage 提示用戶結果。


五、完整代碼示例

<!--* @Author: 彭麒* @Date: 2025/9/4* @Email: 1062470959@qq.com* @Description: 此源碼版權歸吉檀迦俐所有,可供學習和借鑒或商用。-->
<template><div class="container"><div class="w-full flex justify-center flex-wrap"><div class="font-bold text-[24px]">vue3+openlayers: 模仿共享單車,判斷點是否放在規劃的電子圍欄內</div></div><h4><el-button type="primary" size="small" @click="drawImage">繪制停泊點</el-button></h4><div id="vue-openlayers"></div></div>
</template><script setup lang="ts">
import "ol/ol.css";
import { onMounted, ref } from "vue";
import { Map, View } from "ol";
import Tile from "ol/layer/Tile";
import OSM from "ol/source/OSM";
import LayerVector from "ol/layer/Vector";
import SourceVector from "ol/source/Vector";
import Fill from "ol/style/Fill";
import Feature from "ol/Feature";
import { Point, Circle as OLCircle, Polygon } from "ol/geom";
import Stroke from "ol/style/Stroke";
import Style from "ol/style/Style";
import CircleStyle from "ol/style/Circle";
import Draw from "ol/interaction/Draw";
import { ElMessage } from "element-plus";// 地圖對象
const map = ref<Map | null>(null);
const draw = ref<Draw | null>(null);// 點數據源
const source = new SourceVector({wrapX: false,
});// 圍欄數據源
const dataSource = new SourceVector({wrapX: false,
});// 多邊形數據
const polygonData = [[[116.005, 39.005],[115.006, 40.008],[112.008, 39.008],[116.005, 39.005],],
];// 圓形數據
const circleData = {circleCenter: [115.992, 38.5],circleRadius: 0.5,
};// 顯示多邊形
const showPolygon = () => {const polygonFeature = new Feature({geometry: new Polygon(polygonData),});dataSource.addFeature(polygonFeature);
};// 顯示圓形
const showCircle = () => {const circleFeature = new Feature({geometry: new OLCircle(circleData.circleCenter, circleData.circleRadius),});dataSource.addFeature(circleFeature);
};// 初始化地圖
const initMap = () => {const mapLayer = new Tile({source: new OSM(),});const pointLayer = new LayerVector({source: source,style: new Style({image: new CircleStyle({radius: 5,fill: new Fill({color: "#f0f",}),}),}),});const weilan = new LayerVector({source: dataSource,style: new Style({fill: new Fill({color: "transparent",}),stroke: new Stroke({width: 2,color: "red",}),}),});map.value = new Map({target: "vue-openlayers",layers: [mapLayer, weilan, pointLayer],view: new View({projection: "EPSG:4326",center: [115.006, 39.508],zoom: 8,}),});
};// 繪制停泊點
const drawImage = () => {if (!map.value) return;source.clear();// 停止上一次繪制if (draw.value !== null) {map.value.removeInteraction(draw.value);}draw.value = new Draw({source: source,type: "Point",});map.value.addInteraction(draw.value);draw.value.on("drawend", (e) => {if (!map.value) return;map.value.removeInteraction(draw.value as Draw);const coord = (e.feature.getGeometry() as Point).getCoordinates();const arr = dataSource.getFeatures();let flag = 0;for (let i = 0; i < arr.length; i++) {const polygonGeometry = arr[i].getGeometry();if (polygonGeometry?.intersectsCoordinate(coord)) {flag++;}}if (flag) {ElMessage.success({message: "在電子圍欄內",duration: 1000,});} else {ElMessage.error({message: "在電子圍欄外",duration: 1000,});}});
};onMounted(() => {initMap();showPolygon();showCircle();
});
</script><style scoped>
.container {width: 840px;height: 600px;margin: 50px auto;border: 1px solid #42b983;
}#vue-openlayers {width: 800px;height: 430px;margin: 0 auto;border: 1px solid #42b983;position: relative;
}
</style>


七、總結與擴展

本文實現了一個 基礎電子圍欄判斷功能,在真實業務中可以擴展為:

  • 支持多圍欄:一個城市多個禁停區/允許停放區;

  • 圍欄編輯:后臺管理系統可視化繪制/修改電子圍欄;

  • 軌跡回放:判斷車輛行駛軌跡是否進入圍欄;

  • 性能優化:大規模電子圍欄渲染(可用 GeoJSON 數據源)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/921602.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/921602.shtml
英文地址,請注明出處:http://en.pswp.cn/news/921602.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

鍵盤上面有F3,四,R,F,V,按下沒有反應,維修記錄

打開游戲&#xff0c;按了好幾遍F&#xff0c;結果都沒反應&#xff0c;但是左右上下行走是沒問題的。一臉懵逼&#xff1f;&#xff1f;&#xff1f;打開鍵盤測試網頁&#xff0c;發現有一列沒反應&#xff0c;F1不是&#xff0c;F1我定義了一個快捷鍵&#xff0c;跟測試沖突了…

8051單片機-成為點燈大師

第三章 成為點燈大師 1. 硬件設計 上一章說到&#xff0c;怎么點亮LED燈&#xff0c;很簡單啊&#xff0c;就是把P2口設置成低電平就行了。接下來讓我們更進一步&#xff0c;完成LED閃爍、流水燈實驗2. 軟件設計 2.1 LED閃爍實驗 為了使LED閃爍&#xff0c;我們自然而然的想到要…

Rust 日志庫完全指南:從入門到精通

GitHub 倉庫: https://github.com/zhouByte-hub/rust-study ? 如果這個項目對您有幫助&#xff0c;請給我一個 star&#xff01; 在 Rust 生態系統中&#xff0c;日志處理是一個至關重要的環節。無論是開發小型應用還是大型系統&#xff0c;良好的日志記錄都能幫助我們追蹤問題…

【科研繪圖系列】R語言繪制論文合集圖

禁止商業或二改轉載,僅供自學使用,侵權必究,如需截取部分內容請后臺聯系作者! 文章目錄 介紹 數據準備與過濾 統計分析 可視化繪圖 抗藥性分析 系統發育分析 加載R包 數據下載 Supp figure 1 Fig 1a Fig 1c Fig 1d Fig 1e Fig 1f Supp figure 3 Supp figure 4 Supp figure 5…

【c++】從三個類的設計看軟件架構的哲學思考

從三個類的設計看軟件架構的哲學思考 文章目錄從三個類的設計看軟件架構的哲學思考前言一、OP類&#xff1a;系統工程的安全守護者設計特點設計哲學適用場景現實類比二、VarReviser類&#xff1a;版本控制的嚴謹管理者設計特點設計哲學適用場景現實類比三、Model類&#xff1a;…

人工智能優化SEO關鍵詞的實戰策略

本文聚焦智能技術如何革新關鍵詞優化實踐&#xff0c;系統解析提升網站排名的核心路徑。重點探討語義分析如何精準匹配用戶意圖、長尾詞智能挖掘怎樣解鎖高潛力流量&#xff0c;并詳解工具篩選高轉化關鍵詞的五大實用策略。通過實戰案例說明技術如何突破流量增長瓶頸&#xff0…

【c++】c++第一課:命名空間

文章目錄1.C的第?個程序2.命名空間2.1 namespace的價值2.2 namespace的定義2.3 命名空間使?最新的c標準&#xff08;建議收藏&#xff09; 1.C的第?個程序 C兼容C語?絕?多數的語法&#xff0c;所以C語?實現的helloworld依舊可以運?&#xff0c;C中需要把定義?件代碼后…

版本發布流程手冊:Release分支規范與Bug分級標準全解析

在軟件交付日益高頻、用戶需求快速迭代的今天&#xff0c;版本發布流程的規范性直接決定了團隊的交付效率、產品質量和用戶滿意度。然而&#xff0c;許多團隊仍面臨以下痛點&#xff1a; 發布混亂&#xff1a;分支管理隨意&#xff0c;代碼沖突頻發&#xff1b;質量失控&#…

什么是CA根證書

CA 根證書&#xff08;Certificate Authority Root Certificate&#xff09;是 數字證書體系&#xff08;PKI&#xff0c;Public Key Infrastructure&#xff09; 中的核心證書。它有幾個關鍵點&#xff1a;1. 定義 CA&#xff08;Certificate Authority&#xff09;&#xff1…

git push -u origin main 這個-u起什么作用

git push -u origin main 里的 -u 等價于 --set-upstream&#xff0c;它的作用是&#xff1a;&#x1f449; 把本地分支 main 和遠程分支 origin/main 綁定&#xff08;建立追蹤關系&#xff09;。&#x1f539; 具體效果第一次推送分支時&#xff0c;如果加了 -u&#xff1a;本…

【Unity基礎】兩個關于UGUI中Text對非英文字體支持的問題

問題1&#xff1a;Unity中為什么UGUI中的Text(Textmeshpro&#xff09;默認不支持非英文字體&#xff0c;而legacy中的text卻可以呢&#xff1f; 在Unity中&#xff0c;TextMeshPro&#xff08;TMP&#xff09;默認不支持非英文字體&#xff0c;而Legacy Text支持&#xff0c;主…

碎片時間干活的好手(requestIdleCallback)

&#x1f7e2; What —— 它是什么&#xff1f; requestIdleCallback(callback[, options]) 是瀏覽器提供的一個 API&#xff0c;用來在主線程空閑時執行一些優先級不高的任務。 它的特點&#xff1a; 異步執行&#xff1a;不會打斷關鍵的渲染、交互、動畫。節省性能&#xff1…

第三方網站測評:【WEB應用文件包含漏洞(LFI/RFI)的測試步驟】

文件包含漏洞分為本地文件包含(LFI)和遠程文件包含(RFI)兩類。LFI允許讀取服務器本地文件,RFI可執行遠程服務器上的惡意代碼。PHP應用中include()、require()等函數未正確過濾用戶輸入時易產生此類漏洞。 檢測URL中可能包含文件的參數,常見特征如下: 參數名包含file、pa…

網絡爬蟲(web crawler)

文章目錄一、什么是網絡爬蟲二、爬蟲工作流程詳解第1步&#xff1a;起始點 - URL種子庫&#xff08;Seed URLs&#xff09;第2步&#xff1a;大腦 - 調度器&#xff08;Scheduler&#xff09;第3步&#xff1a;雙手 - 網頁下載器&#xff08;Downloader&#xff09;第4步&#…

redis的高可用(哨兵)

Redis 的主從復制模式下&#xff0c;一旦主節點由于故障不能提供服務&#xff0c;需要人工進行主從切換&#xff0c;同時大量的客戶端需要被通知切換到新的主節點上&#xff0c;對于上了一定規模的應用來說&#xff0c;這種方案是無法接受的&#xff0c;于是Redis從2.8開始提供…

安徽某能源企業積極推進運維智能化轉型,引入高壓配電房機器人巡檢系統

在工業自動化與智能化深度融合的當下&#xff0c;機器人技術已成為能源行業提質增效的關鍵支撐。特別是在配電房這類高壓電力核心區域的運維工作中&#xff0c;傳統人工巡檢不僅面臨效率低下、巡檢周期長的困境&#xff0c;更因人員直接接觸高壓設備而存在極高的安全風險。此&a…

數據結構_二叉平衡樹

#include <stdio.h> #include <stdlib.h> #define max(a,b) ((a > b)? (a):(b))//平衡二叉樹的節點結構 typedef struct AVL_TreeNode{int data; //數據域struct AVL_TreeNode* l;struct AVL_TreeNode* r;int h;//記錄樹的高度&#xff0c;用于計算平衡因子 }…

掃描件、PDF、圖片都能比對!讓文檔差異無所遁形

智能文檔比對系統可精準識別文檔差異&#xff0c;解決金融、法律等多方協作場景下的版本混亂、審核低效和合規風險問題&#xff0c;將一份百頁文檔的人工核對從數小時縮短至3分鐘以內。 文檔差異比對常見場景有哪些&#xff1f; 每一次文檔的修改都可能帶來潛在風險&#xff0c…

excel里面店鋪這一列的數據結構是2C【uniteasone17】這種,我想只保留前面的2C部分,后面的【uniteasone17】不要

這個結構是&#xff1a; 2C【uniteasone17】只要取前面的 2C 部分&#xff0c;可以用 Excel 的 公式 或者 文本函數 來實現。 方法 1&#xff1a;使用公式提取 假設店鋪數據在 A2 單元格&#xff1a; LEFT(A2,FIND("【",A2)-1)&#x1f449; 解釋&#xff1a; FIND(“…

四、神經網絡的學習(中)

4.3 數值微分梯度法使用梯度的信息決定前進的方向。本節將介紹梯度是什么、有什么性質等內容。4.3.1 導數假如你是全程馬拉松選手&#xff0c;在開始的10分鐘內跑了2千米。如果要計算此時的奔跑速度&#xff0c;則為2/10 0.2&#xff3b;千米/分&#xff3d;。也就是說&#x…