openlayers绘制图形添加至地图

###Map为初始化地图

import 'ol/ol.css';

import { Feature } from "ol";

import { Circle as CircleStyle, Fill, Stroke, Style, Icon } from 'ol/style';

import { Draw, Modify, Snap } from 'ol/interaction';

import { Vector as VectorSource } from 'ol/source';

import { Vector as VectorLayer } from 'ol/layer';

import GeoJSON from "ol/format/GeoJSON";

import { boundingExtent } from 'ol/extent';

import { Point } from 'ol/geom'

`// 初始化

init (type) {

`//type为绘制类型``

`const _that = this`

//清除次图层

if (_that.iconLayer) {

`_that.iconLayer.getSource().clear()`

}

// 移除绘制方法

Map.removeInteraction(_that.draw);

Map.removeInteraction(_that.snap);

// 创建矢量容器

_that.source = new VectorSource();

//创建矢量层

_that.iconLayer = new VectorLayer({

`source: _that.source,`

`style: this.styleFunction`

});

//创建绘制修改工具

const modify = new Modify({ source: _that.source });

//添加

Map.addInteraction(modify);

//绑定修改绘制图形触发事件

modify.on('modifyend', this.ModifyIconEnd);

//添加绘制工具

_that.addInteractions();

_that.draw = new Draw({

`source: _that.source,` //对应矢量容器

`type: _that.type,` /绘制类型

});

// 此方法用于保存拓扑关系

_that.snap = new Snap({ source: _that.source });

// 添加

Map.addInteraction(_that.draw);

Map.addInteraction(_that.snap);

// 监听绘制结束事件

_that.draw.on("drawend", (evt) => {

// 获取绘制图形,其余同修改时处理数据

let featureGeoJson = new GeoJSON().writeFeature(evt.feature);

});

//图层添加至地图

Map.addLayer(_that.iconLayer)

},

//样式函数

styleFunction (feature) {

const styles = [

`new Style({`

 `fill: new Fill({`

  `color: 'rgba(255, 255, 255, 0.2)',`

 `}),`

 `stroke: new Stroke({`

  `color: 'red',`

  `width: 2,`

 `}),`

 `image: new CircleStyle({`

  `radius: 7,`

  `fill: new Fill({`

   `color: '#ffcc33',`

  `}),`

 `}),`

`}),`

];

// 此处添加箭头样式,绘制线绘制箭头

if (this.type == 'LineString' && this.operate == 'arrow') {

`geometry.forEachSegment(function (start, end) {`

 `const dx = end[0] - start[0];`

 `const dy = end[1] - start[1];`

 `const rotation = Math.atan2(dy, dx);`

 `styles.push(`

  `new Style({`

   `geometry: new Point(end),`

   `image: new Icon({`

    `src: 'e6Images/ship/direction.png',`

    `anchor: [0.75, 0.5],`

    `rotateWithView: true,`

    `rotation: -rotation,`

   `}),`

  `})`

 `);`

`});`

}

//返回样式

return styles;

},

// 修改图形

ModifyIconEnd (evt) {

const _that = this

// 获取修改后的图形,并保存

let featureGeoJson = new GeoJSON().writeFeature(evt.features.array_[0]);

this.featureData = featureGeoJson

//绘制为圆时,无法通过geoJson回显,获取半径和中点回显

if (_that.type == 'Circle') {

`let centerLogLat, radius;`

// 圆的半径换算

`let metersPerUnit =Map.getView().getProjection().getMetersPerUnit();`

`let circle = evt.features.array_[0].getGeometry();`

`centerLogLat = circle.getCenter()`

`radius = circle.getRadius() * metersPerUnit;`

}

//绘制线段取绘制次序中点备用

else if (_that.type == 'LineString') {

`const data = JSON.parse(featureGeoJson)`

`const num = Math.floor(data.geometry.coordinates.length / 2)`

`_that.centerLogLat = data.geometry.coordinates[num]`

}

//绘制区域时获取其中点

else if (_that.type == 'Polygon') {

`let extent = evt.features.array_[0].getGeometry().getCoordinates()[0];`

//获取边界值

`var coor_bound = boundingExtent(extent);`

`var coor_date_x_min = coor_bound[0];`

`var coor_x_dis = (coor_bound[2] - coor_bound[0]) / 2;`

`var coor_date_y_min = coor_bound[1];`

`var coor_y_dis = (coor_bound[3] - coor_bound[1]) / 2;`

`var coor_num = [coor_date_x_min + coor_x_dis, coor_date_y_min + coor_y_dis];`

`_that.centerLogLat = coor_num`

}

},

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,423评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,147评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,019评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,443评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,535评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,798评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,941评论 3 407
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,704评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,152评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,494评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,629评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,295评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,901评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,978评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,333评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,499评论 2 348

推荐阅读更多精彩内容