Vue+Openlayer實現(xiàn)圖形的拖動和旋轉變形效果
前言
openlayer 是有他自己的擴展插件 ol-ext,我們這里用他來實現(xiàn)圖形的操作:拖拽、旋轉、縮放、拉伸、移動等等功能,以及他的監(jiān)聽事件,畢竟我們作圖以后是需要保存數(shù)據(jù)給后端,存到數(shù)據(jù)庫的。
相關資料
1、ol-ext官方地址:入口
2、ol-ext 對應的資料地址:入口
3、ol-ext 源碼gitee地址:入口
4、openlayers 最新官網(wǎng):入口
5、openlayers 官網(wǎng)api:入口
實現(xiàn)效果
旋轉、拖動

圖1、實現(xiàn)效果

圖2、旋轉效果

圖3、左右移動效果
?實現(xiàn)步驟
1、vue中引入openlayers
npm i ol --save
附:npm下載指定版本命令,需要可以拿去
npm install --save-dev ol@6.9.0
2、vue中引入 openlayers的擴展包? ?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有關:
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有關:
import ExtTransform from 'ol-ext/interaction/Transform'
5、實現(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 = [
//深藍色背景
// 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() {
//添加圖層,并設置點范圍
const polygon = new Feature({
geometry: new Polygon([
[
[116.39314093500519,40.0217660530101],
[116.47762344990831,39.921746523871924],
[116.33244947314951,39.89892653421418],
[116.30623076162784,40.00185925352143],
]
]),
})
//設置樣式
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, // 旋轉
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);
});
//旋轉
transform.on('rotating', function (e){
console.log(2222);
console.log("rotate: "+((e.angle*180/Math.PI -180)%360+180).toFixed(2));
console.log(e);
});
//移動
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);
});
//事件結束
transform.on(['rotateend', 'translateend', 'scaleend'], function (e) {
console.log(5555);
});
},
到此這篇關于Vue+Openlayer實現(xiàn)圖形的拖動和旋轉變形效果的文章就介紹到這了,更多相關Vue Openlayer內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Vue基于iview table展示圖片實現(xiàn)點擊放大
這篇文章主要介紹了Vue基于iview table展示圖片實現(xiàn)點擊放大,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-08-08

