From 30438ac172d22aaa09cde17312f98677c8ce4c27 Mon Sep 17 00:00:00 2001 From: TreeWish <1131093754@qq.com> Date: 星期四, 02 三月 2023 17:49:34 +0800 Subject: [PATCH] 选择中线缓冲区查询 --- src/components/MapView/mapMenuTop.vue | 568 ++++++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 402 insertions(+), 166 deletions(-) diff --git a/src/components/MapView/mapMenuTop.vue b/src/components/MapView/mapMenuTop.vue index 797f823..1d15714 100644 --- a/src/components/MapView/mapMenuTop.vue +++ b/src/components/MapView/mapMenuTop.vue @@ -1,10 +1,6 @@ <template> <div class="menuBox"> - <el-form - :inline="true" - :model="menuTopFrom" - class="demo-form-inline" - > + <el-form :inline="true" :model="menuTopFrom" class="demo-form-inline"> <el-form-item> <el-select v-model="menuTopFrom.queryLayer" @@ -12,10 +8,7 @@ placeholder="璇烽�夋嫨..." :popper-append-to-body="false" > - <el-option - :value="menuTopFrom.queryLayer" - style="height: 100%" - > + <el-option :value="menuTopFrom.queryLayer" style="height: 100%"> <div style="height: 200px; overflow: auto"> <el-tree :data="layerData" @@ -29,17 +22,16 @@ </el-tree> </div> <div style="margin-top: 5px"> - <el-button - size="small" - plain - @click="getCheckedNodes" - >纭</el-button> + <el-button size="small" plain @click="getCheckedNodes" + >纭</el-button + > <el-button size="small" type="info" plain @click="resetCheckedNodes" - >閲嶇疆</el-button> + >閲嶇疆</el-button + > </div> </el-option> </el-select> @@ -76,18 +68,14 @@ >瀵煎叆閫夋嫨鑼冨洿</el-link > --> </el-form-item> + <el-form-item> - <el-button - plain - size="small" - @click="getAttributeQuery" - >鏌ヨ</el-button> - <el-button - type="info" - size="small" - @click="clearQuery" - plain - >閲嶇疆</el-button> + <el-button plain size="small" @click="getAttributeQuery" + >鏌ヨ</el-button + > + <el-button type="info" size="small" @click="clearQuery" plain + >閲嶇疆</el-button + > </el-form-item> <!-- <el-form-item> <el-button @@ -103,26 +91,86 @@ </el-form-item> --> </el-form> <queryinfo ref="queryinfo" /> + <!-- <div class="buffer-container" ></div> --> + <el-dialog + custom-class="buffer-dialog" + top="40vh" + title="绠¢亾涓績绾挎煡璇�" + :visible.sync="dialogFormVisible" + :modal="false" + :close-on-click-modal="false" + width="25%" + > + <el-form :model="menuTopFrom" label-width="150px"> + <el-form-item label="绠¢亾涓績绾�"> + <el-select + @change="changeSelect2" + v-model="menuTopFrom.pipeline" + placeholder="璇烽�夋嫨" + > + <el-option + v-for="item in pipelineOption" + :key="item.gid" + :label="item.pipeName" + :value="item.pipeName" + > + </el-option> + </el-select> + </el-form-item> + <el-form-item label="閫夊彇绠¢亾"> + <el-select + v-model="menuTopFrom.segName" + placeholder="璇烽�夋嫨" + @change="selectChangeGid" + > + <el-option + v-for="item in segNameOption" + :key="item.gid" + :label="item.segName" + :value="item.gid" + > + </el-option> + </el-select> + </el-form-item> + <el-form-item label="缂撳啿鍖哄ぇ灏忥紙m锛�"> + <el-input-number + v-model="menuTopFrom.bufferSize" + placeholder="" + ></el-input-number> + </el-form-item> + </el-form> + <div slot="footer" class="dialog-footer"> + <el-button @click="dialogFormVisible = false">鍙� 娑�</el-button> + <el-button type="primary" @click="genBuffer">纭� 瀹�</el-button> + </div> + </el-dialog> </div> </template> <script> -import queryinfo from "../../views/Tools/queryinfo.vue"; -import $ from "jquery"; +import queryinfo from "../../views/Tools/queryinfo.vue" +import $ from "jquery" import { inquiry_SelectTabs, inquiry_uploadShp, encr, dataLib_selectTabs, -} from "../../api/api.js"; -import { getToken } from "@/utils/auth"; -import * as turf from "@turf/turf"; + pipelines_selectSegNames, +} from "../../api/api.js" +import { selectPipelines } from "@/api/screen.js" +import { getToken } from "@/utils/auth" +import * as turf from "@turf/turf" +import { wktToGeoJSON } from "@terraformer/wkt" + export default { components: { queryinfo }, data() { return { menuTopFrom: { queryType: "", + pipeline: "", + segName: "", + bufferSize: 10, }, treeChange: [], layerData: [ @@ -167,6 +215,10 @@ value: "inputFile", label: "瀵煎叆閫夋嫨鑼冨洿", }, + { + value: "buffer", + label: "涓嚎缂撳啿鍖�", + }, ], defaultProps: { children: "children", @@ -174,80 +226,87 @@ }, graphicLayer: null, flyEntity: null, - }; + pipelineOption: [], + segNameOption: [], + bufferEntities: [], + featureLayer: [], + analyGid: null, + dialogFormVisible: false, + } }, mounted() { - this.menuTopFrom.queryType = "rectangle"; - this.getAllTable(); + this.menuTopFrom.queryType = "rectangle" + this.getAllTable() + this.getPipelineData() }, methods: { changeValue(value) { - var obj = {}; + var obj = {} obj = this.queryOption.find(function (item) { - return item.value === value; - }); + return item.value === value + }) if (obj.value == "inputFile") { - this.getMenuTopFile(); + this.getMenuTopFile() + } else if (obj.value == "buffer") { + this.handleBuffer() } }, async getAllTable() { const data = await dataLib_selectTabs({ pageIndex: 1, pageSize: 500, - }); + }) if (data.code != 200) { - this.$message.error("鍒楄〃璋冪敤澶辫触"); + this.$message.error("鍒楄〃璋冪敤澶辫触") } - var option = data.result.filter((res) => { + var option = data.result.filter(res => { if (res.rows != 0) { - return res; + return res } - }); + }) for (var i in option) { - var val_Data = option[i]; - val_Data.id = "1" + i; - val_Data.label = val_Data.tabDesc; + var val_Data = option[i] + val_Data.id = "1" + i + val_Data.label = val_Data.tabDesc if (option[i].ns == "bd") { - this.layerData[0].children.push(val_Data); + this.layerData[0].children.push(val_Data) } else { - this.layerData[1].children.push(val_Data); + this.layerData[1].children.push(val_Data) } } }, //鑾峰彇閫夋嫨鏍戠殑鑺傜偣 getCheckedNodes() { - var valTree = this.$refs.tree.getCheckedNodes(); - if (valTree.length == 0) return; + var valTree = this.$refs.tree.getCheckedNodes() + if (valTree.length == 0) return - this.menuTopFrom.queryLayer = valTree[0].tabDesc; + this.menuTopFrom.queryLayer = valTree[0].tabDesc for (var i = 0; i < valTree.length; i++) { if (valTree[i].entity) { - - this.treeChange.push(valTree[i]); + this.treeChange.push(valTree[i]) } - } }, //娓呯┖鏍戦�変腑鐨勮妭鐐� resetCheckedNodes() { - this.treeChange = []; - this.menuTopFrom.queryLayer = null; - this.$refs.tree.setCheckedKeys([]); + this.treeChange = [] + this.menuTopFrom.queryLayer = null + this.$refs.tree.setCheckedKeys([]) }, //瀵煎叆shp鏂囦欢 async setMenuTopFile() { - var val = document.getElementById("getMenuTopFile").files; - if (!val || !val.length) return; - var formData = new FormData(); - var exts = [".shp", ".shx", ".dbf", ".prj"]; - var count = 0; + var val = document.getElementById("getMenuTopFile").files + if (!val || !val.length) return + var formData = new FormData() + var exts = [".shp", ".shx", ".dbf", ".prj"] + var count = 0 for (var i = 0; i < val.length; i++) { - var name = val[i].name.toLocaleLowerCase(); - var ext = name.substring(name.lastIndexOf(".")); + var name = val[i].name.toLocaleLowerCase() + var ext = name.substring(name.lastIndexOf(".")) if (exts.indexOf(ext) > -1) { - count++; - formData.append(val[i].name, val[i]); // fs.files[i].name,file + count++ + formData.append(val[i].name, val[i]) // fs.files[i].name,file } } @@ -255,8 +314,8 @@ this.$message({ message: "ShapeFile鏂囦欢閫夋嫨涓嶅叏锛�", type: "warning", - }); - return; + }) + return } $.ajax(BASE_URL + "/inquiry/uploadShp?token=" + getToken(), { type: "post", @@ -265,138 +324,149 @@ cache: false, processData: false, contentType: false, - success: (rs) => { + success: rs => { if (rs.code !== 200) { - return this.$message.error("鐢ㄦ埛瑙掕壊璇锋眰閿欒"); + return this.$message.error("鐢ㄦ埛瑙掕壊璇锋眰閿欒") } - this.$store.state.mapMenuShpFile = rs.result.wkt; - this.showMapMenuPop(); + this.$store.state.mapMenuShpFile = rs.result.wkt + this.showMapMenuPop() }, - error: (e) => { - console.log(e); + error: e => { + console.log(e) }, - }); + }) }, getMenuTopFile() { - $("#getMenuTopFile").click(); + $("#getMenuTopFile").click() }, //鏌ヨ getAttributeQuery() { //娓呯┖鏍囩粯 - sgworld.Creator.SimpleGraphic.edit(false, { editProp: false }); - sgworld.Creator.SimpleGraphic.clear(); + sgworld.Creator.SimpleGraphic.edit(false, { editProp: false }) + sgworld.Creator.SimpleGraphic.clear() + this.clearBufferEntities() if (this.$store.state.queryInfo.length != 0) { for (var i in this.$store.state.queryInfo) { - sgworld.Viewer.entities.remove(this.$store.state.queryInfo[i]); + sgworld.Viewer.entities.remove(this.$store.state.queryInfo[i]) } - this.$store.state.queryInfo = []; + this.$store.state.queryInfo = [] } if (this.$store.state.primitLayer != null) { - sgworld.Creator.DeleteObject(this.$store.state.primitLayer); - this.$store.state.primitLayer = null; + sgworld.Creator.DeleteObject(this.$store.state.primitLayer) + this.$store.state.primitLayer = null } if (this.treeChange.length == 0) { - this.$message.error("璇烽�夋嫨瑕佹煡璇㈢殑鏁版嵁"); - return; + this.$message.error("璇烽�夋嫨瑕佹煡璇㈢殑鏁版嵁") + return } - if (this.menuTopFrom.queryType != "inputFile") { - sgworld.Creator.createSimpleGraphic( - this.menuTopFrom.queryType, - { - color: "#00FF0060", - outlineColor: "#0f0", - outlineWidth: 5, - }, - (entity) => { - this.setTurfGeometry(entity); - } - ); - } else { - this.getMenuTopFile(); + let type = this.menuTopFrom.queryType + switch (type) { + case "buffer": + this.dialogFormVisible = true + break + case "inputFile": + this.getMenuTopFile() + + break + default: + sgworld.Creator.createSimpleGraphic( + this.menuTopFrom.queryType, + { + color: "#00FF0060", + outlineColor: "#0f0", + outlineWidth: 5, + }, + entity => { + this.setTurfGeometry(entity) + } + ) + break } }, setTurfGeometry(res) { - var that = this; - var res_val; + var that = this + var res_val switch (this.menuTopFrom.queryType) { case "point": //鐐� - var val = that.setCartesianToEightFour(res.position.getValue()); - res_val = val; - that.setTurfCircle([val.lng, val.lat], 10); - break; + var val = that.setCartesianToEightFour(res.position.getValue()) + res_val = val + that.setTurfCircle([val.lng, val.lat], 10) + break case "polyline": //绾� - var polyline = res.polyline.positions.getValue(); - res_val = polyline; - that.setTurfPolyOrLine(polyline, "polyline"); - break; + var polyline = res.polyline.positions.getValue() + res_val = polyline + that.setTurfPolyOrLine(polyline, "polyline") + break case "rectangle": //鐭╁舰 - let rectangle = res.rectangle.coordinates.getValue(); - res_val = rectangle; + let rectangle = res.rectangle.coordinates.getValue() + res_val = rectangle var result = new Cesium.Rectangle.subsample( rectangle, Cesium.Ellipsoid.WGS84, rectangle.height - ); - that.setTurfPolyOrLine(result, "rectangle"); + ) + that.setTurfPolyOrLine(result, "rectangle") - break; + break case "circle": //鍦� - var val = that.setCartesianToEightFour(res.position.getValue()); - res_val = res.position.getValue(); - var radius = res.ellipse.semiMajorAxis.getValue(); - that.setTurfCircle([val.lng, val.lat], radius); - break; + var val = that.setCartesianToEightFour(res.position.getValue()) + res_val = res.position.getValue() + var radius = res.ellipse.semiMajorAxis.getValue() + that.setTurfCircle([val.lng, val.lat], radius) + break case "polygon": //澶氳竟褰� - var polygon = res.polygon.hierarchy.getValue().positions; - res_val = polygon; - that.setTurfPolyOrLine(polygon, "polygon"); - break; + var polygon = res.polygon.hierarchy.getValue().positions + res_val = polygon + that.setTurfPolyOrLine(polygon, "polygon") + break } - this.flyEntity = res_val; + this.flyEntity = res_val }, setTurfCircle(position, radius) { var options = { steps: 10, units: "meters", properties: { foo: "bar" }, - }; - var circle = turf.circle(position, radius, options); + } + var circle = turf.circle(position, radius, options) - this.setJonToWKT(circle); + this.setJonToWKT(circle) }, setTurfPolyOrLine(res, type) { var restVal, - std = []; + std = [] for (var i in res) { - var line_data = this.setCartesianToEightFour(res[i]); - std.push([line_data.lng, line_data.lat]); + var line_data = this.setCartesianToEightFour(res[i]) + std.push([line_data.lng, line_data.lat]) } if (type == "polyline") { - var line = turf.lineString(std, { name: "polyline" }); - restVal = turf.buffer(line, 10, { units: "meters" }); + var line = turf.lineString(std, { name: "polyline" }) + restVal = turf.buffer(line, 10, { units: "meters" }) } else if (type == "rectangle") { - var ste = this.setCartesianToEightFour(res[0]); - std.push([ste.lng, ste.lat]); - restVal = turf.polygon([std], { name: "rectangle" }); + var ste = this.setCartesianToEightFour(res[0]) + std.push([ste.lng, ste.lat]) + restVal = turf.polygon([std], { name: "rectangle" }) } else if (type == "polygon") { - var ste = this.setCartesianToEightFour(res[0]); - std.push([ste.lng, ste.lat]); - restVal = turf.polygon([std], { name: "polygon" }); + var ste = this.setCartesianToEightFour(res[0]) + std.push([ste.lng, ste.lat]) + restVal = turf.polygon([std], { name: "polygon" }) } - this.setJonToWKT(restVal); + console.log("restVal", restVal) + this.setJonToWKT(restVal) }, setJonToWKT(res) { - var jsonToWkt = this.$wkt.convert(res.geometry); - this.$store.state.mapMenuShpFile = encr(jsonToWkt); + let fixedVal = this.fixToPositon(res) + var jsonToWkt = this.$wkt.convert(fixedVal.geometry) + this.$store.state.mapMenuShpFile = encr(jsonToWkt) - this.showMapMenuPop(); + this.showMapMenuPop() }, showMapMenuPop() { - this.$store.state.mapSpaceQueryLayer = this.treeChange; - this.$store.state.mapPopBoxFlag = "1"; - this.$refs && this.$refs.queryinfo && this.$refs.queryinfo.close(); + this.$store.state.mapSpaceQueryLayer = this.treeChange + this.$store.state.mapPopBoxFlag = "1" + this.$refs && this.$refs.queryinfo && this.$refs.queryinfo.close() this.$refs && this.$refs.queryinfo && this.$refs.queryinfo.open("绌洪棿鏌ヨ", null, { @@ -409,50 +479,181 @@ // window.Viewer.scene.primitives.removeAll() // } }, - }); + }) // this.$bus.$emit('changeMapMenuTop', 'true'); // sgworld.Creator.SimpleGraphic.clear(); //娓呯┖inputFile // var file = document.getElementById('getMenuTopFile'); // file.outerHTML = file.outerHTML; - this.$refs.pathClear.value = ""; + this.$refs.pathClear.value = "" }, clearQuery() { - this.$refs.pathClear.value = ""; - this.treeChange = []; - this.menuTopFrom.queryLayer = null; - this.menuTopFrom.queryType = "rectangle"; - this.$refs.tree.setCheckedKeys([]); + // 娓呮buffer + this.clearBufferEntities() + this.$refs.pathClear.value = "" + this.treeChange = [] + this.menuTopFrom.queryLayer = null + this.menuTopFrom.queryType = "rectangle" + this.$refs.tree.setCheckedKeys([]) //娓呯┖鏍囩粯 - sgworld.Creator.SimpleGraphic.edit(false, { editProp: false }); - sgworld.Creator.SimpleGraphic.clear(); + sgworld.Creator.SimpleGraphic.edit(false, { editProp: false }) + sgworld.Creator.SimpleGraphic.clear() if (this.$store.state.queryInfo.length != 0) { for (var i in this.$store.state.queryInfo) { - sgworld.Viewer.entities.remove(this.$store.state.queryInfo[i]); + sgworld.Viewer.entities.remove(this.$store.state.queryInfo[i]) } - this.$store.state.queryInfo = []; + this.$store.state.queryInfo = [] } //鍏抽棴绐楀彛 this.$refs && this.$refs.queryinfo && - this.$refs.queryinfo.close("queryinfo"); + this.$refs.queryinfo.close("queryinfo") if (this.$store.state.primitLayer != null) { - sgworld.Creator.DeleteObject(this.$store.state.primitLayer); - this.$store.state.primitLayer = null; + sgworld.Creator.DeleteObject(this.$store.state.primitLayer) + this.$store.state.primitLayer = null } }, setCartesianToEightFour(res) { - var std = {}; - let ellipsoid = Viewer.scene.globe.ellipsoid; - let cartographic = ellipsoid.cartesianToCartographic(res); - std.lat = Cesium.Math.toDegrees(cartographic.latitude); - std.lng = Cesium.Math.toDegrees(cartographic.longitude); - std.alt = cartographic.height; - return std; + var std = {} + let ellipsoid = Viewer.scene.globe.ellipsoid + let cartographic = ellipsoid.cartesianToCartographic(res) + std.lat = Cesium.Math.toDegrees(cartographic.latitude) + std.lng = Cesium.Math.toDegrees(cartographic.longitude) + std.alt = cartographic.height + return std + }, + handleBuffer() {}, + async getPipelineData() { + const data = await pipelines_selectSegNames() + if (data.code != 200) { + this.$message.error("鍒楄〃璋冪敤澶辫触") + } + var std = [] + var str = [] + var result = data.result + for (var i in result) { + if (std.indexOf(result[i].pipeName) == -1) { + std.push(result[i].pipeName) + str.push(result[i]) + } + } + this.featureLayer = data.result + this.pipelineOption = str + this.menuTopFrom.pipeline = this.pipelineOption[0].pipeName + this.changeSelect2(this.menuTopFrom.pipeline) + }, + async genBuffer() { + let { pipeline, segName } = this.menuTopFrom + let params = { name: pipeline } + // let params = { name: "瑗挎皵涓滆緭涓�绾�" } + + const res = await selectPipelines(params) + if (res.code == 200) { + const item = res.result.find(item => item.gid == this.analyGid) + console.log("selectPipelines", item) + const wkt = item.wkt + + if (item && wkt) { + const line = wktToGeoJSON(wkt) + // const line2 = wktToGeoJSON(wkt2) + + const position = line.coordinates + // const position2 = line2.coordinates + if (wkt.includes("MULTILINESTRING")) { + this.createBuffer(position.flat()) + } else { + this.createBuffer(position) + } + } + } + this.dialogFormVisible = false + let wkt = + "LINESTRING(114.82181424692999 33.697046488105,115.06065563205186 32.2808276171009,114.69405780892077 31.527280108790023)" + let wkt2 = + "MULTILINESTRING((115.35696516720873 33.51877172773311,117.76217256980829 32.44801812803422,118.69492094774364 32.31899881794112))" + + // console.log("line1", position) + // console.log("line2", position2) + }, + createBuffer(position) { + const buffRadius = this.menuTopFrom.bufferSize + var polylineF = turf.lineString(position) + var bufferd = turf.buffer(polylineF, buffRadius, { units: "meters" }) + var coordinates = bufferd.geometry.coordinates + // console.log("coordinates", coordinates) + + var points = coordinates[0] + var degreesArray = this.pointsToDegreesArray(points) + let array = Cesium.Cartesian3.fromDegreesArray(degreesArray) + const hierarchy = new Cesium.PolygonHierarchy(array) + const bufferPolygon = sgworld.Viewer.entities.add({ + polygon: { + hierarchy: hierarchy, + material: Cesium.Color.RED.withAlpha(0.5), + classificationType: Cesium.ClassificationType.BOTH, + }, + }) + this.bufferEntities.push(bufferPolygon) + let res = hierarchy.positions + let restVal, + std = [] + for (let i in res) { + let line_data = this.setCartesianToEightFour(res[i]) + std.push([line_data.lng, line_data.lat]) + } + restVal = turf.polygon([std], { name: "polygon" }) + + this.flyEntity = res + sgworld.Navigate.flyToObj(bufferPolygon) + console.log("bufferPolygon", res) + + console.log("bufferPolygon", restVal) + this.setJonToWKT(restVal) + }, + pointsToDegreesArray(points) { + let degreesArray = [] + points.forEach(item => { + degreesArray.push(item[0]) + degreesArray.push(item[1]) + }) + return degreesArray + }, + clearBufferEntities() { + this.bufferEntities.forEach(entity => { + sgworld.Viewer.entities.remove(entity) + }) + }, + changeSelect2(res) { + var value = this.featureLayer + let option = [] + for (var i in value) { + if (value[i].pipeName == res) { + option.push(value[i]) + } + } + this.segNameOption = option + this.menuTopFrom.segName = option[0].segName || '<绌�>' + this.analyGid = option[0].gid + }, + selectChangeGid(res) { + this.analyGid = res + }, + fixToPositon(restVal, digits = 6) { + restVal.geometry.coordinates.forEach(coord => { + if (Array.isArray(coord)) { + coord.forEach(item => { + if (item.length >= 2) { + item[0] = Number(item[0].toFixed(digits)) + item[1] = Number(item[1].toFixed(digits)) + } + }) + } + }) + return restVal }, }, -}; +} </script> <style lang="less" scoped> @@ -470,4 +671,39 @@ padding: 4px 20px; font-weight: 400; } +.buffer-dialog { + width: 300px; + height: 300px; + background-color: rgba(244, 248, 255, 0.85) !important; + .el-dialog__body { + .el-form-item { + margin-bottom: 20px !important; + } + } +} +</style> + +<style lang="less"> +.menuBox { + .buffer-dialog { + background-color: rgba(244, 248, 255, 0.85) !important; + border: 1px solid rgba(32, 160, 255, 0.6); + color: #202020; + .el-dialog__header { + padding: 10px 20px; + border-bottom: 1px solid rgba(32, 160, 255, 0.6); + + .el-dialog__headerbtn { + top: 10px; + font-size: 18px; + } + } + .el-form-item { + .el-input-number { + width: 202px; + } + } + + } +} </style> -- Gitblit v1.9.3