123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411 |
- import * as ol from 'ol'
- import * as style from 'ol/style'
- import * as layer from 'ol/layer'
- import * as source from 'ol/source'
- import * as interaction from 'ol/interaction'
- import Modify from "ol/interaction/Modify"
- import {createBox} from "ol/interaction/Draw"
- import * as sphere from "ol/sphere";
- import {unByKey} from "ol/Observable";
- import {isValue} from "@/utils/util";
- import PointIcon from "@/assets/images/gis-layout/gis-layout-tools_tool-bz_icon.png"
- import {v4} from "uuid";
- const globalLineDash = [
- [0, 0],
- [15, 15],
- [5, 5]
- ]
- const layerFlag = ['layerName', 'toolDrawViewsLayer']
- const drawFlag = ['interactionName', 'toolDrawInteraction']
- const modifyFlag = ['interactionName', 'toolModifyInteraction']
- const baseDrawConfig = {
-
- text: null,
- pointIcon: PointIcon,
- pointScale: 1,
- pointOffset: [0, 24],
- rectangle: false,
- lineColor: '#2860F1',
- lineWidth: 2,
- lineType: 0,
- lineDash: null,
- polyColor: 'rgba(20, 129, 241, 0.1)',
- polyBorderColor: '#2860F1',
- polyBorderWidth: 2,
- polyBorderType: 0,
- polyBorderDash: null,
-
- show: false,
- featureType: 'Point',
- isPoint: false,
- isLineString: false,
- isPolygon: false,
- showPosition: false,
- refreshStyleFunc: () => {},
- }
- export const getBaseDrawConfig = () => {
- return JSON.parse(JSON.stringify(baseDrawConfig))
- }
- let toolDrawTooltipElement;
- let toolDrawHelpTooltipElement;
- export const draw = (map, obj) => {
- return new Promise((resolve => {
- if (!isValue(obj.textOffsetY)) {
- obj.textOffsetY = (obj.featureType === 'Point' ? -30 : 0)
- }
- let commonStyle = (showText, featureType = undefined) => {
- if ((featureType ?? obj.featureType) === 'Point') {
- return new style.Style({
- image: obj.pointIcon ? new style.Icon({
- src: obj.pointIcon,
- scale: obj.pointScale,
- displacement: obj.pointOffset
- }) : new style.Circle({
- radius: 10,
- fill: new style.Fill({
- color: '#e810dd',
- }),
- scale: obj.pointScale,
- displacement: obj.pointOffset
- }),
- text: (showText && obj.text) ? new style.Text({
- font: "16px bold 微软雅黑",
- text: obj.text,
- fill: new style.Fill({
- color: '#ffffff'
- }),
- stroke: new style.Stroke({
- color: '#D26CDB',
- width: 2
- }),
- offsetY: obj.textOffsetY,
- }) : undefined,
- })
- } else if ((featureType ?? obj.featureType) === 'LineString') {
- return new style.Style({
- stroke: new style.Stroke({
- color: obj.lineColor,
- width: obj.lineWidth,
- lineDash: obj.lineDash ?? globalLineDash[Number(obj.lineType)]
- }),
- text: (showText && obj.text) ? new style.Text({
- font: "16px bold 微软雅黑",
- text: obj.text,
- fill: new style.Fill({
- color: '#ffffff'
- }),
- stroke: new style.Stroke({
- color: '#D26CDB',
- width: 2
- }),
- offsetY: obj.textOffsetY,
- }) : undefined,
- })
- } else if ((featureType ?? obj.featureType) === 'Polygon' || (featureType ?? obj.featureType) === 'Circle') {
- return new style.Style({
- stroke: new style.Stroke({
- color: obj.polyBorderColor,
- width: obj.polyBorderWidth,
- lineDash: obj.polyBorderDash ?? globalLineDash[Number(obj.polyBorderType)]
- }),
- fill: new style.Fill({
- color: obj.polyColor,
- }),
- text: (showText && obj.text) ? new style.Text({
- font: "16px bold 微软雅黑",
- text: obj.text,
- fill: new style.Fill({
- color: '#ffffff'
- }),
- stroke: new style.Stroke({
- color: '#D26CDB',
- width: 2
- }),
- offsetY: obj.textOffsetY,
- }) : undefined,
- })
- }
- }
- const reset = () => {
- const oldLayer = map.getLayers().getArray().filter(v => v.get(layerFlag[0]) === layerFlag[1])
- if (oldLayer) {
- map.removeLayer(oldLayer[0])
- }
- const oldDraw = map.getInteractions().getArray().filter(v => v.get(drawFlag[0]) === drawFlag[1])
- if (oldDraw) {
- map.removeInteraction(oldDraw[0])
- }
- const oldModify = map.getInteractions().getArray().filter(v => v.get(modifyFlag[0]) === modifyFlag[1])
- if (oldModify) {
- map.removeInteraction(oldModify[0])
- }
- }
- if (!toolDrawTooltipElement) {
-
- let _source
- const realLayer = map.getLayers().getArray().filter(v => v.get(layerFlag[0]) === layerFlag[1])
- if (realLayer[0]) {
- _source = realLayer[0].getSource()
- } else {
- _source = new source.Vector();
- const _vector = new layer.Vector({
- zIndex: 9999,
- source: _source,
- style: (feat: any) => {
- feat.setStyle(commonStyle(true, feat.getGeometry().getType()))
- },
- });
- _vector.set(layerFlag[0], layerFlag[1])
- map.addLayer(_vector);
- }
- const modifyInteraction = new Modify({
- source: _source,
- });
- modifyInteraction.set(modifyFlag[0], modifyFlag[1])
- map.addInteraction(modifyInteraction)
- modifyInteraction.on('modifyend', evt => {
- try {
- const feat = evt.features.item(0)
- } catch {
- }
- })
- if (!obj.wkt) {
- let sketch;
- let helpTooltip;
- let measureTooltip;
- let continueMsg = '双击结束标绘';
- const geodesicCheckbox = true;
- const createMeasureTooltip = () => {
- const id = 'toolDrawTooltipElementId'
- if (toolDrawTooltipElement) {
- map.removeOverlay(map.getOverlayById(id))
- toolDrawTooltipElement.parentNode.removeChild(toolDrawTooltipElement);
- }
- toolDrawTooltipElement = document.createElement('div');
- toolDrawTooltipElement.className = 'tooltip tooltip-measure';
- measureTooltip = new ol.Overlay({
- id,
- element: toolDrawTooltipElement,
- offset: [0, -15],
- positioning: 'bottom-center'
- });
- map.addOverlay(measureTooltip);
- }
- const createHelpTooltip = () => {
- const id = 'toolDrawHelpTooltipElementId'
- if (toolDrawHelpTooltipElement) {
- map.removeOverlay(map.getOverlayById(id))
- toolDrawHelpTooltipElement.parentNode.removeChild(toolDrawHelpTooltipElement);
- }
- toolDrawHelpTooltipElement = document.createElement('div');
- toolDrawHelpTooltipElement.className = 'tooltip hidden';
- helpTooltip = new ol.Overlay({
- id,
- element: toolDrawHelpTooltipElement,
- offset: [15, 0],
- positioning: 'center-left'
- });
- map.addOverlay(helpTooltip);
- }
- const formatLength = (line) => {
-
- const sourceProj = map.getView().getProjection();
-
- const length = sphere.getLength(line, {projection: sourceProj});
-
- let output;
- if (length > 100) {
- const km = Math.round((length / 1000) * 100) / 100;
- output = `${km} 千米 <br>${parseFloat(String(km * 0.53995)).toFixed(2)} 海里`;
- } else {
- output = `${Math.round(length * 100) / 100} m`;
- }
- return output;
- };
-
- const getCircleArea = (circle, projection) => {
- const P = 3.14
- const radius = getCircleRadius(circle, projection)
- return P * radius * radius
- }
-
- const getCircleRadius = (circle, projection) => {
- return circle.getRadius() * projection.getMetersPerUnit()
- }
- const formatArea = (polygon, type= 'polygon') => {
- let area
- const sourceProj = map.getView().getProjection();
-
- if (type === 'polygon') {
- area = sphere.getArea(polygon, {
- projection: sourceProj,
- });
- } else if (type === 'circle') {
- area = getCircleArea(polygon, sourceProj)
- }
- let output;
- if (area > 10000) {
- const km = Math.round((area / 1000000) * 100) / 100;
- output = `${km} 平方公里<br>${parseFloat(String(km * 0.38610)).toFixed(
- 2
- )} 平方英里`;
- } else {
- output = `${Math.round(area * 100) / 100} ` + " m<sup>2</sup>";
- }
- return output;
- };
- const addInteraction = () => {
- const id = 'baseDrawName'
- const draw = new interaction.Draw({
- source: _source,
- type: obj.rectangle ? 'LineString' : obj.featureType,
-
-
- geometryFunction: obj.rectangle ? createBox() : null,
-
- style: commonStyle(obj.featureType === 'Point' ? true : false),
- });
- draw.set('showText', obj.featureType === 'Point' ? true : false)
- draw.set(drawFlag[0], drawFlag[1])
- draw.set(id, id)
- createMeasureTooltip();
- createHelpTooltip();
- map.addInteraction(draw);
- let listener;
-
- const drawstartHandle = (evt) => {
- sketch = evt.feature;
- let tooltipCoord = evt.coordinate;
-
- listener = sketch.getGeometry().on('change', function (evt) {
- const geom = evt.target
- let output;
- if (geom.getType() === 'LineString') {
- output = formatLength(geom);
- tooltipCoord = geom.getLastCoordinate();
- } else if (geom.getType() === 'Polygon') {
- output = formatArea(geom);
- tooltipCoord = geom.getInteriorPoint().getCoordinates();
- } else if (geom.getType() === 'Circle') {
- output = formatArea(geom, 'circle');
- tooltipCoord = geom.getCenter()
- }
- toolDrawTooltipElement.innerHTML = output;
- measureTooltip.setPosition(tooltipCoord);
- });
- }
- draw.on('drawstart', drawstartHandle);
-
- const copy = (value) => {
- const str = document.createElement('input')
- str.setAttribute('value', value)
- document.body.appendChild(str)
- str.select()
- document.execCommand('copy')
- document.body.removeChild(str)
- }
- const drawendHandle = (evt) => {
- map.removeInteraction(map.getInteractions().getArray().filter(v => v.get(id) === id)[0]);
-
- map.removeOverlay(map.getOverlayById('baseDrawHelpTooltipElementId'))
- toolDrawTooltipElement.parentNode.removeChild(toolDrawTooltipElement);
- sketch = null;
- toolDrawTooltipElement = null;
- toolDrawHelpTooltipElement.parentNode.removeChild(toolDrawHelpTooltipElement);
- toolDrawHelpTooltipElement = null;
- unByKey(listener);
- draw.un('drawstart', drawstartHandle);
- draw.un('drawend', drawendHandle);
- map.removeInteraction(map.getInteractions().getArray().filter(v => v.get(id) === id)[0]);
- map.un('pointermove', pointerMoveHandler)
- const featEnd = evt.feature
- featEnd.set('isInit', true)
- featEnd.set(layerFlag[0], layerFlag[1])
- featEnd.setId(v4())
- }
- draw.on('drawend', drawendHandle);
- }
- addInteraction();
- const pointerMoveHandler = (evt) => {
- if (evt.dragging) {
- return;
- }
- let helpMsg = '单击开始标绘';
-
- if (sketch) {
- const geom = sketch.getGeometry()
- helpMsg = continueMsg;
-
-
-
-
-
- }
- toolDrawHelpTooltipElement.innerHTML = helpMsg;
- helpTooltip.setPosition(evt.coordinate);
- toolDrawHelpTooltipElement.classList.remove('hidden');
- };
- map.on('pointermove', pointerMoveHandler);
-
- try {
- map.getViewport().on('mouseout', () => {
- toolDrawHelpTooltipElement.addClass('hidden');
- });
- } catch (e) {
- }
- }
- }
- resolve(() => {
- const oldLayer = map.getLayers().getArray().filter(v => v.get(layerFlag[0]) === layerFlag[1])
- if (oldLayer) {
- oldLayer[0].setStyle(commonStyle(true))
- }
-
-
-
-
- })
- }))
- }
- export const refreshModify = (map, _source) => {
- const oldModify = map.getInteractions().getArray().filter(v => v.get(modifyFlag[0]) === modifyFlag[1])
- if (oldModify) {
- map.removeInteraction(oldModify[0])
- }
- const modifyInteraction = new Modify({
- source: _source,
- });
- modifyInteraction.set(modifyFlag[0], modifyFlag[1])
- map.addInteraction(modifyInteraction)
- modifyInteraction.on('modifyend', evt => {
- try {
- const feat = evt.features.item(0)
- } catch {
- }
- })
- }
|