Vue+Openlayer實(shí)現(xiàn)圖形的拖動(dòng)和旋轉(zhuǎn)變形效果
前言
openlayer 是有他自己的擴(kuò)展插件 ol-ext,我們這里用他來實(shí)現(xiàn)圖形的操作:拖拽、旋轉(zhuǎn)、縮放、拉伸、移動(dòng)等等功能,以及他的監(jiān)聽事件,畢竟我們作圖以后是需要保存數(shù)據(jù)給后端,存到數(shù)據(jù)庫的。
相關(guān)資料
1、ol-ext官方地址:入口
2、ol-ext 對應(yīng)的資料地址:入口
3、ol-ext 源碼gitee地址:入口
4、openlayers 最新官網(wǎng):入口
5、openlayers 官網(wǎng)api:入口
實(shí)現(xiàn)效果
旋轉(zhuǎn)、拖動(dòng)
圖1、實(shí)現(xiàn)效果
圖2、旋轉(zhuǎn)效果
圖3、左右移動(dòng)效果
?實(shí)現(xiàn)步驟
1、vue中引入openlayers
npm i ol --save
附:npm下載指定版本命令,需要可以拿去
npm install --save-dev ol@6.9.0
2、vue中引入 openlayers的擴(kuò)展包? ?ol-ext
npm install ol-ext --save
附:npm下載指定版本命令,需要可以拿去
npm install --save ol-ext@3.2.16
3、創(chuàng)建地圖容器
<template> <div id="map" class="map"></div> </template>
4、js中引入具體配置,根據(jù)你的具體改,我這里放的是我自己的
ol有關(guān):
import "ol/ol.css"; import View from "ol/View"; import Map from "ol/Map"; import TileLayer from "ol/layer/Tile"; import Overlay from "ol/Overlay"; import XYZ from "ol/source/XYZ"; import { Vector as SourceVec ,Cluster,Vector as VectorSource } from "ol/source"; import { Feature } from "ol"; import { Vector as LayerVec , Vector as VectorLayer } from "ol/layer"; import { Point, LineString, Polygon } from "ol/geom"; import { Style, Icon, Fill, Stroke, Text, Circle as CircleStyle, } from "ol/style"; import { OSM, TileArcGISRest } from "ol/source";
ol-ext有關(guān):
import ExtTransform from 'ol-ext/interaction/Transform'
5、實(shí)現(xiàn)地圖方法:
data() { return { map: null, center: [116.39702518856394, 39.918590567855425], //北京故宮的經(jīng)緯度 centerSize: 11.5, projection: "EPSG:4326", } }
mounted() { this.initMap() }
methods: { //初始化地圖 initMap() { //渲染地圖 var layers = [ //深藍(lán)色背景 // new TileLayer({ // source: new XYZ({ // url: // "https://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetPurplishBlue/MapServer/tile/{z}/{y}/{x}", // }), // }), //初始化背景 // new TileLayer({ // source: new OSM(), // }) new TileLayer({ title: "街道圖", source: new XYZ({ url: "http://localhost:8888/haoxing-map/sosomaps/roadmap/{z}/{x}/{y}.jpg",//zwh本地使用 }), }), ]; this.map = new Map({ layers: layers, target: "map", view: new View({ center: this.center, projection: this.projection, zoom: this.centerSize, maxZoom: 17, minZoom: 8, }), }); },
6、地圖上加上多邊形數(shù)據(jù)
mounted() { this.initMap() this.createPolygon() },
methods: { //創(chuàng)建多邊形 createPolygon() { //添加圖層,并設(shè)置點(diǎn)范圍 const polygon = new Feature({ geometry: new Polygon([ [ [116.39314093500519,40.0217660530101], [116.47762344990831,39.921746523871924], [116.33244947314951,39.89892653421418], [116.30623076162784,40.00185925352143], ] ]), }) //設(shè)置樣式 polygon.setStyle(new Style({ stroke: new Stroke({ width: 4, color: [255, 0, 0, 1], }), })) //將圖形加到地圖上 this.map.addLayer(new VectorLayer({ source: new VectorSource({ features: [polygon], }), })) }, }
7、地圖上添加具體的操作方法和效果?
mounted() { this.initMap() this.createPolygon() this.onEdit() },
//操作事件 onEdit() { const transform = new ExtTransform({ enableRotatedTransform: false, hitTolerance: 2, translate: true, // 拖拽 stretch: false, // 拉伸 scale: true, // 縮放 rotate: true, // 旋轉(zhuǎn) translateFeature: false, noFlip: true, // layers: [], }) this.map.addInteraction(transform) //開始事件 transform.on(['rotatestart','translatestart'], function(e){ // Rotation let startangle = e.feature.get('angle')||0; // Translation console.log(1111); console.log(startangle); }); //旋轉(zhuǎn) transform.on('rotating', function (e){ console.log(2222); console.log("rotate: "+((e.angle*180/Math.PI -180)%360+180).toFixed(2)); console.log(e); }); //移動(dòng) transform.on('translating', function (e){ console.log(3333); console.log(e.delta); console.log(e); }); //拖拽事件 transform.on('scaling', function (e){ console.log(4444); console.log(e.scale); console.log(e); }); //事件結(jié)束 transform.on(['rotateend', 'translateend', 'scaleend'], function (e) { console.log(5555); }); },
到此這篇關(guān)于Vue+Openlayer實(shí)現(xiàn)圖形的拖動(dòng)和旋轉(zhuǎn)變形效果的文章就介紹到這了,更多相關(guān)Vue Openlayer內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue實(shí)現(xiàn)導(dǎo)航標(biāo)題欄隨頁面滾動(dòng)漸隱漸顯效果
這篇文章主要介紹了vue實(shí)現(xiàn)導(dǎo)航標(biāo)題欄隨頁面滾動(dòng)漸隱漸顯效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03Vue關(guān)于Element UI中的文本域換行問題
這篇文章主要介紹了Vue關(guān)于Element UI中的文本域換行問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03Vue插槽slot詳細(xì)介紹(對比版本變化,避免踩坑)
Vue中的Slot對于編寫可復(fù)用可擴(kuò)展的組件是再合適不過了,下面這篇文章主要給大家介紹了關(guān)于Vue插槽slot詳細(xì)介紹的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06Vue基于iview table展示圖片實(shí)現(xiàn)點(diǎn)擊放大
這篇文章主要介紹了Vue基于iview table展示圖片實(shí)現(xiàn)點(diǎn)擊放大,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08Vue組件實(shí)例間的直接訪問實(shí)現(xiàn)代碼
在組件實(shí)例中,Vue提供了相應(yīng)的屬性,包括$parent、$children、$refs和$root,這些屬性都掛載在組件的this上。本文將詳細(xì)介紹Vue組件實(shí)例間的直接訪問,需要的朋友可以參考下2017-08-08