/* * 图形相关的操作 js * */ import layers from '@/api/json/layers.json' import queryUtils from "@/utils/map/queryUtils"; import identifyUtils from '@/utils/map/IdentifyUtils' import { loadModules } from "esri-loader" import featureUpdate from "@/utils/map/featureUpdate"; import arcgisParser from 'terraformer-arcgis-parser' import wktParse from 'terraformer-wkt-parser' import { maps } from '@/utils/map/mapUtils' import graphicSymbol from '@/api/json/graphicSymbol.json' export default { data () { return { } }, methods: { getLayerByName (name) { for (var i = 0; i < layers.length; i++) { if (layers[i].layerName == name) { return layers[i]; } } return null; }, queryGeoByBsm (bsm, type, callBackFunction, outSpatialReference) { var layer = null; if (type == 'zd') { layer = this.getLayerByName("ZDJBXX"); } else if (type == 'zrz') { layer = this.getLayerByName("ZRZ"); } else { console.log("未定义类型!!"); return; } if (!layer) { console.log("没有找到图层,不能查询"); return; } queryUtils.methods.queryByWhere(layer.layerUrl + "/" + layer.id, { "BSM": bsm }, null, true, null, outSpatialReference, function (res) { var features = res.features; if (callBackFunction && typeof callBackFunction == 'function') { callBackFunction(features); } }); }, //生成介质点 craetJZPoint (graphic) { var geomtry = graphic.geometry, rings = geomtry.rings[0]; var pointInfos = []; this.getPointByRings(rings, pointInfos); return pointInfos; }, getPointByRings (rings, pointInfos) { for (var i = 0; i < rings.length; i++) { var children = rings[i]; if (children.length == 2 && typeof children[0] == 'number') { var obj = {}; obj.jzdh = "j" + pointInfos.length; obj.sxh = pointInfos.length; obj.x = children[0]; obj.y = children[1]; pointInfos.push(obj); } else { this.getPointByRings(children, pointInfos); } } }, //生成介质线 createJZLine (graphic, callBackFunction) { var self = this; loadModules([ "esri/geometry/support/geodesicUtils", "esri/geometry/Point", "esri/geometry/Polyline" ]).then(([ geodesicUtils, Point, Polyline ]) => { //取得各个坐标点 然后生成外围坐标线 var geometry = graphic.geometry, rings = geometry.rings, points = []; if (rings.length > 0) { for (var i = 0; i < rings.length; i++) { var danPoints = []; self.getPointByRings(rings[i], danPoints); points.push(danPoints); } } else { var danPoints = []; self.getPointByRings(rings, danPoints); points.push(danPoints); } var lines = []; //meters for (var i = 0; i < points.length; i++) { for (var j = 0; j < points[i].length; j++) { if (j < (points[i].length - 1)) { const join = geodesicUtils.geodesicDistance( new Point({ x: points[i][j].x, y: points[i][j].y }), new Point({ x: points[i][j + 1].x, y: points[i][j + 1].y }), "meters" ); const { distance, azimuth } = join; var obj = { startPoint: points[i][j].x + "," + points[i][j].y, endPoint: points[i][j + 1].x + "," + points[i][j + 1].y, qdh: points[i][j].sxh, zdh: points[i][j + 1].sxh, distance: distance, jzxlx: "", jzxwz: "", jzxxz: "", remark: "" } lines.push(obj); } else { const join = geodesicUtils.geodesicDistance( new Point({ x: points[i][j].x, y: points[i][j].y }), new Point({ x: points[i][0].x, y: points[i][0].y }), "meters" ); const { distance, azimuth } = join; var obj = { startPoint: points[i][j].x + "," + points[i][j].y, endPoint: points[i][0].x + "," + points[i][0].y, qdh: points[i][j].sxh, zdh: points[i][0].sxh, distance: distance, jzxlx: "", jzxwz: "", jzxxz: "", remark: "" } lines.push(obj); } } } if (callBackFunction && typeof callBackFunction == "function") { callBackFunction(lines); } }).catch(err => { throw (err); }) }, //wkt转换成arcgis parseWktToArc (wkt) { var primitive = wktParse.parse(wkt); /*if(primitive.type == "MultiPolygon"){ primitive.type = "Polygon" }*/ return arcgisParser.convert(primitive) }, postionToThisGeo (bsm, type) { var view = maps["testMap"]; var layer = view.map.findLayerById("highlightLayer"); if (layer) { var graphics = layer.graphics; if (graphics.length > 0 && graphics.items[0].attributes.BSM == bsm) { // view.extent = graphics.items[0].geometry.extent; view.center = graphics.items[0].geometry.extent.center; view.zoom = 15; } } else { this.$message.success("暂无图形信息!!!"); } }, //导入空间图形是 先判断数据是否跨界 geoJoint (geometry, callBacFunction) { var self = this; loadModules([ "esri/geometry/geometryEngine", "esri/geometry/Polygon" ]).then(([ geometryEngine, Polygon ]) => { var djqLayer = null, djzqLayer = null, xjzqLayer = null; djqLayer = self.getLayerByName("DJQ"); djzqLayer = self.getLayerByName("DJZQ"); xjzqLayer = self.getLayerByName("XJZQ"); var layerIds = []; layerIds.push(djqLayer.id); layerIds.push(djzqLayer.id); layerIds.push(xjzqLayer.id); var polygon = new Polygon(geometry); identifyUtils.methods.identify(djqLayer.layerUrl, layerIds, polygon, function (res) { var results = res.results; var isJoint = false, layerName = "", message = ""; if (!results || results.length == 0) { callBacFunction(true, "不在行政区内,请检查空间位置信息!!!"); } for (var i = 0; i < results.length; i++) { var feature = results[i].feature; var flag = geometryEngine.intersects(polygon, feature.geometry); var withinFlag = geometryEngine.within(polygon, feature.geometry); if (!withinFlag && flag) { isJoint = true; layerName = results[i].layerName; switch (layerName) { case 'DJQ': message = "地块跨越地籍区,数据不合法!!!"; break; case 'DJZQ': message = "地块跨越地籍子区,数据不合法!!!"; break; case 'XJZQ': message = "地块跨越行政区,数据不合法!!!"; break; } break } } if (callBacFunction && typeof callBacFunction == "function") { callBacFunction(isJoint, message); } }, true) }).catch(err => { console.log(err); throw (err); }) }, //保存或者编辑属性信息 updAttributes (bsm, type, attributes, callBackFunction, ydybsm) { var layer = null; if (type == 'zd') { layer = this.getLayerByName("ZDJBXX"); } else { layer = this.getLayerByName("ZRZ"); } var featureUrl = layer.layerUrl.replace("MapServer", "FeatureServer"); featureUrl += "/" + layer.id; this.queryGeoByBsm(ydybsm ? ydybsm : bsm, type, function (features) { if (features && features.length > 0) { attributes.OBJECTID = features[0].attributes.OBJECTID; features[0].attributes = attributes; /* var wkt = "PROJCS[\"XADFZBX\",GEOGCS[\"GCS_WGS_1984\",DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137.0,298.257223563]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"False_Easting\",0.0],PARAMETER[\"False_Northing\",0.0],PARAMETER[\"Central_Meridian\",0.0],PARAMETER[\"Scale_Factor\",1.0],PARAMETER[\"Latitude_Of_Origin\",0.0],UNIT[\"Meter\",1.0]]"; features[0].geometry.spatialReference = { wkt:wkt }*/ if (ydybsm) { features[0].attributes.BSM = ydybsm; } featureUpdate.methods.updateGraphic(featureUrl, features[0], callBackFunction); } else { var graphic = { attributes: attributes } featureUpdate.methods.addGraphic(featureUrl, graphic, callBackFunction); } }); }, //叠加分析 同一个图层的叠加分析 zdOverAnalys (bsm, graphic, callBacFunction) { var self = this; loadModules([ "esri/geometry/Polygon" ]).then(([ Polygon ]) => { var zdLayer = null; zdLayer = self.getLayerByName("ZDJBXX"); var layerIds = []; layerIds.push(zdLayer.id); var polygon = new Polygon(graphic.geometry); identifyUtils.methods.identify(zdLayer.layerUrl, layerIds, polygon, function (res) { var results = res.results; //判断数据是否与其他数据有重叠 var flag = false; if (results && results.length > 0) { flag = true; //加载在图层上 原本的要导入的数据 和重叠数据 self.addOverLayer(polygon, results); } callBacFunction(flag, results); }, true) }).catch(err => { console.log(err); throw (err); }) }, //添加添加元素和覆盖的元素到地图上 addOverLayer (geometry, results) { var view = maps["testMap"]; loadModules([ "esri/Graphic", "esri/geometry/Polygon", "esri/layers/GraphicsLayer", "esri/geometry/geometryEngineAsync", "esri/geometry/Extent" ]).then(([ Graphic, Polygon, GraphicsLayer, geometryEngineAsync, Extent ]) => { var graphic = new Graphic({ geometry: geometry }) var layer = view.map.findLayerById("overLayer"); if (layer) { layer.removeAll(); } else { layer = new GraphicsLayer({ id: "overLayer" }) view.map.add(layer); } var impotSymbol = graphicSymbol.fillSymbol.importSymbol, defaultSymbol = graphicSymbol.fillSymbol.defaultSymbol; for (var i = 0; i < results.length; i++) { var feature = results[i].feature; feature.symbol = defaultSymbol; layer.add(feature); var geo = geometryEngineAsync.intersect(feature.geometry, geometry); geo.then(function (res) { var interGra = new Graphic({ geometry: res, symbol: graphicSymbol.fillSymbol.highlightSymbol }) layer.add(interGra); }) } graphic.symbol = impotSymbol layer.add(graphic); var extent = new Extent(JSON.parse(JSON.stringify(graphic.geometry.extent))) extent.spatialReference = view.spatialReference; // view.extent = extent; view.center = extent.center; view.zoom = 15; }).catch(err => { console.log(err); }) }, clearOverLayer () { var view = maps["testMap"]; var layer = view.map.findLayerById("overLayer"); if (layer) { layer.removeAll(); } }, //自然幢叠加分析 不能跨宗地 图层本身的叠加分析 zrzOverAnalys (bsm, graphic, callBacFunction) { var self = this; loadModules([ "esri/geometry/Polygon", "esri/geometry/geometryEngine" ]).then(([ Polygon, geometryEngine ]) => { var polygon = new Polygon(graphic.geometry); var zdLayer = null, zrzLayer = null; zdLayer = self.getLayerByName("ZDJBXX"); zrzLayer = self.getLayerByName("ZRZ"); var layerIds = []; layerIds.push(zdLayer.id); layerIds.push(zrzLayer.id); identifyUtils.methods.identify(zdLayer.layerUrl, layerIds, polygon, function (res) { var results = res.results; //判断数据是否与其他数据有重叠 var flag = false, mesge = ""; if (results && results.length > 0) { for (var i = 0; i < results.length; i++) { var feature = results[i].feature, layerName = results[i].layerName; if (layerName == 'ZRZ') { if (!feature.attributes['标识码'] || feature.attributes['标识码'] != bsm) { var interFlag = geometryEngine.intersects(polygon, feature.geometry); if (interFlag) { flag = true; mesge = "导入的自然幢与其他自然幢重叠,不能导入!!!"; break; } } } else if (layerName == 'ZDJBXX') { var interFlag = geometryEngine.intersects(polygon, feature.geometry); var withinFlag = geometryEngine.within(polygon, feature.geometry); if (!withinFlag && interFlag) { flag = true; mesge = "导入的自然幢与其跨宗地,不能导入!!!"; break; } } } } callBacFunction(flag, mesge); }, true) }).catch(err => { console.log(err); }) }, //去除重叠部分 getDifference (inputGraphic, subGraphic, callBackFuncton) { loadModules([ "esri/geometry/Polygon", "esri/geometry/geometryEngine", "esri/Graphic" ]).then(([ Polygon, geometryEngine, Graphic ]) => { var inputGeometry = new Polygon(inputGraphic.geometry); var outGeometry = null; for (var i = 0; i < subGraphic.length; i++) { var feature = subGraphic[i].feature; outGeometry = geometryEngine.difference(inputGeometry, feature.geometry); } if (callBackFuncton && typeof callBackFuncton == 'function') { callBackFuncton(outGeometry); } }).catch(err => { console.log(err); }) }, //业务处理 先用query方法 查询将所有属性查询 在做空间裁剪 getResultsDif (subGraphics, currntGraphic, callBackFunction, flag) { var self = this; loadModules([ "esri/geometry/geometryEngine", "esri/geometry/Polygon" ]).then(([ geometryEngine, Polygon ]) => { var objectIds = []; subGraphics.filter(item => { objectIds.push(item.feature.attributes.OBJECTID); }) var inputGeometry = new Polygon(currntGraphic.geometry); var zdLayer = self.getLayerByName("ZDJBXX"); queryUtils.methods.queryByWhere(zdLayer.layerUrl + "/" + zdLayer.id, { OBJECTID: objectIds }, null, true, "", subGraphics[0].feature.geometry.spatialReference, function (result) { var features = result.features; if (flag) { for (var i = 0; i < features.length; i++) { features[i].geometry = geometryEngine.difference(features[i].geometry, inputGeometry); features[i].attributes.BGZT = 3; } } else { for (var i = 0; i < features.length; i++) { features[i].geometry = null; features[i].attributes.BGZT = 4; } } if (callBackFunction && typeof callBackFunction == 'function') { callBackFunction(features); } }) }).catch(err => { console.log(err); }) }, addGeoByBsm (bsm, type, viewId) { var self = this; var layer = null; if (type == 'zd') { layer = this.getLayerByName("ZDJBXX"); } else if (type == 'zrz') { layer = this.getLayerByName("ZRZ"); } else { console.log("未定义类型!!"); return; } if (!layer) { console.log("没有找到图层,不能查询"); return; } queryUtils.methods.queryByWhere(layer.layerUrl + "/" + layer.id, { "BSM": bsm }, null, true, null, null, function (res) { var features = res.features; if (features && features.length > 0) { if (!features[0].geometry || features[0].geometry.rings.length == 0) { self.$message.success("暂无图形信息!!"); return; } loadModules([ "esri/layers/GraphicsLayer" ]).then(([ GraphicsLayer ]) => { var view = maps[viewId]; var layer = view.map.findLayerById("highlightLayer"); if (layer) { layer.removeAll(); } else { layer = new GraphicsLayer({ id: "highlightLayer" }) view.map.add(layer, 5); } var symbol = graphicSymbol.fillSymbol.highlightSymbol; var graphic = features[0]; graphic.symbol = symbol; layer.add(graphic); // view.extent = graphic.geometry.extent; view.center = graphic.geometry.extent.center; view.zoom = 15; }).catch(err => { thow(err); }) } else { self.$message.success("暂无图形信息!!"); return; } }); }, //清空当前图层 clearHighlightLayer (viewId) { var view = maps[viewId]; var layer = view.map.findLayerById("highlightLayer"); if (layer) { layer.removeAll(); } } } }