VUE + OPENLAYERS實現實時定位功能
前言
本系列文章介紹一個簡單的實時定位示例,示例的組成主要包括:
- 服務後端,使用 Java 語言編寫,模擬生成 GeoJSON 數據。
- 前端展示,使用 Vue + OpenLayers ,負責定時向後端服務請求 GeoJSON 數據,並在以標簽的形式展現定位數據。
實現的效果:
一、定義標簽樣式
var image = new CircleStyle({ radius: 5, fill: new Fill({ color: "rgba(255, 0, 0, 1)" }), stroke: new Stroke({ color: "red", width: 1 }) }); var styles = { Point: new Style({ image: image }) }; var styleFunction = function(feature) { return styles[feature.getGeometry().getType()]; };
二、模擬 GeoJSON 數據
var geojsonObject = { type: "FeatureCollection", features: [ { type: "Feature", geometry: { type: "Point", coordinates: [0, 0] } } //此處可以添加更多 feature ] };
三、創建 VerctorLayer
//讀取 GeoJSON, 將其作為 vectorSource 的數據源 var vectorSource = new VectorSource({ features: new GeoJSON().readFeatures(geojsonObject) }); var vectorLayer = new VectorLayer({ source: vectorSource, style: styleFunction });
四、構建地圖
mounted() { this.map = new Map({ layers: [ new TileLayer({ source: new OSM() }), vectorLayer ], target: "map", view: new View({ center: [0, 0], zoom: 2 }) }); //設置定時任務,調用移動標簽方法 setInterval(this.translate, 500); },
五、模擬實時移動
methods: { translate() { //遍歷標簽, 修改坐標位置 vectorSource.forEachFeature(function(f) { console.log("translate"); //隨機產生坐標增量(此處不是坐標絕對值!!!!) var x = Math.random() * 1000000; var y = Math.random() * 1000000; f.getGeometry().translate(x, y); }); } }
總結
以上是一個簡單實時定位前端示例,通過模擬的 GeoJSON 對象展示標簽,並通過定時任務模擬標簽位置變化。下一篇將使用 Java 服務端提供位置數據,完整模擬一個實時定位系統。
可以在vue項目中直接運行的完整代碼:
<template> <div> <span>hi, map</span> <div id="map" class="map"></div> </div> </template> <script lang="ts"> import "ol/ol.css"; import GeoJSON from "ol/format/GeoJSON"; import Map from "ol/Map"; import View from "ol/View"; import { Circle as CircleStyle, Fill, Stroke, Style } from "ol/style"; import { OSM, Vector as VectorSource } from "ol/source"; import { Tile as TileLayer, Vector as VectorLayer } from "ol/layer"; import Vue from "vue"; var image = new CircleStyle({ radius: 5, fill: new Fill({ color: "rgba(255, 0, 0, 1)" }), stroke: new Stroke({ color: "red", width: 1 }) }); var styles = { Point: new Style({ image: image }) }; var styleFunction = function(feature) { return styles[feature.getGeometry().getType()]; }; var geojsonObject = { type: "FeatureCollection", features: [ { type: "Feature", geometry: { type: "Point", coordinates: [0, 0] } } ] }; var vectorSource = new VectorSource({ features: new GeoJSON().readFeatures(geojsonObject) }); var vectorLayer = new VectorLayer({ source: vectorSource, style: styleFunction }); export default Vue.extend({ data() { return { map: {} }; }, mounted() { this.map = new Map({ layers: [ new TileLayer({ source: new OSM() }), vectorLayer ], target: "map", view: new View({ center: [0, 0], zoom: 2 }) }); setInterval(this.translate, 500); }, methods: { translate() { vectorSource.forEachFeature(function(f) { console.log("translate"); var x = Math.random() * 1000000; var y = Math.random() * 1000000; f.getGeometry().translate(x, y); }); } } }); </script> <style> .map { width: 100%; height: 600px; } </style>
到此這篇關於VUE + OPENLAYERS實現實時定位功能的文章就介紹到這瞭,更多相關VUE OPENLAYERS 定位內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Vue+penlayers實現多邊形繪制及展示
- vue項目中openlayers繪制行政區劃
- 基於Vue+Openlayer實現動態加載geojson的方法
- Vue+Openlayer中使用select選擇要素的實現代碼
- Vue+Openlayer批量設置閃爍點的實現代碼(基於postrender機制)