2767 lines
70 KiB
JavaScript
2767 lines
70 KiB
JavaScript
import Map from "@arcgis/core/Map";
|
||
import MapView from "@arcgis/core/views/MapView";
|
||
import TianData from './Tmap'
|
||
import TileInfo from "@arcgis/core/layers/support/TileInfo";
|
||
import WebTileLayer from "@arcgis/core/layers/WebTileLayer";
|
||
import TileLayer from "@arcgis/core/layers/TileLayer.js";
|
||
import MapImageLayer from "@arcgis/core/layers/MapImageLayer.js";
|
||
import Draw from "@arcgis/core/views/draw/Draw.js";
|
||
import Polyline from "@arcgis/core/geometry/Polyline.js";
|
||
import Polygon from "@arcgis/core/geometry/Polygon.js";
|
||
import Graphic from "@arcgis/core/Graphic.js";
|
||
import Point from "@arcgis/core/geometry/Point.js";
|
||
import GraphicsLayer from "@arcgis/core/layers/GraphicsLayer.js";
|
||
import SketchViewModel from "@arcgis/core/widgets/Sketch/SketchViewModel.js";
|
||
import useMapDataStore from "@map/store/modules/mapData"
|
||
import useMapLogStore from "@map/store/modules/mapLog"
|
||
import * as webMercatorUtils from "@arcgis/core/geometry/support/webMercatorUtils.js";
|
||
import * as geometryEngine from "@arcgis/core/geometry/geometryEngine.js";
|
||
import CIMSymbol from "@arcgis/core/symbols/CIMSymbol.js";
|
||
import * as geodesicUtils from "@arcgis/core/geometry/support/geodesicUtils.js";
|
||
import MapNotesLayer from "@arcgis/core/layers/MapNotesLayer.js";
|
||
import DistanceMeasurement2D from "@arcgis/core/widgets/DistanceMeasurement2D.js";
|
||
import * as print from "@arcgis/core/rest/print.js";
|
||
import PrintTemplate from "@arcgis/core/rest/support/PrintTemplate.js";
|
||
import PrintParameters from "@arcgis/core/rest/support/PrintParameters.js";
|
||
import * as turf from '@turf/turf'
|
||
|
||
import emitter from "../emitter";
|
||
|
||
const symbolData = {
|
||
House: [255, 0, 0, 0.6],
|
||
Road: [118, 116, 218, 0.9],
|
||
River: [94, 208, 81, 0.9]
|
||
}
|
||
|
||
let mapLog = ''
|
||
let logOldGeometry = []
|
||
|
||
let self = '';
|
||
const ldMap = {
|
||
map: '',
|
||
view: '',
|
||
nowlayer: '',
|
||
sketchLayer: {
|
||
pointLayer: '',
|
||
polylineLayer: '',
|
||
polygonLayer: '',
|
||
selectGraphic: null
|
||
},
|
||
pointSketchViewModel: '',
|
||
polygonSketchViewModel: '',
|
||
polylineSketchViewModel: '',
|
||
addGraphicType: '',
|
||
lineLayer: '',
|
||
count: 0,
|
||
lighHight: null,
|
||
selectLine: null,
|
||
draw: null,
|
||
DrawstartPoint: [],
|
||
DrawenedPoint: [],
|
||
DrawDregType: null,
|
||
textLayer: null,
|
||
loadelevationLayer: null,
|
||
ldMapActionType: '',
|
||
printExcent: '',
|
||
pointSketchType: 'Station',
|
||
drawTypeLine: '',// 划线是一条还是多条
|
||
newDrawLineByClick: '',
|
||
pointMaxIndex: -1,
|
||
hightlayer: '',
|
||
pngLayer: null,
|
||
selectPng: '',
|
||
wkid: null,
|
||
//初始化地图
|
||
initMap: function (wkid) {
|
||
|
||
self = this;
|
||
return new Promise((resolve, reject) => {
|
||
|
||
if (wkid == self.wkid) {
|
||
resolve()
|
||
|
||
} else {
|
||
let tileInfo = new TileInfo(TianData.infoData(wkid));
|
||
self.wkid = wkid
|
||
let defaultInfo = {
|
||
subDomains: ["t1"],
|
||
spatialReference: {
|
||
wkid: wkid,
|
||
},
|
||
tileInfo: tileInfo,
|
||
}
|
||
let imageBasemapLayer = new WebTileLayer({
|
||
...defaultInfo,
|
||
urlTemplate: TianData.img_c
|
||
})
|
||
let imageNoteLayer = new WebTileLayer({
|
||
...defaultInfo,
|
||
urlTemplate: TianData.cia_c
|
||
})
|
||
|
||
|
||
this.map = new Map({
|
||
basemap: {
|
||
baseLayers: [imageBasemapLayer, imageNoteLayer],
|
||
},
|
||
slider: false
|
||
});
|
||
|
||
|
||
let lodsView = [
|
||
{ level: 0, resolution: 156543.033928, scale: 591657527.591555 },
|
||
{ level: 1, resolution: 78271.5169639999, scale: 295828763.795777 },
|
||
{ level: 2, resolution: 39135.7584820001, scale: 147914381.897889 },
|
||
{ level: 3, resolution: 19567.8792409999, scale: 73957190.948944 },
|
||
{ level: 4, resolution: 9783.93962049996, scale: 36978595.474472 },
|
||
{ level: 5, resolution: 4891.96981024998, scale: 18489297.737236 },
|
||
{ level: 6, resolution: 2445.98490512499, scale: 9244648.868618 },
|
||
{ level: 7, resolution: 1222.99245256249, scale: 4622324.434309 },
|
||
{ level: 8, resolution: 611.49622628138, scale: 2311162.217155 },
|
||
{ level: 9, resolution: 305.748113140558, scale: 1155581.108577 },
|
||
{ level: 10, resolution: 152.874056570411, scale: 577790.554289 },
|
||
{ level: 11, resolution: 76.4370282850732, scale: 288895.277144 },
|
||
{ level: 12, resolution: 38.2185141425366, scale: 144447.638572 },
|
||
{ level: 13, resolution: 19.1092570712683, scale: 72223.819286 },
|
||
{ level: 14, resolution: 9.55462853563415, scale: 36111.909643 },
|
||
{ level: 15, resolution: 4.77731426794937, scale: 18055.954822 },
|
||
{ level: 16, resolution: 2.38865713397468, scale: 9027.977411 },
|
||
{ level: 17, resolution: 1.19432856685505, scale: 4513.988705 },
|
||
{ level: 18, resolution: 0.597164283559817, scale: 2256.994353 },
|
||
{ level: 19, resolution: 0.298582141647617, scale: 1128.497176 },
|
||
{ level: 20, resolution: 0.14929107082380833, scale: 564.248588 },
|
||
{ level: 21, resolution: 0.07464553541190416, scale: 282.124294 },
|
||
{ level: 22, resolution: 0.03732276770595208, scale: 141.062147 },
|
||
{ level: 23, resolution: 0.01866138385297604, scale: 70.5310735 },
|
||
]
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
this.view = new MapView({
|
||
container: "viewDiv",
|
||
map: this.map,
|
||
spatialReference: {
|
||
wkid: wkid,
|
||
},
|
||
constraints: {
|
||
lods: lodsView,
|
||
rotationEnabled: false,
|
||
minZoom: 0,
|
||
maxZoom: 50
|
||
},
|
||
center: [116.85722842688202, 39.26485279059861],
|
||
zoom: 15,
|
||
});
|
||
let measurementWidget = new DistanceMeasurement2D({
|
||
view: this.view
|
||
});
|
||
// this.view.ui.add(measurementWidget, "bottom-right");
|
||
|
||
self.view.on("drag", function (event) {
|
||
if (event.button == 2 && self.DrawDregType && self.ldMapActionType == 'regectionAction') {
|
||
console.log(event)
|
||
let point = self.view.toMap({ x: event.x, y: event.y });
|
||
if (event.action == 'start') {
|
||
// self.DrawLine()
|
||
self.DrawstartPoint = [point.x, point.y];
|
||
}
|
||
if (event.action == 'end') {
|
||
self.Bindpolygon()
|
||
self.view.graphics.removeAll();
|
||
}
|
||
if (event.action == 'update') {
|
||
// self.destroyDraw()
|
||
self.DrawenedPoint = [point.x, point.y];
|
||
let data = {
|
||
vertices: [self.DrawstartPoint, self.DrawenedPoint]
|
||
}
|
||
self.createPolygon(data)
|
||
}
|
||
|
||
}
|
||
|
||
|
||
});
|
||
mapLog = useMapLogStore()
|
||
self.view.ui.remove("zoom"); //移除
|
||
self.view.ui.remove("attribution"); //移除底部ESRI logo bb
|
||
|
||
self.view.on("click", (event) => {
|
||
|
||
console.log(event)
|
||
if (self.popup) {
|
||
self.popup.remove()
|
||
}
|
||
if (self.hightlayer) {
|
||
|
||
self.hightlayer.removeAll()
|
||
}
|
||
|
||
self.view.hitTest(event).then((response) => {
|
||
|
||
self.lighHight?.remove();
|
||
self.selectLine = ''
|
||
self.selectPng = ''
|
||
if (response.results && response.results[0]) {
|
||
var graphic = response.results[0].graphic;
|
||
console.log(graphic)
|
||
if (self.ldMapActionType == 'lineAction') {
|
||
if (graphic.geometry.type == "polyline") {
|
||
self.view.whenLayerView(graphic.layer).then((layerView) => {
|
||
|
||
emitter.emit('line', graphic.attributes.data)
|
||
self.selectLine = graphic
|
||
self.lighHight = layerView.highlight(graphic)
|
||
|
||
})
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
}
|
||
if (graphic.attributes?.type == 'qdf') {
|
||
self.view.whenLayerView(graphic.layer).then((layerView) => {
|
||
self.selectPng = graphic
|
||
self.lighHight = layerView.highlight(graphic)
|
||
})
|
||
|
||
}
|
||
}
|
||
|
||
|
||
});
|
||
});
|
||
self.view.watch("zoom", function (newValue, oldValue, propertyName, target) {
|
||
|
||
if (Number.isInteger(newValue)) {
|
||
console.info(newValue);
|
||
self.showeleByzoom(newValue)
|
||
}
|
||
});
|
||
//文字
|
||
|
||
self.view.when(e => {
|
||
// const print = new Print({
|
||
// view: self.view,
|
||
// // specify your own print service
|
||
// printServiceUrl:
|
||
// "http://139.224.252.239:6080/arcgis/rest/services/Utilities/PrintingTools/GPServer/Export%20Web%20Map%20Task"
|
||
// });
|
||
|
||
// // Add widget to the top right corner of the view
|
||
// self.view.ui.add(print, "top-right");
|
||
resolve()
|
||
})
|
||
|
||
|
||
}
|
||
|
||
|
||
})
|
||
|
||
},
|
||
async arcgisPrint() {
|
||
|
||
const url = "http://139.224.252.239:6080/arcgis/rest/services/Utilities/PrintingTools/GPServer/Export%20Web%20Map%20Task"
|
||
await self.setCenter(self.nowlayer.fullExtent.center.x, self.nowlayer.fullExtent.center.y, 18)
|
||
|
||
let { width, height } = self.nowlayer.fullExtent
|
||
let { metersPerUnit } = self.nowlayer.fullExtent.spatialReference
|
||
width = width * metersPerUnit * 3
|
||
height = height * metersPerUnit * 3
|
||
const template = new PrintTemplate({
|
||
format: 'PNG32',
|
||
exportOptions: {
|
||
width,
|
||
height,
|
||
dpi: 180,
|
||
},
|
||
layout: "map-only",
|
||
})
|
||
const params = new PrintParameters({
|
||
view: self.view,
|
||
template: template,
|
||
})
|
||
print.execute(url, params).then(result => {
|
||
console.log(result.url);
|
||
window.open(result.url);
|
||
}).catch(err => {
|
||
console.log("Something broke: ", err);
|
||
});
|
||
},
|
||
noteSlayerInit() {
|
||
|
||
|
||
self.sketchLayer = new MapNotesLayer();
|
||
self.sketchLayer.isCreate = true
|
||
self.view.map.add(self.sketchLayer, 1)
|
||
self.textLayer = new GraphicsLayer()
|
||
|
||
self.pngLayer = new GraphicsLayer()
|
||
self.loadelevationLayer = new GraphicsLayer()
|
||
self.map.add(self.textLayer, 10)
|
||
self.map.add(self.pngLayer, 11)
|
||
self.map.add(self.loadelevationLayer, 10)
|
||
self.initSketch()
|
||
},
|
||
removeAll() {
|
||
self.view.map.removeAll();
|
||
},
|
||
addLayer: function (e) {
|
||
|
||
self.removeAll();
|
||
let data = {
|
||
id: "layerName",
|
||
url: '',
|
||
...e,
|
||
spatialReference: {
|
||
wkid: self.wkid,
|
||
},
|
||
}
|
||
var imgLayer = new TileLayer(data);
|
||
|
||
this.map.add(imgLayer);
|
||
|
||
imgLayer.when((e) => {
|
||
self.nowlayer = e
|
||
self.setCenter(e.fullExtent.center.x, e.fullExtent.center.y)
|
||
})
|
||
self.view.whenLayerView(imgLayer).then(function (layerView) {
|
||
// self.nowlayer = layerView
|
||
})
|
||
|
||
self.noteSlayerInit()
|
||
return data.id;
|
||
},
|
||
removeLayer: function (e) {
|
||
this.map.remove(this.map.findLayerById(e))
|
||
},
|
||
setCenter: function (x, y, zoom) {
|
||
if (!zoom) {
|
||
zoom = this.view.zoom > 18 ? this.view.zoom : 18
|
||
}
|
||
return new Promise((resolve, reject) => {
|
||
this.view.goTo({
|
||
center: [x, y],
|
||
zoom,
|
||
}).then(res => {
|
||
|
||
resolve()
|
||
});
|
||
})
|
||
|
||
},
|
||
//添加文字标注
|
||
addTextFeature(text, id,) {
|
||
const textSymbol = {
|
||
type: "text", // autocasts as new TextSymbol()
|
||
angle: 90,
|
||
color: "green",
|
||
font: {
|
||
// autocast as new Font()
|
||
family: "Just Another Hand",
|
||
size: 12
|
||
},
|
||
haloColor: "black",
|
||
haloSize: 1,
|
||
horizontalAlignment: "right",
|
||
verticalAlignment: "bottom"
|
||
};
|
||
|
||
},
|
||
//高亮某个数据(未到终点的线)
|
||
hightLineLayer(data) {
|
||
|
||
let path = []
|
||
if (!self.hightlayer) {
|
||
self.hightlayer = new GraphicsLayer();
|
||
self.map.add(self.hightlayer)
|
||
}
|
||
|
||
data.forEach(item => {
|
||
|
||
return path.push([item[0], item[1]])
|
||
})
|
||
|
||
let linelayer = new Polyline({
|
||
paths: path,
|
||
})
|
||
|
||
const graphic = new Graphic({
|
||
geometry: linelayer,
|
||
|
||
symbol: {
|
||
type: "simple-line",
|
||
width: 5,
|
||
color: "red",
|
||
},
|
||
|
||
});
|
||
self.hightlayer.add(graphic)
|
||
|
||
|
||
|
||
// console.log(newPointGraphic)
|
||
},
|
||
//计算两点之间的距离
|
||
distance: function (p1, p2) {
|
||
|
||
let polyline = new Polyline({
|
||
paths: [[p1[0], p1[1]], [p2[0], p2[1]]],
|
||
})
|
||
length = geometryEngine.geodesicLength(polyline, "meters");
|
||
|
||
return length.toFixed(2)
|
||
},
|
||
|
||
initSketch() {
|
||
|
||
let count = 0;
|
||
const pointLayer = self.sketchLayer.pointLayer;
|
||
const polylineLayer = self.sketchLayer.polylineLayer;
|
||
const polygonLayer = self.sketchLayer.polygonLayer;
|
||
self.pointSketchViewModel = createSketchSketchViewModelPoint(pointLayer)
|
||
self.polygonSketchViewModel = createSketchSketchViewModel(polygonLayer)
|
||
self.polylineSketchViewModel = createSketchSketchViewModel(polylineLayer);
|
||
function createSketchSketchViewModel(layer) {
|
||
|
||
const sketchVM = new SketchViewModel({
|
||
view: self.view,
|
||
layer,
|
||
updateOnGraphicClick: true,
|
||
defaultStyle: {
|
||
point: {
|
||
type: "simple-marker",
|
||
color: "[0, 0, 0, 1]",
|
||
outline: {
|
||
color: "[255, 255, 255, 1]",
|
||
width: 1
|
||
},
|
||
size: "5px"
|
||
},
|
||
},
|
||
defaultUpdateOptions: {
|
||
|
||
|
||
highlightOptions: {
|
||
enabled: false,
|
||
},
|
||
enableScaling: false,
|
||
|
||
tool: 'reshape',
|
||
reshapeOptions: {
|
||
edgeOperation: 'none',
|
||
shapeOperation: 'none'
|
||
}
|
||
},
|
||
});
|
||
|
||
sketchVM.on("create", addGraphic);
|
||
sketchVM.on("update", selectData)
|
||
|
||
|
||
return sketchVM;
|
||
}
|
||
function createSketchSketchViewModelPoint(layer) {
|
||
|
||
const sketchVM = new SketchViewModel({
|
||
view: self.view,
|
||
layer,
|
||
updateOnGraphicClick: true,
|
||
defaultStyle: {
|
||
point: {
|
||
type: "simple-marker",
|
||
color: "[0, 0, 0, 1]",
|
||
outline: {
|
||
color: "[255, 255, 255, 1]",
|
||
width: 1
|
||
},
|
||
size: "5px"
|
||
},
|
||
},
|
||
defaultUpdateOptions: {
|
||
|
||
|
||
highlightOptions: {
|
||
enabled: true,
|
||
},
|
||
|
||
toggleToolOnClick: false,
|
||
tool: 'move',
|
||
reshapeOptions: {
|
||
edgeOperation: 'none',
|
||
shapeOperation: 'move-xy'
|
||
}
|
||
},
|
||
});
|
||
sketchVM.on("create", addGraphic);
|
||
sketchVM.on("update", selectData);
|
||
sketchVM.on("delete", selectRemove)
|
||
return sketchVM;
|
||
}
|
||
function selectData(e) {
|
||
|
||
if (e.graphics[0].attributes.data?.pointType == 'Station' || e.graphics[0].attributes.data?.type == 'Station') {
|
||
return
|
||
}
|
||
let graphic = e.graphics[0]
|
||
console.log(e)
|
||
if (e.tool == "move") {
|
||
self.movePointBy(graphic)
|
||
//移动点位,边线跟随移动
|
||
}
|
||
if (e.state == 'start') {
|
||
logOldGeometry = graphic.geometry
|
||
if (graphic.attributes.type == "House") {
|
||
|
||
emitter.emit('polyon', graphic.attributes.data)
|
||
}
|
||
|
||
self.sketchLayer.selectGraphic = graphic
|
||
|
||
// polygonLayer.remove(e.graphics[0])
|
||
}
|
||
if (e.state == 'active') {
|
||
|
||
//记录操作过的特征物
|
||
if (graphic.attributes.type) {
|
||
//更改经纬度范围
|
||
if (graphic.attributes.data && graphic.attributes.data.action == undefined) {
|
||
graphic.attributes.data.action = 1
|
||
}
|
||
if (graphic.attributes.type == "House") {
|
||
|
||
//更改文字显示位置
|
||
if (graphic.attributes.data.isExit) {
|
||
self.setLabelByPolygon(graphic.geometry.centroid, 'text' + graphic.id, (graphic.attributes.data.houseMaterial || '') + (graphic.attributes.data.houseFloors || ''))
|
||
}
|
||
|
||
}
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
}
|
||
|
||
if (e.state == 'complete') {
|
||
self.sketchLayer.selectGraphic = null
|
||
if (self.ldMapActionType != 'lineAction') {
|
||
try {
|
||
const areas = geodesicUtils.geodesicAreas([graphic.geometry], "square-meters");
|
||
const area = Math.abs(areas[0]).toFixed(2)
|
||
graphic.attributes.data.area = area
|
||
} catch {
|
||
|
||
}
|
||
}
|
||
|
||
|
||
if (logOldGeometry != graphic.geometry) {
|
||
mapLog.addContent({
|
||
mapType: self.ldMapActionType != 'lineAction' ? 'regon' : 'line',
|
||
actionType: 'edit',
|
||
isrevoke: true,
|
||
tips: self.ldMapActionType != 'lineAction' ? graphic.attributes.type : graphic.attributes.data.pointType,
|
||
oldGeometry: [logOldGeometry],
|
||
oldAttributes: [graphic.geometry],
|
||
id: graphic.id,
|
||
})
|
||
}
|
||
}
|
||
|
||
}
|
||
function addGraphic(event) {
|
||
|
||
let mapdata = useMapDataStore()
|
||
|
||
let id
|
||
if (event.state === "complete") {
|
||
switch (event.tool) {
|
||
case "point":
|
||
pointLayer.remove(event.graphic);
|
||
if (self.pointSketchType == 'png') {
|
||
mapdata.addPngStyle(event.graphic.geometry).then(res => {
|
||
|
||
self.addsepticBygeomery(event.graphic.geometry, self.pointMaxIndex, res)
|
||
|
||
})
|
||
} else {
|
||
|
||
console.log(self.pointSketchType)
|
||
let symbol = {
|
||
type: "simple-marker",
|
||
style: "circle",
|
||
size: self.pointSketchType == 'Station' ? '18px' : self.pointSketchType == 'x' ? '14px' : '10px',
|
||
color: self.pointSketchType == 'Station' ? [8, 240, 36, 255] : self.pointSketchType == 'x' ? [7, 253, 253, 255] : [223, 3, 2, 255],
|
||
outline: {
|
||
width: 0
|
||
}
|
||
}
|
||
|
||
|
||
id = self.pointSketchType == 'Station' ? ('station:' + Date.now()) : self.pointMaxIndex
|
||
const newPointGraphic = new Graphic({
|
||
geometry: event.graphic.geometry,
|
||
symbol: symbol,
|
||
id,
|
||
attributes: {
|
||
data: { pointType: self.pointSketchType },
|
||
startIndex: null,
|
||
endIndex: null,
|
||
}
|
||
});
|
||
pointLayer.add(newPointGraphic);
|
||
mapLog.addContent({
|
||
mapType: self.ldMapActionType != 'lineAction' ? 'regon' : 'line',
|
||
actionType: 'add',
|
||
isrevoke: self.ldMapActionType != 'lineAction' ? false : true,
|
||
tips: self.pointSketchType,
|
||
oldGeometry: [],
|
||
oldAttributes: [event.graphic.geometry],
|
||
id,
|
||
})
|
||
|
||
|
||
}
|
||
|
||
break;
|
||
|
||
case "polyline":
|
||
count++;
|
||
polylineLayer.remove(event.graphic);
|
||
const newPolylineGraphic = new Graphic({
|
||
geometry: event.graphic.geometry,
|
||
symbol: {
|
||
type: "simple-line",
|
||
color: [245, 66, 155, 0.8],
|
||
width: 6
|
||
},
|
||
attributes: {
|
||
type: "polyline",
|
||
title: "polyline#" + count
|
||
}
|
||
});
|
||
polylineLayer.add(newPolylineGraphic);
|
||
|
||
break;
|
||
|
||
case "polygon":
|
||
count++;
|
||
polygonLayer.remove(event.graphic);
|
||
var polygon = event.graphic.geometry;
|
||
id = self.addGraphicType + ':' + Date.now()
|
||
let val = {
|
||
geometryId: id,
|
||
action: 2,
|
||
"innerings": [],
|
||
"extend": null,
|
||
type: self.addGraphicType,
|
||
path: polygon.rings[0]
|
||
}
|
||
|
||
const newPolygonGraphic = new Graphic({
|
||
id: id,
|
||
geometry: event.graphic.geometry,
|
||
symbol: {
|
||
type: "simple-fill", // autocasts as new SimpleFillSymbol()
|
||
color: symbolData[self.addGraphicType],
|
||
outline: {
|
||
// autocasts as new SimpleLineSymbol()
|
||
color: [255, 255, 255, 0.4],
|
||
width: 2
|
||
}
|
||
},
|
||
attributes: {
|
||
data: val,
|
||
type: self.addGraphicType,
|
||
|
||
sketchType: 'polygon'
|
||
}
|
||
});
|
||
polygonLayer.add(newPolygonGraphic);
|
||
mapdata.addByTypeData(self.addGraphicType, val)
|
||
mapLog.addContent({
|
||
mapType: 'regon',
|
||
actionType: 'add',
|
||
isrevoke: true,
|
||
tips: self.addGraphicType,
|
||
oldGeometry: [],
|
||
oldAttributes: [event.graphic.geometry],
|
||
id,
|
||
})
|
||
|
||
|
||
break;
|
||
|
||
default:
|
||
console.log("geometry type not found: ", event);
|
||
}
|
||
}
|
||
}
|
||
function selectRemove(e) {
|
||
|
||
let selectData = e.graphics[0]
|
||
if (self.ldMapActionType == 'lineAction') {
|
||
|
||
let attributes = selectData.attributes
|
||
let allPolyline = self.lineLayer.graphics
|
||
|
||
if (!(attributes.endIndex && attributes.startIndex)) {
|
||
let PolyLine = [];
|
||
if (allPolyline) {
|
||
allPolyline.forEach(item => {
|
||
if (item.attributes.leftId == selectData.id || item.attributes.nextId == selectData.id) {
|
||
PolyLine.push(item)
|
||
}
|
||
})
|
||
PolyLine.forEach(item => {
|
||
let point = self.getSketchDataByType("point").filter(data => {
|
||
return data.id == item.attributes.leftId
|
||
})?.[0];
|
||
point && (point.attributes.endIndex = null)
|
||
|
||
self.lineLayer.remove(item)
|
||
})
|
||
}
|
||
|
||
} else {
|
||
|
||
let leftGra = [], rightGra
|
||
allPolyline.forEach(item => {
|
||
if (item.attributes.nextId == selectData.id) {
|
||
leftGra.push(item)
|
||
}
|
||
if (item.attributes.leftId == selectData.id) {
|
||
rightGra = item
|
||
}
|
||
})
|
||
leftGra.forEach((Leftitem) => {
|
||
let leftPoint
|
||
let rightPoint
|
||
self.sketchLayer.pointLayer.graphics.items.forEach(item => {
|
||
if (item.id == rightGra.attributes.nextId) {
|
||
rightPoint = item
|
||
}
|
||
if (item.id == Leftitem.attributes.leftId) {
|
||
leftPoint = item
|
||
}
|
||
|
||
})
|
||
let polyline = new Polyline({
|
||
paths: [
|
||
[leftPoint.geometry.x, leftPoint.geometry.y],
|
||
[rightPoint.geometry.x, rightPoint.geometry.y]
|
||
|
||
],
|
||
})
|
||
Leftitem.set({
|
||
geometry: polyline,
|
||
attributes: {
|
||
...Leftitem.attributes,
|
||
nextId: rightPoint.id,
|
||
endIndex: rightPoint.id
|
||
}
|
||
})
|
||
|
||
|
||
})
|
||
|
||
self.lineLayer.remove(rightGra)
|
||
|
||
|
||
}
|
||
}
|
||
mapLog.addContent({
|
||
mapType: self.ldMapActionType != 'lineAction' ? 'regon' : 'line',
|
||
actionType: 'delete',
|
||
isrevoke: true,
|
||
tips: self.ldMapActionType != 'lineAction' ? 'Station' : selectData.attributes.data.pointType,
|
||
oldGeometry: [selectData.geometry],
|
||
oldAttributes: [selectData.attributes],
|
||
id: selectData.id,
|
||
})
|
||
}
|
||
|
||
|
||
},
|
||
//验证新增的面是否有重叠
|
||
addPolygonCheck(newPolygonGraphic, val) {
|
||
|
||
let polygonLayer = self.sketchLayer.polygonLayer
|
||
let polygon1 = new Polygon({
|
||
rings: val.path
|
||
})
|
||
let alllayer = self.getSketchDataByType('polygon');
|
||
let arr = []
|
||
alllayer.map(item => {
|
||
let polygon2 = new Polygon({
|
||
rings: item.geometry.rings
|
||
})
|
||
const intersection = geometryEngine.intersect(polygon1, polygon2);
|
||
if (intersection) {
|
||
console.log(intersection)
|
||
console.log(item)
|
||
arr.push(intersection)
|
||
}
|
||
|
||
// return intersection
|
||
})
|
||
if (arr.length) {
|
||
// let unionPolygon =''
|
||
// arr.forEach(item=>{
|
||
// let polygon2 = new Polygon({
|
||
// rings:item.geometry.rings
|
||
// })
|
||
// unionPolygon = polygon2
|
||
// })
|
||
// console.log(unionPolygon)
|
||
polygonLayer.removeAll()
|
||
const newGraphic = new Graphic({
|
||
geometry: arr[0],
|
||
id: '11',
|
||
symbol: {
|
||
type: "simple-fill", // autocasts as new SimpleFillSymbol()
|
||
color: [255, 0, 0, 0.6],
|
||
outline: {
|
||
// autocasts as new SimpleLineSymbol()
|
||
color: [255, 255, 255, 0.4],
|
||
width: 2
|
||
}
|
||
},
|
||
attributes: {
|
||
type: self.addGraphicType,
|
||
}
|
||
});
|
||
polygonLayer.add(newGraphic)
|
||
|
||
} else {
|
||
//新增
|
||
polygonLayer.add(newPolygonGraphic);
|
||
mapdata.addByTypeData(self.addGraphicType, val)
|
||
}
|
||
|
||
|
||
},
|
||
//切换线的状态
|
||
getPoylineLayer(id, visible) {
|
||
let p6 = this.lineLayer.graphics.items.filter(item => {
|
||
return item.attributes.id == id
|
||
})
|
||
p6.forEach(item => item.visible = visible)
|
||
|
||
},
|
||
//智能合并
|
||
MergeOptimization(long = 1) {
|
||
let p6 = this.lineLayer.graphics.items.filter(item => {
|
||
const length = geometryEngine.geodesicLength(polyline, "meters");
|
||
return length < long
|
||
})
|
||
},
|
||
//新增检修井
|
||
addOpionPoint(type, pointId) {
|
||
console.log(pointId)
|
||
self.pointMaxIndex = pointId
|
||
self.pointSketchType = type
|
||
self.pointSketchViewModel.create("point");
|
||
},
|
||
//移动点位,边线跟随
|
||
movePointBy(e) {
|
||
|
||
let nowXy = [e.geometry.longitude, e.geometry.latitude]
|
||
|
||
// let polylineLayer = self.sketchLayer.polylineLayer
|
||
// let allPolyline = polylineLayer.graphics.items;
|
||
|
||
let allPolyline = self.lineLayer.graphics
|
||
let PolyLine = [];
|
||
if (allPolyline) {
|
||
allPolyline.forEach(item => {
|
||
if (item.attributes.leftId == e.id) {
|
||
|
||
PolyLine.push({
|
||
val: item,
|
||
type: 'left'
|
||
})
|
||
|
||
}
|
||
if (item.attributes.nextId == e.id) {
|
||
PolyLine.push({
|
||
val: item,
|
||
type: 'right'
|
||
})
|
||
}
|
||
})
|
||
PolyLine.forEach(item => {
|
||
//可编辑线
|
||
self.polylineSet(item.val, item.type, nowXy)
|
||
|
||
})
|
||
|
||
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
},
|
||
|
||
// 移动后替换原始线路
|
||
polylineSet(polylineVal, type, nowXy) {
|
||
|
||
let paths = polylineVal.geometry.paths
|
||
type == 'left' ? paths[0][0] = nowXy : paths[0][paths[0].length - 1] = nowXy
|
||
const polyline = new Polyline({
|
||
paths: paths,
|
||
|
||
})
|
||
const length = geometryEngine.geodesicLength(polyline, "meters");
|
||
console.log(length.toFixed(2))
|
||
if (length) {
|
||
polylineVal.set({
|
||
geometry: polyline,
|
||
})
|
||
}
|
||
|
||
|
||
},
|
||
DrawSketch(type, addType) {
|
||
|
||
|
||
self.addGraphicType = addType
|
||
switch (type) {
|
||
case 'point': self.pointSketchViewModel.create("point"); break;
|
||
case 'polyline': self.polylineSketchViewModel.create("polyline"); break;
|
||
case 'polygon': self.polygonSketchViewModel.create("polygon"); break;
|
||
}
|
||
|
||
},
|
||
//清空图层数据
|
||
removeAllLayer() {
|
||
|
||
self.sketchLayer.polygonLayer.removeAll();
|
||
self.sketchLayer.pointLayer.removeAll();
|
||
self.lineLayer && self.lineLayer.removeAll()
|
||
self.loadelevationLayer.removeAll()
|
||
self.hightlayer && self.hightlayer.removeAll()
|
||
self.textLayer && self.textLayer.removeAll()
|
||
},
|
||
//清除点位
|
||
removePoint() {
|
||
this.sketchLayer.pointLayer.removeAll();
|
||
},
|
||
removeLine() {
|
||
self.view.graphics.removeAll();
|
||
},
|
||
//布线识别的数据加载
|
||
addDefaultByline(data) {
|
||
|
||
self.ldMapActionType = 'lineAction'
|
||
self.DrawDregType = false
|
||
self.textLayer.removeAll()
|
||
return new Promise((resolve, reject) => {
|
||
// let polylineLayer = self.sketchLayer.polylineLayer;
|
||
self.sketchLayer.polygonLayer.removeAll();
|
||
self.lineLayer && self.lineLayer.removeAll()
|
||
let polylineLayer = new GraphicsLayer()
|
||
|
||
|
||
|
||
|
||
data.forEach(item => {
|
||
const polyline = new Polyline({
|
||
paths: item.path,
|
||
|
||
|
||
})
|
||
const lineSymbol = self.returnLineSymbole(item.width, item.color)
|
||
// const length = geometryEngine.geodesicLength(polyline, "meters");
|
||
// console.log(length.toFixed(2))
|
||
// item.distance = length.toFixed(2)
|
||
const newPolygonGraphic = new Graphic({
|
||
geometry: polyline,
|
||
id: item.id,
|
||
attributes: {
|
||
leftId: item.startIndex,
|
||
nextId: item.endIndex,
|
||
id: item.id,
|
||
data: item,
|
||
},
|
||
symbol: lineSymbol
|
||
})
|
||
|
||
|
||
polylineLayer.graphics.add(newPolygonGraphic)
|
||
|
||
})
|
||
|
||
|
||
|
||
self.map.add(polylineLayer, 1)
|
||
self.lineLayer = polylineLayer
|
||
resolve(data)
|
||
|
||
})
|
||
|
||
|
||
},
|
||
//获取管线起点数据
|
||
getpointByStart() {
|
||
|
||
let point = self.getSketchDataByType("point");
|
||
let linelayer = self.lineLayer.graphics.items
|
||
let returnObj = {
|
||
line: [],
|
||
point: [],
|
||
lineAttribute: {},
|
||
}
|
||
point.forEach(item => {
|
||
if (!item.attributes.startIndex && item.attributes.endIndex) {
|
||
try {
|
||
returnObj.line.push(self.getMapByPoint(item, []))
|
||
} catch (error) {
|
||
console.log(error)
|
||
debugger
|
||
}
|
||
|
||
}
|
||
if (!item.attributes.startIndex && !item.attributes.endIndex) {
|
||
returnObj.point.push([[item.geometry.x, item.geometry.y, item.attributes.data.pointType, parseInt(item.attributes.data.styleVal) || 200, item.id]])
|
||
}
|
||
})
|
||
linelayer.forEach(item => {
|
||
let { endAltitude = null, endElevation = null, material = null, pipelineType = null, startAltitude = null, startElevation = null } = item.attributes.data
|
||
let length = parseFloat(geometryEngine.geodesicLength(item.geometry, "meters").toFixed(2));
|
||
returnObj.lineAttribute[item.attributes.leftId + ',' + item.attributes.nextId] =
|
||
{ endAltitude, endElevation, length, material, pipelineType, startAltitude, startElevation }
|
||
})
|
||
|
||
return returnObj
|
||
|
||
},
|
||
// 开始 结束
|
||
// 线 31 118355 53
|
||
// 点 118355 53 531
|
||
// 线 53 118350 46
|
||
// 线 53 531 180
|
||
|
||
|
||
|
||
|
||
|
||
|
||
//根据起点找终点返回数据
|
||
getMapByPoint(item, data) {
|
||
let linelayer = self.lineLayer.graphics.items
|
||
let point = self.getSketchDataByType("point");
|
||
|
||
let nowPointId = item.id
|
||
let lineId
|
||
lineId = item.attributes.endIndex
|
||
let lineIdMore=linelayer.filter(item => item.attributes.leftId == nowPointId)
|
||
|
||
if(lineIdMore.length>1){
|
||
console.log(lineIdMore)
|
||
}
|
||
|
||
|
||
//当前的元素数据
|
||
let geometry = item.geometry
|
||
let attributes = item.attributes
|
||
|
||
if (lineId && lineId != nowPointId) {
|
||
let linedata = linelayer.filter(item => item.id == lineId)
|
||
console.log(linedata.length)
|
||
if(linedata.length >1){debugger}
|
||
linedata = linedata[0]
|
||
if (!linedata) { return data }
|
||
let val = [geometry.x, geometry.y, attributes.data.pointType, parseInt(linedata.attributes.data.styleId), nowPointId]
|
||
data.push(val)
|
||
let nextPointId = linedata.attributes.nextId
|
||
|
||
let nextItem = point.filter(item => item.id == nextPointId)
|
||
|
||
nextItem=nextItem[0]
|
||
if(nextItem.length >1){debugger}
|
||
if (!nextItem) { debugger }
|
||
return this.getMapByPoint(nextItem, data)
|
||
} else {
|
||
//到终点
|
||
let val = [geometry.x, geometry.y, attributes.data.pointType, parseInt(data[data.length - 1][3]), nowPointId]
|
||
data.push(val)
|
||
return data
|
||
}
|
||
|
||
},
|
||
|
||
//线数据定位
|
||
chooseLineByid(id) {
|
||
|
||
let p6 = this.lineLayer.graphics.items.filter(item => {
|
||
return item.attributes.id == id
|
||
})[0]
|
||
self.lighHight?.remove();
|
||
self.view.whenLayerView(p6.layer).then((layerView) => {
|
||
self.lighHight = layerView.highlight(p6)
|
||
})
|
||
self.setCenter(p6.geometry.extent.center.x, p6.geometry.extent.center.y, 22)
|
||
},
|
||
//根据类型获取总skech要素
|
||
getSketchDataByType(type) {
|
||
let sketch = []
|
||
switch (type) {
|
||
case 'polygon': sketch = this.sketchLayer.polygonLayer.graphics.items; break;
|
||
case 'point': sketch = this.sketchLayer.pointLayer.graphics.items; break;
|
||
case 'polyline': sketch = this.sketchLayer.pointLayer.graphics.items; break;
|
||
}
|
||
return sketch
|
||
},
|
||
//线条样式
|
||
returnLineSymbole(width, color) {
|
||
return new CIMSymbol({
|
||
data: {
|
||
type: "CIMSymbolReference",
|
||
symbol: {
|
||
type: "CIMLineSymbol",
|
||
symbolLayers: [{
|
||
type: "CIMSolidStroke",
|
||
|
||
enable: "true",
|
||
capStyle: "Butt",
|
||
joinStyle: "Round",
|
||
width,
|
||
color
|
||
},
|
||
{
|
||
// arrow symbol
|
||
type: "CIMVectorMarker",
|
||
enable: true,
|
||
size: 5,
|
||
markerPlacement: {
|
||
type: "CIMMarkerPlacementAlongLineSameSize", // places same size markers along the line
|
||
endings: "WithMarkers",
|
||
placementTemplate: [19.5], // determines space between each arrow
|
||
angleToLine: true // symbol will maintain its angle to the line when map is rotated
|
||
},
|
||
frame: {
|
||
xmin: -5,
|
||
ymin: -5,
|
||
xmax: 5,
|
||
ymax: 5
|
||
},
|
||
markerGraphics: [{
|
||
type: "CIMMarkerGraphic",
|
||
geometry: {
|
||
rings: [
|
||
[
|
||
[
|
||
-8,
|
||
-5.47
|
||
],
|
||
[
|
||
-8,
|
||
5.6
|
||
],
|
||
[
|
||
1.96,
|
||
-0.03
|
||
],
|
||
[
|
||
-8,
|
||
-5.47
|
||
]
|
||
]
|
||
]
|
||
},
|
||
symbol: {
|
||
// black fill for the arrow symbol
|
||
type: "CIMPolygonSymbol",
|
||
symbolLayers: [{
|
||
type: "CIMSolidFill",
|
||
enable: true,
|
||
color: [
|
||
255, 255, 255, 255
|
||
|
||
]
|
||
}]
|
||
}
|
||
}]
|
||
}]
|
||
}
|
||
}
|
||
});
|
||
},
|
||
//线添加点位数据
|
||
addDefaultByPoint(data) {
|
||
|
||
let pointLayer = self.sketchLayer.pointLayer;
|
||
let id = data.pointId
|
||
|
||
|
||
// if (data.pointType != 'y') {
|
||
|
||
let point = new Point({
|
||
x: data.point[0],
|
||
y: data.point[1]
|
||
})
|
||
// Create a graphic and add the geometry and symbol to it
|
||
let pointGraphic = new Graphic({
|
||
id: id,
|
||
geometry: point,
|
||
attributes: {
|
||
data: data,
|
||
startIndex: data.startIndex,
|
||
endIndex: data.endIndex,
|
||
},
|
||
symbol: {
|
||
// type: "picture-marker", // autocasts as new PictureMarkerSymbol()
|
||
// url: data.jpg,
|
||
// width: data.width,
|
||
// height: data.height
|
||
type: "simple-marker", // autocasts as new SimpleMarkerSymbol()
|
||
color: data.color,
|
||
size: data.size, // pixels
|
||
outline: {
|
||
width: 0
|
||
}
|
||
},
|
||
|
||
});
|
||
|
||
if (data.pointType == 'y') {
|
||
pointGraphic.visible = false
|
||
}
|
||
|
||
pointLayer.add(pointGraphic, 10)
|
||
// return id;
|
||
|
||
// }
|
||
|
||
},
|
||
addsepticBygeomery(geometry, img, id) {
|
||
let pointGraphic = new Graphic({
|
||
id,
|
||
geometry: geometry,
|
||
attributes: {
|
||
type: 'qdf',
|
||
},
|
||
symbol: {
|
||
type: "picture-marker", // autocasts as new PictureMarkerSymbol()
|
||
url: img,
|
||
height: 20,
|
||
width: 20,
|
||
|
||
outline: {
|
||
width: 10
|
||
}
|
||
},
|
||
|
||
});
|
||
self.pngLayer.add(pointGraphic, 10)
|
||
},
|
||
//新增图片点位
|
||
addsepticTank(e) {
|
||
let { data: arr, img } = e
|
||
self.pngLayer.removeAll()
|
||
arr.forEach(data => {
|
||
let point = new Point({
|
||
x: data.point[0],
|
||
y: data.point[1]
|
||
})
|
||
// Create a graphic and add the geometry and symbol to it
|
||
let pointGraphic = new Graphic({
|
||
id: data.id,
|
||
geometry: point,
|
||
attributes: { type: 'qdf' },
|
||
symbol: {
|
||
type: "picture-marker", // autocasts as new PictureMarkerSymbol()
|
||
url: img,
|
||
height: 20,
|
||
width: 20,
|
||
},
|
||
|
||
});
|
||
self.pngLayer.add(pointGraphic, 10)
|
||
})
|
||
},
|
||
//隐藏图片点位
|
||
setPngPoint(visible) {
|
||
self.pngLayer.visible = visible
|
||
|
||
},
|
||
//根据管径信息修改管道
|
||
exitLineByVal(data) {
|
||
|
||
let polylineLayer = self.lineLayer
|
||
|
||
|
||
let p6 = this.lineLayer.graphics.items.filter(item => {
|
||
return item.id == data.id || item.id == data.lineId
|
||
})[0]
|
||
p6.set({
|
||
symbol: self.returnLineSymbole(data.width, data.color)
|
||
})
|
||
|
||
|
||
},
|
||
|
||
//切割面
|
||
cutPolygon() {
|
||
self.startDrawLine()
|
||
},
|
||
getCIMSymbolData(rings) {
|
||
return {
|
||
type: "CIMSymbolReference",
|
||
primitiveOverrides: [
|
||
{
|
||
type: "CIMPrimitiveOverride",
|
||
primitiveName: "textGraphic",
|
||
propertyName: "TextString",
|
||
valueExpressionInfo: {
|
||
type: "CIMExpressionInfo",
|
||
title: "Custom",
|
||
expression: "$feature.text",
|
||
returnType: "Default"
|
||
}
|
||
}
|
||
],
|
||
symbol: {
|
||
type: "CIMPolygonSymbol",
|
||
symbolLayers: [
|
||
|
||
{
|
||
type: "CIMSolidFill", // autocasts as new SimpleFillSymbol()
|
||
"enable": true,
|
||
"color": [255, 0, 0, 153]
|
||
},
|
||
{
|
||
type: "CIMVectorMarker",
|
||
enable: true,
|
||
size: 32,
|
||
colorLocked: true,
|
||
anchorPointUnits: "Relative",
|
||
frame: { xmin: -5, ymin: -5, xmax: 5, ymax: 5 },
|
||
markerGraphics: [
|
||
{
|
||
type: "CIMMarkerGraphic",
|
||
primitiveName: "textGraphic",
|
||
geometry: { x: 0, y: 0 },
|
||
symbol: {
|
||
type: "CIMTextSymbol",
|
||
fontFamilyName: "Arial",
|
||
fontStyleName: "Bold",
|
||
height: 4,
|
||
horizontalAlignment: "Center",
|
||
offsetX: 0,
|
||
offsetY: 0,
|
||
symbol: {
|
||
type: "CIMPolygonSymbol",
|
||
symbolLayers: [
|
||
{
|
||
type: "CIMSolidFill",
|
||
enable: true,
|
||
color: [255, 255, 255, 255]
|
||
}
|
||
]
|
||
},
|
||
verticalAlignment: "Center"
|
||
},
|
||
textString: ""
|
||
}
|
||
],
|
||
scaleSymbolsProportionally: true,
|
||
respectFrame: true
|
||
},
|
||
|
||
|
||
]
|
||
}
|
||
};
|
||
},
|
||
//根据缩放显示高程数据
|
||
showeleByzoom(zoom = self.view.zoom) {
|
||
console.log(zoom)
|
||
if (!self.loadelevationLayer) return;
|
||
|
||
if (zoom >= 22) {
|
||
self.loadelevationLayer.graphics.items.forEach(item => {
|
||
item.visible = true
|
||
})
|
||
} else {
|
||
let level = (22 - zoom) * 3
|
||
self.loadelevationLayer.graphics.items.forEach((item, index) => {
|
||
if (!(index % level)) {
|
||
item.visible = true
|
||
} else {
|
||
item.visible = false
|
||
}
|
||
|
||
})
|
||
}
|
||
},
|
||
//是否有相近的点位
|
||
isNearbypoint(point) {
|
||
let items = self.loadelevationLayer.graphics.items
|
||
let flag = true
|
||
for (let i = 0; i < items.length; i++) {
|
||
|
||
let distance = self.distance(point, [items[i].geometry.x, items[i].geometry.y])
|
||
console.log(distance)
|
||
if (distance < 10) {
|
||
flag = false;
|
||
break;
|
||
}
|
||
}
|
||
return flag
|
||
|
||
},
|
||
//道路高程数据展示
|
||
elevationData(flag, data) {
|
||
if (flag) {
|
||
|
||
data.forEach((item, index) => {
|
||
let point = new Point({ x: item[0], y: item[1] })
|
||
let text = item[2].toFixed(2)
|
||
const graphic = new Graphic({
|
||
geometry: point,
|
||
visible: !(index % ((22 - self.view.zoom) * 2)),
|
||
symbol: {
|
||
type: "text", // autocasts as new TextSymbol()
|
||
text: text,
|
||
color: [255, 255, 255, 255],
|
||
font: {
|
||
weight: "bold"
|
||
}
|
||
}
|
||
});
|
||
|
||
self.loadelevationLayer.add(graphic)
|
||
})
|
||
|
||
} else {
|
||
self.loadelevationLayer.removeAll()
|
||
}
|
||
|
||
|
||
},
|
||
//特征物的站点数据
|
||
addDefaultPoint(data) {
|
||
|
||
let pointLayer = self.sketchLayer.pointLayer
|
||
const point = new Point({
|
||
x: data.path[0],
|
||
y: data.path[1],
|
||
|
||
})
|
||
|
||
const newPointGraphic = new Graphic({
|
||
|
||
geometry: point,
|
||
symbol: {
|
||
type: "simple-marker",
|
||
style: "circle",
|
||
size: '18px',
|
||
color: [8, 240, 36, 255],
|
||
outline: {
|
||
width: 0
|
||
}
|
||
},
|
||
attributes: {
|
||
data,
|
||
}
|
||
});
|
||
pointLayer.add(newPointGraphic);
|
||
},
|
||
//站点数据
|
||
addDeviceData(data, type) {
|
||
|
||
self.pointSketchType = type
|
||
let pointLayer = self.sketchLayer.pointLayer;
|
||
data.forEach(item => {
|
||
let xy = item.path[0]
|
||
let point = new Point({
|
||
x: xy[0],
|
||
y: xy[1],
|
||
})
|
||
const newPointGraphic = new Graphic({
|
||
id: item.geometryId,
|
||
geometry: point,
|
||
symbol: {
|
||
type: "simple-marker",
|
||
style: "circle",
|
||
size: '18px',
|
||
color: [8, 240, 36, 255],
|
||
outline: {
|
||
width: 0
|
||
}
|
||
},
|
||
attributes: {
|
||
data: item
|
||
}
|
||
});
|
||
pointLayer.add(newPointGraphic);
|
||
|
||
})
|
||
|
||
},
|
||
//特征物识别数据
|
||
addDefaultData(data, type) {
|
||
|
||
let SymbolColor = symbolData[type]
|
||
let symbol = ''
|
||
|
||
|
||
self.ldMapActionType = 'regectionAction'
|
||
|
||
let polygonLayer = self.sketchLayer.polygonLayer
|
||
|
||
const num = 3
|
||
const maxNumber = 15000
|
||
const flag = false;
|
||
self.DrawDregType = true
|
||
data.forEach((res) => {
|
||
|
||
let maxNum = 0
|
||
res.innerings = res.innerings
|
||
res.path = res.path
|
||
new Promise((resolve, reject) => {
|
||
maxNum += res.path.length
|
||
|
||
res.innerings.forEach(res => {
|
||
maxNum += res.length
|
||
})
|
||
// if(maxNum>1000)
|
||
console.log(maxNum + ":" + res.geometryId)
|
||
|
||
let path, innerings
|
||
|
||
|
||
|
||
if (maxNum > maxNumber && flag) {
|
||
|
||
|
||
path = res.path.filter((item, index) => {
|
||
return index % num == 0
|
||
})
|
||
innerings = res.innerings.map(element => {
|
||
|
||
data = element.filter((item, index) => {
|
||
return index % num == 0
|
||
})
|
||
return data
|
||
})
|
||
} else {
|
||
path = res.path
|
||
innerings = res.innerings
|
||
}
|
||
const polygon = new Polygon({
|
||
rings: path,
|
||
//
|
||
})
|
||
|
||
|
||
if (innerings.length) {
|
||
innerings.forEach(element => {
|
||
polygon.addRing(element)
|
||
});
|
||
}
|
||
|
||
// symbol={
|
||
// type: "cim",
|
||
// data:this.getCIMSymbolData()
|
||
// }
|
||
symbol = {
|
||
type: "simple-fill", // autocasts as new SimpleFillSymbol()
|
||
color: SymbolColor,
|
||
outline: {
|
||
// autocasts as new SimpleLineSymbol()
|
||
color: [255, 255, 255, 0.4],
|
||
width: 0.5
|
||
}
|
||
}
|
||
|
||
if (res.type == "House") {
|
||
try {
|
||
const areas = geodesicUtils.geodesicAreas([polygon], "square-meters");
|
||
const area = Math.abs(areas[0]).toFixed(2)
|
||
res.area = res.area || area
|
||
} catch {
|
||
|
||
}
|
||
|
||
}
|
||
const newPolygonGraphic = new Graphic({
|
||
geometry: polygon,
|
||
id: res.geometryId,
|
||
symbol: symbol,
|
||
attributes: {
|
||
type: type,
|
||
sketchType: 'polygon',
|
||
data: res,
|
||
}
|
||
});
|
||
|
||
|
||
res.isExit && self.setLabelByPolygon(polygon.centroid, 'text' + res.geometryId, (res.houseMaterial || '') + (res.houseFloors || ''))
|
||
polygonLayer.add(newPolygonGraphic)
|
||
resolve()
|
||
|
||
}).then(e => {
|
||
|
||
})
|
||
|
||
|
||
|
||
})
|
||
|
||
|
||
|
||
|
||
},
|
||
setReconLabel(geometryId, text) {
|
||
|
||
let graphic = self.sketchLayer.polygonLayer.graphics.items.filter(item => {
|
||
return item.id == geometryId
|
||
})
|
||
if (graphic.length) {
|
||
self.setLabelByPolygon(graphic[0].geometry.centroid, 'text' + geometryId, text)
|
||
}
|
||
|
||
|
||
},
|
||
//显示图层中间文字
|
||
setLabelByPolygon(center, id, text) {
|
||
|
||
if (!text) return
|
||
let point = new Point({ x: center.x, y: center.y })
|
||
|
||
let selectGraphic = self.textLayer.graphics.items.filter(item => {
|
||
return item.id == id
|
||
})
|
||
if (selectGraphic.length) {
|
||
selectGraphic.forEach(p6 => {
|
||
p6.set({
|
||
geometry: point,
|
||
symbol: {
|
||
type: "text", // autocasts as new TextSymbol()
|
||
text: text,
|
||
color: [255, 255, 255, 255],
|
||
font: { // autocasts as new Font()
|
||
size: 12,
|
||
weight: "bold"
|
||
}
|
||
}
|
||
})
|
||
})
|
||
} else {
|
||
|
||
const graphic = new Graphic({
|
||
geometry: point,
|
||
id: id,
|
||
symbol: {
|
||
type: "text", // autocasts as new TextSymbol()
|
||
text: text,
|
||
color: [255, 255, 255, 255],
|
||
font: {
|
||
// autocasts as new Font()
|
||
// size: 12,
|
||
|
||
weight: "bold"
|
||
}
|
||
}
|
||
});
|
||
|
||
self.textLayer.add(graphic)
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
},
|
||
//高亮面图层
|
||
lighHightLayer(id) {
|
||
|
||
let graphic = self.sketchLayer.polygonLayer.graphics.items.filter(item => {
|
||
return item.id == id
|
||
})
|
||
|
||
self.polygonSketchViewModel.update(graphic, {
|
||
tool: "reshape",
|
||
enableMoveAllGraphics: false,
|
||
reshapeOptions: {
|
||
edgeOperation: "none",
|
||
shapeOperation: "none",
|
||
vertexOperation: "none"
|
||
}
|
||
})
|
||
|
||
graphic && self.setCenter(graphic[0].geometry.extent.center.x, graphic[0].geometry.extent.center.y)
|
||
|
||
|
||
|
||
},
|
||
//像素转经纬度
|
||
pxMapToLatlon(x, y) {
|
||
|
||
|
||
let view = self.view
|
||
let zoom = view.zoom
|
||
let tileLayer = self.nowlayer
|
||
let imgwidth = tileLayer.sourceJSON.maxImageWidth
|
||
let imgHeight = tileLayer.sourceJSON.maxImageHeight
|
||
|
||
let fullExtent = {
|
||
xmax: 118.86371824235101,
|
||
ymax: 33.26729051757083,
|
||
xmin: 118.85818229653573,
|
||
ymin: 33.26307467082115
|
||
}
|
||
|
||
let lngLatToXYmax = webMercatorUtils.lngLatToXY(fullExtent.xmax, fullExtent.ymax)
|
||
let lngLatToXYmin = webMercatorUtils.lngLatToXY(fullExtent.xmin, fullExtent.ymin)
|
||
|
||
let nowWith = lngLatToXYmax[0] - lngLatToXYmin[0]
|
||
let nowheight = lngLatToXYmax[1] - lngLatToXYmin[1]
|
||
|
||
let nowX = Math.floor(lngLatToXYmin[0] + (x * 4096 / 256) / 125)
|
||
|
||
let nowY = Math.floor(lngLatToXYmax[1] - (y * 4096 / 256) / 125)
|
||
|
||
|
||
|
||
|
||
let lat = webMercatorUtils.xyToLngLat(nowX, nowY)
|
||
return lat
|
||
},
|
||
getTileExtent(layer) {
|
||
|
||
},
|
||
//获取总数居
|
||
getAllData() {
|
||
|
||
self.sketchLayer.polygonLayer.removeAll()
|
||
|
||
},
|
||
//数据恢复
|
||
recoveryData(data) {
|
||
return new Promise((resolve, reject) => {
|
||
|
||
console.log(data)
|
||
switch (data.actionType) {
|
||
case 'add':
|
||
if (data.mapType == 'regon') {
|
||
self.sketchLayer.polygonLayer.graphics.items.forEach(item => {
|
||
if (item.id == data.id) {
|
||
self.sketchLayer.polygonLayer.remove(item)
|
||
}
|
||
})
|
||
resolve()
|
||
}
|
||
|
||
break
|
||
case 'delete':
|
||
if (data.mapType == 'regon') {
|
||
let graphicData = JSON.parse(data.oldAttributes[0])
|
||
let polygon = new Polygon(JSON.parse(data.oldGeometry[0]))
|
||
let symbol = {
|
||
type: "simple-fill", // autocasts as new SimpleFillSymbol()
|
||
color: symbolData[data.tips],
|
||
outline: {
|
||
// autocasts as new SimpleLineSymbol()
|
||
color: [255, 255, 255, 0.4],
|
||
width: 0.5
|
||
}
|
||
}
|
||
const newPolygonGraphic = new Graphic({
|
||
geometry: polygon,
|
||
id: data.id,
|
||
symbol: symbol,
|
||
attributes: graphicData.attributes,
|
||
});
|
||
self.sketchLayer.polygonLayer.add(newPolygonGraphic)
|
||
resolve()
|
||
}
|
||
|
||
break
|
||
case 'edit':
|
||
console.log(data)
|
||
|
||
if (data.mapType == 'regon') {
|
||
self.sketchLayer.polygonLayer.graphics.items.forEach(item => {
|
||
if (item.id == data.id) {
|
||
let geometry = new Polygon(JSON.parse(data.oldGeometry[0]))
|
||
item.set({
|
||
geometry
|
||
})
|
||
}
|
||
})
|
||
resolve()
|
||
}
|
||
|
||
|
||
|
||
|
||
break
|
||
|
||
}
|
||
|
||
})
|
||
|
||
|
||
},
|
||
|
||
//删除数据
|
||
delSketch() {
|
||
|
||
|
||
if (self.sketchLayer.selectGraphic) {
|
||
|
||
let val = self.sketchLayer.selectGraphic.attributes.data
|
||
let layer = ""
|
||
let selectData = self.sketchLayer.selectGraphic
|
||
switch (selectData.attributes.sketchType) {
|
||
case "polygon": layer = self.sketchLayer.polygonLayer.remove(selectData); break;
|
||
case "polyline": layer = self.sketchLayer.polylineLayer.remove(selectData); break;
|
||
}
|
||
|
||
|
||
mapLog.addContent({
|
||
mapType: self.ldMapActionType != 'lineAction' ? 'regon' : 'line',
|
||
actionType: 'delete',
|
||
isrevoke: true,
|
||
tips: val.type,
|
||
oldGeometry: [self.sketchLayer.selectGraphic.geometry],
|
||
oldAttributes: [self.sketchLayer.selectGraphic],
|
||
id: self.sketchLayer.selectGraphic.id,
|
||
})
|
||
self.sketchLayer.selectGraphic = null
|
||
return self.ldMapActionType == 'lineAction' ? null : val;
|
||
|
||
|
||
}
|
||
if (self.lighHight) {
|
||
if (self.selectLine) {
|
||
self.lineLayer.remove(self.selectLine)
|
||
self.sketchLayer.pointLayer.sublayers.items.forEach(item => {
|
||
if (item.id == self.selectLine.attributes.leftId) {
|
||
item.attributes.endIndex = null
|
||
}
|
||
if (item.id == self.selectLine.attributes.nextId) {
|
||
item.attributes.startIndex = null
|
||
}
|
||
})
|
||
}
|
||
if (self.selectPng) {
|
||
let mapdata = useMapDataStore()
|
||
mapdata.delPngTyle(self.selectPng.id).then(() => {
|
||
self.pngLayer.remove(self.selectPng)
|
||
})
|
||
|
||
}
|
||
}
|
||
|
||
},
|
||
destroyDraw() {
|
||
this.draw.destroy()
|
||
if (this.ldMapActionType == 'lineAction') {
|
||
this.drawTypeLine == 'once' ? this.pointLayerBind() : this.pointManyBind()
|
||
}
|
||
},
|
||
startDrawLine(type) {
|
||
|
||
self.drawTypeLine = type
|
||
this.draw && this.draw.destroy()
|
||
self.draw = new Draw({
|
||
view: this.view,
|
||
})
|
||
let action = self.draw.create("polyline", {
|
||
mode: 'click'
|
||
});
|
||
|
||
// self.view.focus()
|
||
// 顶点添加事件
|
||
action.on("vertex-add", (event) => self.creatLineByClick(event));
|
||
|
||
// 鼠标移动事件
|
||
action.on("cursor-update", (event) => self.creatLineByClick(event));
|
||
|
||
// 绘制完成事件
|
||
action.on("draw-complete", (e) => {
|
||
self.destroyDraw()
|
||
});
|
||
|
||
},
|
||
//根据画的线合并到最近的点位并找出中间点位相连
|
||
pointManyBind() {
|
||
|
||
let polylineLayer = self.lineLayer
|
||
|
||
let startItem = null, startMax = 30;
|
||
let endItem = null, endMax = 30;
|
||
|
||
let point = self.getSketchDataByType("point");
|
||
let line
|
||
try {
|
||
line = turf.lineString(self.newDrawLineByClick.geometry.paths[0]);
|
||
} catch (error) {
|
||
console.log(self.newDrawLineByClick.geometry.paths)
|
||
}
|
||
|
||
let options = { units: 'meters' };
|
||
let pointList = []
|
||
|
||
|
||
point.forEach(item => {
|
||
let polyline
|
||
let length
|
||
polyline = new Polyline({
|
||
paths: [self.newDrawLineByClick.geometry.paths[0][0], [item.geometry.x, item.geometry.y,]],
|
||
})
|
||
|
||
length = geometryEngine.geodesicLength(polyline, "meters");
|
||
if (length < startMax) {
|
||
startMax = length;
|
||
startItem = item
|
||
}
|
||
polyline = new Polyline({
|
||
paths: [self.newDrawLineByClick.geometry.paths[0][1], [item.geometry.x, item.geometry.y]],
|
||
})
|
||
length = geometryEngine.geodesicLength(polyline, "meters");
|
||
if (length < endMax) {
|
||
endMax = length;
|
||
endItem = item
|
||
}
|
||
|
||
let point = turf.point([item.geometry.x, item.geometry.y]);
|
||
|
||
if (line && turf.pointToLineDistance(point, line, options) < 10) {
|
||
pointList.push(item)
|
||
}
|
||
|
||
|
||
|
||
|
||
})
|
||
if (endItem && startItem) {
|
||
|
||
let list = pointList.filter(item => {
|
||
return item != startItem
|
||
})
|
||
console.log(list)
|
||
drawByStartItem(startItem)
|
||
|
||
function drawByStartItem(startItem) {
|
||
let Minlength = 999;
|
||
let endItem = ''
|
||
list.forEach(item => {
|
||
|
||
let polyline = new Polyline({
|
||
paths: [[startItem.geometry.x, startItem.geometry.y], [item.geometry.x, item.geometry.y]],
|
||
})
|
||
length = geometryEngine.geodesicLength(polyline, "meters");
|
||
if (length < Minlength) {
|
||
endItem = item
|
||
Minlength = length
|
||
}
|
||
})
|
||
if (endItem) {
|
||
let lineValue = [[startItem.geometry.x, startItem.geometry.y], [endItem.geometry.x, endItem.geometry.y]]
|
||
let lineValueResve = [[endItem.geometry.x, endItem.geometry.y], [startItem.geometry.x, startItem.geometry.y]]
|
||
let polyline = new Polyline({
|
||
paths: lineValue,
|
||
})
|
||
let flag = polylineLayer.graphics.items.filter(data => {
|
||
return JSON.stringify(lineValue) == JSON.stringify(data.geometry.paths[0]) || JSON.stringify(lineValueResve) == JSON.stringify(data.geometry.paths[0])
|
||
})
|
||
|
||
|
||
if (!flag.length) {
|
||
|
||
let newId = parseInt(startItem.id + '1')
|
||
startItem.attributes.endIndex = newId
|
||
endItem.attributes.startIndex = newId
|
||
const lineSymbol = self.returnLineSymbole(3, [0, 255, 255, 255])
|
||
let graphic = new Graphic({
|
||
geometry: polyline,
|
||
id: newId,
|
||
attributes: {
|
||
leftId: startItem.id,
|
||
nextId: endItem.id,
|
||
data: {
|
||
lineId: newId,
|
||
styleId: 400,
|
||
length: geometryEngine.geodesicLength(polyline, "meters").toFixed(2),
|
||
path: polyline.paths[0],
|
||
startIndex: startItem.id,
|
||
endIndex: endItem.id,
|
||
}
|
||
},
|
||
symbol: lineSymbol
|
||
})
|
||
|
||
polylineLayer.add(graphic)
|
||
}
|
||
list = list.filter(item => item != endItem)
|
||
if (list.length != 0)
|
||
drawByStartItem(endItem)
|
||
}
|
||
|
||
|
||
|
||
|
||
}
|
||
}
|
||
|
||
self.view.graphics.removeAll();
|
||
|
||
},
|
||
//根据画的线合并到最近的点位
|
||
pointLayerBind() {
|
||
|
||
|
||
let polylineLayer = self.lineLayer
|
||
|
||
let startItem = null, startMax = 30;
|
||
let endItem = null, endMax = 30;
|
||
|
||
let point = self.getSketchDataByType("point");
|
||
point.forEach(item => {
|
||
let polyline
|
||
let length
|
||
polyline = new Polyline({
|
||
paths: [self.newDrawLineByClick.geometry.paths[0][0], [item.geometry.x, item.geometry.y,]],
|
||
})
|
||
length = geometryEngine.geodesicLength(polyline, "meters");
|
||
if (length < startMax) {
|
||
startMax = length;
|
||
startItem = item
|
||
}
|
||
|
||
polyline = new Polyline({
|
||
paths: [self.newDrawLineByClick.geometry.paths[0][1], [item.geometry.x, item.geometry.y]],
|
||
})
|
||
length = geometryEngine.geodesicLength(polyline, "meters");
|
||
if (length < endMax) {
|
||
endMax = length;
|
||
endItem = item
|
||
}
|
||
})
|
||
if (endItem && startItem) {
|
||
|
||
let polyline = new Polyline({
|
||
paths: [[startItem.geometry.x, startItem.geometry.y], [endItem.geometry.x, endItem.geometry.y]],
|
||
|
||
})
|
||
let newId = parseInt(startItem.id + '1')
|
||
startItem.attributes.endIndex = newId
|
||
endItem.attributes.startIndex = newId
|
||
const lineSymbol = self.returnLineSymbole(3, [0, 255, 255, 255])
|
||
let graphic = new Graphic({
|
||
geometry: polyline,
|
||
id: newId,
|
||
attributes: {
|
||
leftId: startItem.id,
|
||
nextId: endItem.id,
|
||
data: {
|
||
styleId: 400,
|
||
|
||
lineId: newId,
|
||
length: geometryEngine.geodesicLength(polyline, "meters").toFixed(2),
|
||
path: polyline.paths[0],
|
||
startIndex: startItem.id,
|
||
endIndex: endItem.id,
|
||
}
|
||
},
|
||
symbol: lineSymbol
|
||
})
|
||
|
||
polylineLayer.add(graphic)
|
||
}
|
||
|
||
self.view.graphics.removeAll();
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
},
|
||
creatLineByClick(event) {
|
||
|
||
|
||
self.view.graphics.removeAll();
|
||
|
||
var vertices = event.vertices;
|
||
|
||
let falg = false
|
||
if (vertices.length > 2) {
|
||
vertices = vertices.slice(0, 2)
|
||
falg = true
|
||
}
|
||
|
||
let polyline = {
|
||
type: "polyline", // autocasts as new Polyline()
|
||
paths: vertices,
|
||
|
||
}
|
||
const lineSymbol = self.returnLineSymbole(3, [0, 255, 255, 255])
|
||
let graphic = new Graphic({
|
||
geometry: polyline,
|
||
attributes: {
|
||
data: '1111'
|
||
},
|
||
symbol: lineSymbol
|
||
})
|
||
self.view.graphics.add(graphic)
|
||
if (falg) this.destroyDraw()
|
||
self.newDrawLineByClick = graphic
|
||
},
|
||
|
||
|
||
//处理合并的经纬度
|
||
Bindpolygon() {
|
||
|
||
let polygonLayer = self.sketchLayer.polygonLayer
|
||
let graphic = self.view.graphics.items[0]
|
||
|
||
|
||
if (!graphic || !self.sketchLayer.selectGraphic) { return }
|
||
let polygon1 = new Polygon({
|
||
rings: graphic.geometry.rings
|
||
})
|
||
let item = self.sketchLayer.selectGraphic
|
||
let rings = item.geometry.rings
|
||
let newRings = []
|
||
let deletFlag = false;
|
||
rings.forEach(ring => {
|
||
let newRing = []
|
||
ring.forEach(p => {
|
||
let point = new Point({ x: p[0], y: p[1] })
|
||
const pointFlag = geometryEngine.intersect(polygon1, point);
|
||
if (!pointFlag) {
|
||
newRing.push(p)
|
||
} else {
|
||
deletFlag = true
|
||
}
|
||
})
|
||
newRing.length && newRings.push(newRing)
|
||
})
|
||
console.log(newRings)
|
||
if (deletFlag) {
|
||
if (newRings.length) {
|
||
|
||
if (!item.attributes.data.action) {
|
||
item.attributes.data.action = 1
|
||
}
|
||
|
||
item.geometry.set({
|
||
rings: newRings
|
||
})
|
||
item.notifyGeometryChanged()
|
||
self.polygonSketchViewModel.update(item, { tool: "reshape" })
|
||
} else {
|
||
polygonLayer.remove(item)
|
||
let mapdata = useMapDataStore()
|
||
mapdata.delData(item.attributes.data);
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
self.view.graphics.removeAll()
|
||
|
||
|
||
},
|
||
createPolygon(event) {
|
||
|
||
var vertices = event.vertices;
|
||
//两点画矩形
|
||
if (vertices.length < 2) {
|
||
return
|
||
}
|
||
var rings = [vertices[0], [vertices[0][0], vertices[1][1]], vertices[1], [vertices[1][0], vertices[0][1]]];
|
||
self.view.graphics.removeAll();
|
||
|
||
|
||
const polygon = new Polygon({
|
||
hasZ: false,
|
||
hasM: false,
|
||
rings: [rings],
|
||
|
||
})
|
||
let graphic = new Graphic({
|
||
geometry: polygon,
|
||
symbol: {
|
||
type: "simple-fill", // autocasts as new SimpleFillSymbol()
|
||
color: [234, 191, 13, 0.6],
|
||
style: "solid",
|
||
outline: { // autocasts as new SimpleLineSymbol()
|
||
color: "white",
|
||
width: 1
|
||
}
|
||
|
||
|
||
}
|
||
})
|
||
|
||
self.view.graphics.add(graphic)
|
||
},
|
||
addImgbyLine(points, x, y, imgPoint) {
|
||
|
||
if (imgPoint) {
|
||
|
||
self.view.graphics.remove(imgPoint)
|
||
}
|
||
|
||
var x1 = points[0][0]
|
||
var y1 = points[0][1]
|
||
var x2 = points[1][0]
|
||
var y2 = points[1][1]
|
||
let p = (y2 - y1) / (x2 - x1)// 斜率
|
||
|
||
let angle = self.calcAngle(x1, y1, x2, y2) //朝向
|
||
let point = {
|
||
type: "point",
|
||
longitude: x,
|
||
latitude: y,
|
||
}
|
||
let graphic = new Graphic({
|
||
geometry: point,
|
||
symbol: {
|
||
type: "picture-marker",
|
||
url: "http://localhost/src/ldmap/assets/tool/icon.png",
|
||
width: 20,
|
||
height: 20,
|
||
angle: angle
|
||
}
|
||
})
|
||
self.view.graphics.add(graphic)
|
||
return graphic
|
||
},
|
||
calcAngle(x1, y1, x2, y2) {
|
||
let tan = (Math.atan(Math.abs((y2 - y1) / (x2 - x1))) * 180) / Math.PI + 90
|
||
if (x2 > x1 && y2 > y1) {
|
||
return -tan + 180
|
||
} else if (x2 > x1 && y2 < y1) {
|
||
return tan
|
||
} else if (x2 < x1 && y2 > y1) {
|
||
return tan - 180
|
||
} else {
|
||
return -tan
|
||
}
|
||
},
|
||
drawPoint(data) {
|
||
|
||
let position = {
|
||
type: "point",
|
||
longitude: data[0],
|
||
latitude: data[1]
|
||
}
|
||
let graphic = new Graphic({
|
||
geometry: position,
|
||
symbol: {
|
||
type: "simple-marker", // autocasts as new SimpleMarkerSymbol()
|
||
|
||
color: 'yello',
|
||
size: "8px",
|
||
outline: { // autocasts as new SimpleLineSymbol()
|
||
color: [255, 255, 0],
|
||
width: 3 // points
|
||
}
|
||
}
|
||
})
|
||
self.view.graphics.add(graphic)
|
||
|
||
},
|
||
//优化管线数据(大于50)
|
||
ponitBindByFivety(MAXLENGTH = 50) {
|
||
|
||
let pointAll = self.getSketchDataByType("point");
|
||
let linelayer = self.lineLayer.graphics.items
|
||
pointAll.forEach(item => {
|
||
if (!item.attributes.startIndex && item.attributes.endIndex) {
|
||
try {
|
||
|
||
//从头开始找
|
||
getpointByStart(item, null, [], [])
|
||
|
||
} catch (error) {
|
||
}
|
||
|
||
}
|
||
})
|
||
function getpointByStart(leftPoint, leftLIne, arrPoint, arrline) {
|
||
if (leftPoint.attributes.data.pointType == 'x') {
|
||
if (arrPoint.length) {
|
||
arrPoint.push(leftPoint)
|
||
arrline.push(leftLIne)
|
||
isArrPointMax50(arrPoint, arrline)
|
||
arrPoint = [];
|
||
arrline = []
|
||
//597 595 596
|
||
} else {
|
||
arrPoint.push(leftPoint)
|
||
|
||
|
||
}
|
||
|
||
|
||
} else {
|
||
if (arrPoint.length) {
|
||
arrPoint.push(leftPoint)
|
||
arrline.push(leftLIne)
|
||
}
|
||
|
||
}
|
||
let nextPoint, pointLine
|
||
for (let i = 0; i < linelayer.length; i++) {
|
||
if (linelayer[i].id == leftPoint.attributes.endIndex) {
|
||
pointLine = linelayer[i]
|
||
nextPoint = pointAll.filter(item => {
|
||
return item.id == pointLine.attributes.nextId
|
||
})[0]
|
||
break
|
||
}
|
||
|
||
}
|
||
if (nextPoint) {
|
||
getpointByStart(nextPoint, pointLine, arrPoint, arrline)
|
||
}
|
||
|
||
|
||
}
|
||
|
||
function isArrPointMax50(arrPoint, arrLine) {
|
||
|
||
let paths = []
|
||
arrPoint.forEach(item => {
|
||
paths.push([item.geometry.x, item.geometry.y])
|
||
})
|
||
let polyline = new Polyline({
|
||
paths: paths
|
||
|
||
})
|
||
let length = parseFloat(geometryEngine.geodesicLength(polyline, "meters"));
|
||
|
||
if (length >= MAXLENGTH) {
|
||
|
||
console.log(length)
|
||
|
||
|
||
|
||
length = length / 2
|
||
//判断中心点位再哪条线上
|
||
let centerLine
|
||
for (let i = 0; i < arrLine.length; i++) {
|
||
let item = arrLine[i]
|
||
let desic = parseFloat(geometryEngine.geodesicLength(item.geometry, "meters"))
|
||
length = length - desic
|
||
if (length <= 0) {
|
||
centerLine = item;
|
||
break;
|
||
}
|
||
}
|
||
//获取中心点位
|
||
let centerPoint = new Point({
|
||
x: centerLine.geometry.extent.center.x,
|
||
y: centerLine.geometry.extent.center.y
|
||
})
|
||
|
||
|
||
|
||
|
||
//新增中心点位
|
||
let mapdata = useMapDataStore()
|
||
let id = mapdata.setMaxPointIndex(1);
|
||
let symbol = {
|
||
type: "simple-marker",
|
||
style: "circle",
|
||
size: '14px',
|
||
color: [7, 253, 253, 255],
|
||
outline: {
|
||
width: 0
|
||
}
|
||
}
|
||
const newPointGraphic = new Graphic({
|
||
geometry: centerPoint,
|
||
symbol: symbol,
|
||
id,
|
||
attributes: {
|
||
data: { pointType: 'h' },
|
||
startIndex: centerLine.id,
|
||
endIndex: id + '1',
|
||
}
|
||
});
|
||
|
||
self.sketchLayer.pointLayer.add(newPointGraphic);
|
||
|
||
//clone 一条线,开始和结尾改为连接到中心点位
|
||
|
||
|
||
|
||
let centerlineClone = centerLine.clone()
|
||
|
||
centerLine.set({
|
||
geometry: new Polyline({
|
||
paths: [
|
||
[centerPoint.x, centerPoint.y],
|
||
centerLine.geometry.paths[0][1],
|
||
]
|
||
})
|
||
})
|
||
centerLine.attributes.leftId = id
|
||
|
||
|
||
|
||
|
||
|
||
let newPolygon = new Polyline({
|
||
paths: [
|
||
centerlineClone.geometry.paths[0][0],
|
||
[centerPoint.x, centerPoint.y],
|
||
]
|
||
})
|
||
let LineGraphic = new Graphic({
|
||
geometry: newPolygon,
|
||
id: id * 10 + 1,
|
||
attributes: {
|
||
leftId: centerlineClone.attributes.leftId,
|
||
nextId: id,
|
||
data: centerlineClone.attributes.data
|
||
},
|
||
symbol: centerlineClone.symbol
|
||
})
|
||
|
||
self.lineLaye.add(LineGraphic)
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
if (!self.hightlayer) {
|
||
self.hightlayer = new GraphicsLayer();
|
||
self.map.add(self.hightlayer)
|
||
}
|
||
|
||
|
||
|
||
const graphic = new Graphic({
|
||
geometry: polyline,
|
||
|
||
symbol: {
|
||
type: "simple-line",
|
||
width: 5,
|
||
color: "red",
|
||
},
|
||
|
||
});
|
||
self.hightlayer.add(graphic)
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
}
|
||
|
||
|
||
|
||
},
|
||
|
||
//优化检修井数据点位
|
||
pointBindByLength(minlength = 5) {
|
||
let pointAll = self.getSketchDataByType("point");
|
||
let linelayer = self.lineLayer.graphics.items
|
||
let index
|
||
let sum
|
||
let num
|
||
let allSum = 0
|
||
do {
|
||
console.log('--------------------------------')
|
||
sum = 0
|
||
index = 1
|
||
pointAll.forEach((item) => {
|
||
|
||
if (!item.attributes.startIndex && item.attributes.endIndex) {
|
||
try {
|
||
num = 0
|
||
//从头开始找
|
||
num = getpointBytype(item, num)
|
||
// console.log(`查找中:${index++}条,优化点位${num}个`)
|
||
sum += num
|
||
} catch (error) {
|
||
console.log(error)
|
||
|
||
}
|
||
|
||
}
|
||
|
||
})
|
||
allSum += sum
|
||
console.log(sum)
|
||
} while (sum)
|
||
|
||
return allSum
|
||
|
||
|
||
|
||
|
||
|
||
//找到相邻的点位并且是检修井
|
||
function getpointBytype(leftPoint, num) {
|
||
|
||
let nextPoint, p1Top2Line
|
||
for (let i = 0; i < linelayer.length; i++) {
|
||
if (linelayer[i].id == leftPoint.attributes.endIndex) {
|
||
p1Top2Line = linelayer[i]
|
||
nextPoint = pointAll.filter(item => {
|
||
return item.id == p1Top2Line.attributes.nextId
|
||
})[0]
|
||
break
|
||
}
|
||
|
||
}
|
||
if (nextPoint) {
|
||
if (leftPoint.attributes.data.pointType == 'x' && nextPoint.attributes.data.pointType == 'x') {
|
||
nextPoint = setLinelength(leftPoint, nextPoint, p1Top2Line)
|
||
}
|
||
num = nextPoint == leftPoint ? num + 1 : num
|
||
|
||
return getpointBytype(nextPoint, num)
|
||
|
||
} else {
|
||
return num
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
}
|
||
function setLinelength(point1, point2, p1Top2Line) {
|
||
|
||
let length = parseFloat(geometryEngine.geodesicLength(p1Top2Line.geometry, "meters").toFixed(2));
|
||
// console.log(length)
|
||
if (length >= 50) {
|
||
console.log('50米', length, p1Top2Line)
|
||
}
|
||
if (length < minlength) {
|
||
|
||
let p3, p2top3line
|
||
|
||
//所有连接到p2的点位都替换到p1,并且连接线都改成连接p1(除了p1本身)
|
||
linelayer.forEach(item => {
|
||
if (item.attributes.nextId == point2.id && item.attributes.leftId != point1.id) {
|
||
item.attributes.nextId = point1.id;
|
||
let polyline = new Polyline({
|
||
paths: [item.geometry.paths[0][0], [point1.geometry.x, point1.geometry.y]],
|
||
|
||
})
|
||
item.set({
|
||
geometry: polyline,
|
||
})
|
||
}
|
||
|
||
if (item.attributes.leftId == point2.id) {
|
||
p3 = pointAll.filter(val => val.id == item.attributes.nextId)[0]
|
||
p2top3line = item
|
||
}
|
||
})
|
||
|
||
//p1到p2的线修改成p1到p3
|
||
|
||
let polyline = new Polyline({
|
||
paths: [p1Top2Line.geometry.paths[0][0], [p3.geometry.x, p3.geometry.y]],
|
||
|
||
})
|
||
p1Top2Line.set({
|
||
geometry: polyline,
|
||
attributes: {
|
||
...p1Top2Line.attributes,
|
||
nextId: p3.id
|
||
}
|
||
})
|
||
|
||
|
||
//p2连接到p3的线删除
|
||
|
||
self.lineLayer.remove(p2top3line)
|
||
//p2删除
|
||
self.sketchLayer.pointLayer.remove(point2)
|
||
|
||
|
||
|
||
|
||
return point1
|
||
} else {
|
||
return point2
|
||
}
|
||
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
},
|
||
drawPolygon(data) {
|
||
|
||
|
||
const polygon = new Polygon({
|
||
rings: data.path,
|
||
|
||
|
||
})
|
||
let graphic = new Graphic({
|
||
geometry: polygon,
|
||
attributes: data,
|
||
symbol: {
|
||
type: "simple-fill",
|
||
color: [226, 119, 40],
|
||
|
||
}
|
||
|
||
})
|
||
let editPolygonLayer = new GraphicsLayer({
|
||
graphics: [graphic],
|
||
id: 'editPolygonLayer',
|
||
fullExtent: {
|
||
spatialReference: 4326
|
||
}
|
||
})
|
||
self.map.add(editPolygonLayer)
|
||
const sketchViewModel = new SketchViewModel({
|
||
view: self.view,
|
||
layer: editPolygonLayer,
|
||
defaultUpdateOptions: {
|
||
highlightOptions: {
|
||
enabled: false,
|
||
},
|
||
enableScaling: false,
|
||
tool: 'reshape',
|
||
reshapeOptions: {
|
||
// edgeOperation :'none',
|
||
shapeOperation: 'none'
|
||
}
|
||
},
|
||
});
|
||
|
||
},
|
||
drawLine(data) {
|
||
|
||
let graphics = []
|
||
data.forEach(item => {
|
||
let line = new Polyline({
|
||
paths: item.path,
|
||
"spatialReference": self.view.spatialReference
|
||
})
|
||
let graphic = new Graphic({
|
||
geometry: line,
|
||
attributes: item,
|
||
symbol: {
|
||
type: "simple-line", // autocasts as new SimpleMarkerSymbol()
|
||
color: item.color,
|
||
width: item.width, // pixels
|
||
outline: { // autocasts as new SimpleLineSymbol()
|
||
color: [255, 255, 0],
|
||
width: 3 // points
|
||
}
|
||
},
|
||
// popupTemplate:{
|
||
// title: '管道'
|
||
// },
|
||
})
|
||
graphic.attributes.imgPoint = self.addImgbyLine(
|
||
item.path,
|
||
graphic.geometry.extent.center.x,
|
||
graphic.geometry.extent.center.y
|
||
)
|
||
graphics.push(graphic)
|
||
});
|
||
let editPolygonLayer = new GraphicsLayer({
|
||
graphics: graphics,
|
||
id: 'editPolygonLayer',
|
||
fullExtent: {
|
||
spatialReference: 4326
|
||
}
|
||
})
|
||
|
||
self.map.add(editPolygonLayer)
|
||
// const sketchViewModel = new SketchViewModel({
|
||
// view: self.view,
|
||
// layer: editPolygonLayer,
|
||
// defaultUpdateOptions: {
|
||
// highlightOptions: {
|
||
// enabled: false,
|
||
// },
|
||
// enableScaling: false,
|
||
// tool: 'reshape',
|
||
// reshapeOptions: {
|
||
// // edgeOperation :'none',
|
||
// shapeOperation: 'none'
|
||
// }
|
||
// },
|
||
|
||
|
||
// });
|
||
// sketchViewModel.on("update", onGraphicUpdate);
|
||
// function onGraphicUpdate(event) {
|
||
// // get the graphic as it is being updated
|
||
// const graphic = event.graphics[0];
|
||
|
||
// let extent = graphic.geometry.extent
|
||
// graphic.attributes.imgPoint = self.addImgbyLine(
|
||
// [[extent.xmax, extent.ymax], [extent.xmin, extent.ymin],],
|
||
// graphic.geometry.extent.center.x,
|
||
// graphic.geometry.extent.center.y,
|
||
// graphic.attributes.imgPoint
|
||
|
||
// )
|
||
|
||
// }
|
||
|
||
|
||
|
||
},
|
||
}
|
||
|
||
export default ldMap
|