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