maxiaoxiao před 8 měsíci
rodič
revize
acae459f2d

+ 6 - 2
src/components/Combinations/toolBar/toolBar.vue

@@ -50,6 +50,9 @@
         <i class="el-icon-map-location"></i>
       </li> -->
       <!-- </ul> -->
+      <li class="sm-btn sm-tool-btn" title="三维分析" @click="choose(13)">
+        <i class="el-icon-receiving"></i>
+      </li>
       <div style="display: none" class="sm-tool-btn" @click="toggleVisibility" :class="{ 'sm-tool-btn-only': !show }">
         <span class="iconfont" :class="!show
           ? 'iconiEarth-R8-xiugai_shouqi'
@@ -78,6 +81,7 @@
     <wind-particle></wind-particle>
     <placename-location style="width: 400px; height: 400px; z-index: 999999"></placename-location>
     <click-query style="width: 400px; height: 700px; z-index: 999999"></click-query>
+    <modelStretch></modelStretch>
   </div>
 </template>
 
@@ -86,9 +90,9 @@ import clickQuery from "../../Query/clickQuery/clickQuery.vue";
 import { GetXzqhTree, GetXzqhGeom } from "@/api/map";
 import Bookmark from "../../Bookmark/Bookmark.vue";
 import * as cockpit from "@/common/js/cockpit.js";
-
+import modelStretch from "@/views/modelStretch/index.vue";
 export default {
-  components: { clickQuery, Bookmark },
+  components: { clickQuery, Bookmark, modelStretch },
   name: "ToolBar",
   props: {},
   data() {

+ 2 - 0
src/components/mapView/range.vue

@@ -116,6 +116,7 @@ export default {
           this.resetDataSources();
           this.fileDataID = res.data.id;
           this.model.xzfw = res.data.id;
+          this.model.geom = res.data.geom;
           this.addPolygon(parse(res.data.geom));
           // let geoms = res.data.geom
           //   .substring(
@@ -278,6 +279,7 @@ export default {
               this.fileDataID = res.data.id;
               this.model.xzmj = (res.data.area * 0.0015).toFixed(2);
               this.model.xzfw = res.data.id;
+              this.model.geom = res.data.geom;
               this.$message({
                 message: "绘制成功!",
                 type: "success",

+ 415 - 0
src/views/modelStretch/index.vue

@@ -0,0 +1,415 @@
+<template>
+  <div
+    class="sm-panel sm-function-module-content ghzc modelStretch"
+    v-if="modelStretchShow"
+    v-drag
+  >
+    <div class="sm-panel-header">
+      <span>模型拉伸</span>
+      <span class="closeBtn" @click="toggleVisibility">&times;</span>
+    </div>
+    <div class="xz_box">
+      <el-form :model="form" ref="form" label-width="80px" :rules="rules">
+        <el-form-item label="平面范围:" prop="xzmj">
+          <range type="hgxfx" :keys="['hx', 'sc']" class="range" ref="range" />
+        </el-form-item>
+        <el-row :gutter="10">
+          <el-col :span="14" style="text-align: center">
+            <!-- 楼体高度:
+            <el-input-number
+              size="mini"
+              step="1"
+              v-model="form.BuildingHeight"
+              @change="XYChange"
+            ></el-input-number> -->
+            <el-form-item label="模型高度:" prop="BuildingHeight">
+              <el-input
+                class="inputwidth"
+                v-model.number="form.BuildingHeight"
+                size="mini"
+                type="number"
+              ></el-input>
+              米
+            </el-form-item>
+          </el-col>
+          <el-col :span="10" style="text-align: center">
+            <el-form-item label="层高:" prop="FLOORH" label-width="45px">
+              <el-input
+                class="inputwidth"
+                v-model.number="form.FLOORH"
+                size="mini"
+                type="number"
+              ></el-input>
+              米
+            </el-form-item>
+            <!-- 层高:
+            <el-input-number
+              size="mini"
+              step="0.1"
+              v-model="form.FLOORH"
+              @change="XYChange"
+            ></el-input-number> -->
+          </el-col>
+        </el-row>
+        <el-form-item label="模型名称:" prop="mxmc">
+          <el-input
+            v-model="form.mxmc"
+            size="mini"
+            placeholder="请输入模型名称"
+          ></el-input>
+        </el-form-item>
+
+        <!-- <div class="SaveCenter">
+              <el-button size="mini" type="primary" @click="onSubmit"
+                >开始调整</el-button
+              >
+              <el-button size="mini" @click="removeEntities">清除</el-button>
+            </div> -->
+      </el-form>
+      <div class="Btns">
+        <el-button size="mini" @click="clear">清 除</el-button>
+        <el-button type="primary" size="mini" @click="submit">确 定</el-button>
+      </div>
+    </div>
+  </div>
+</template>
+  
+  <script>
+import range from "@/components/mapview/range.vue"; ///mapview/range
+import {} from "@/api/map";
+import parse from "wellknown";
+let polygonids = [];
+let dataSources = {};
+export default {
+  name: "modelStretch",
+  components: {
+    range,
+  },
+  data() {
+    return { form: { BuildingHeight: 50 } };
+  },
+  created() {},
+  mounted() {},
+  computed: {
+    modelStretchShow() {
+      return store.state.toolBar[13];
+    },
+  },
+  methods: {
+    toggleVisibility() {
+      store.setToolBarAction(13);
+      this.clear();
+    },
+    pullUp(item, height) {
+      let upid = "up" + item.id;
+      if (!dataSources[upid])
+        this.loadGeoJSON(parse(item.geom), "#000000", upid, height, item.dkbm);
+      else {
+        let entities = dataSources[upid].entities.values;
+        entities.forEach((entity, ei) => {
+          if (height && entity.polygon) {
+            entity.polygon.extrudedHeight = height;
+            let center = this.getCentroid(parse(item.geom), ei);
+            entity.position = Cesium.Cartesian3.fromDegrees(
+              center[0],
+              center[1],
+              height
+            );
+          }
+        });
+        viewer.flyTo(dataSources[upid], {
+          offset: new Cesium.HeadingPitchRange(0, -0.8),
+        });
+      }
+    },
+    pullClear(item) {
+      let upid = "up" + item.id;
+      if (dataSources[upid]) {
+        viewer.dataSources.remove(dataSources[upid]);
+        dataSources[upid] = null;
+      }
+    },
+    // 加载GeoJSON数据
+    loadGeoJSON(geojson, yanse, id, height, name) {
+      let _this = this;
+      let fcolor =
+        id && id != "all"
+          ? Cesium.Color.fromCssColorString(yanse)
+          : Cesium.Color.WHITE;
+      const dataSource = new Cesium.GeoJsonDataSource();
+      dataSource
+        .load(geojson, {
+          clampToGround: true,
+          stroke: Cesium.Color.fromCssColorString(yanse),
+          fill: fcolor.withAlpha(0.4), //注意:颜色必须大写,即不能为blue
+          strokeWidth: 5,
+          // markerSymbol: "", //点图钉的默认符号
+        })
+        .then((data) => {
+          viewer.dataSources.add(data);
+          let entities = data.entities.values;
+          // let addlabel = false;
+          if (!geojson.type.includes("Polygon") || height) {
+            entities.forEach((entity, ei) => {
+              if (entity.billboard) {
+                entity.billboard = undefined;
+                entity.point = {
+                  pixelsize: 20,
+                  color: Cesium.Color.fromCssColorString(yanse),
+                };
+              }
+              if (height && entity.polygon) {
+                entity.polygon.extrudedHeight = height;
+                entity.polygon.material =
+                  Cesium.Color.fromCssColorString("#cdcdcd");
+                entity.polygon.outlineColor = Cesium.Color.BLACK;
+                entity.polygon.outlineWidth = 1.0;
+                // if (!addlabel) {
+                let center = this.getCentroid(geojson, ei);
+
+                var polycenter = Cesium.Cartesian3.fromDegrees(
+                  center[0],
+                  center[1],
+                  height
+                );
+                entity.position = polycenter;
+                entity.label = {
+                  font: "bolder 18px sans-serif",
+                  style: Cesium.LabelStyle.FILL_AND_OUTLINE,
+                  text: name, //图标名称
+                  fillColor: Cesium.Color.fromCssColorString("#fff000"),
+                  pixelOffset: new Cesium.Cartesian2(0, -20),
+                  zIndex: 3,
+                };
+                // addlabel = true;
+                // }
+              }
+            });
+          }
+          var pitch = height ? -0.8 : -45; // Cesium.Math.toRadians(-45.0);-0.7853981633974483
+          let range = height ? 3000 : 5000;
+          viewer.flyTo(data, {
+            offset: new Cesium.HeadingPitchRange(0, pitch),
+          });
+          // viewer.zoomTo(data);
+          if (id) {
+            dataSources[id] = data;
+          }
+          if (id == "all") _this.isshowAll = true;
+        });
+    },
+    clear() {
+      this.$refs.range.reset();
+      // this.pullClear();
+      this.removeEntities();
+    },
+    submit() {
+      var _temp = this.$refs.range.getRange();
+      _temp.geojson = parse(_temp.geom);
+      // this.pullUp(_temp, this.form.BuildingHeight);
+      this.onSubmit(_temp.geojson);
+    },
+    onSubmit(geojson) {
+      let that = this;
+      that.removeEntities();
+      // if (!that.loutiInfo) {
+      //   that.$message({
+      //     message: "未查询到模型数据,请重试加载模型",
+      //     type: "warning",
+      //   });
+      //   return;
+      // }
+      // const element = that.loutiInfo;
+      // //基础高度(地形高度)加入地形后可删除
+      let jcgd = 0;
+      // //地块编码
+      // let bm = element.data.find((c) => c.label == "LANDNO");
+      // if (bm && bm.value) {
+      //   //获取模型信息
+      //   let queryBySQLParameters = {
+      //     getFeatureMode: "SQL",
+      //     datasetNames: [that.info.Minfo.datasourcename + ":项目范围"],
+      //     queryParameter: {
+      //       attributeFilter: " DKBM = '" + bm.value + "'",
+      //     },
+      //     hasGeometry: true,
+      //   };
+      //   let e = await mapQuery(
+      //     that.info.Minfo.dataurl + "/featureResults.json?returnContent=true",
+      //     queryBySQLParameters
+      //   );
+
+      //   debugger;
+      //   if (e && e.totalCount > 0) {
+      //     e.features.forEach((feature) => {
+      //       feature.fieldNames.forEach((fieldName, i) => {
+      //         if (
+      //           fieldName == "BASEH" &&
+      //           Number(feature.fieldValues[i]) > jcgd
+      //         ) {
+      //           jcgd = Number(feature.fieldValues[i]);
+      //         }
+      //       });
+      //     });
+      //   }
+      // } else {
+      //   that.$message({
+      //     message: "未找到模型基础高度,默认高程为0",
+      //     type: "warning",
+      //   });
+      // }
+
+      //顶部高度,底部高度
+      let maxH = jcgd,
+        minH = jcgd;
+      for (
+        let FLOORindex = 1;
+        FLOORindex <= Math.ceil(that.form.BuildingHeight / that.form.FLOORH);
+        FLOORindex++
+      ) {
+        // debugger;
+        maxH += that.form.FLOORH;
+        minH = maxH - that.form.FLOORH;
+        console.log("maxH:" + maxH + "----minH:" + minH);
+        let ps = [];
+        // for (let index = 0; index < element.geometry.points.length; index++) {
+        //   const point = element.geometry.points[index];
+        //   ps.push(point.x);
+        //   ps.push(point.y);
+        //   // ps.push(minH);
+        // }
+        geojson.coordinates[0].forEach((gom) => {
+          ps.push(gom[0]);
+          ps.push(gom[1]);
+        });
+        // let id = uuidv4();
+
+        // 定义多边形的顶点(经纬度)
+        var polygonHierarchy = new Cesium.PolygonHierarchy(
+          Cesium.Cartesian3.fromDegreesArray(ps)
+        );
+
+        // 创建带有高度的多边形
+        var extrudedPolygon = new Cesium.GeometryInstance({
+          geometry: new Cesium.PolygonGeometry({
+            polygonHierarchy: polygonHierarchy,
+            height: minH, // 多边形底面的高度
+            extrudedHeight: maxH, // 拉伸到的高度
+          }),
+          attributes: {
+            color: Cesium.ColorGeometryInstanceAttribute.fromColor(
+              Cesium.Color.CHARTREUSE.withAlpha(0.1)
+            ),
+          },
+        });
+
+        // 添加到场景中
+        let Primitive = new Cesium.Primitive({
+          geometryInstances: [extrudedPolygon],
+          appearance: new Cesium.PerInstanceColorAppearance({
+            flat: true,
+          }),
+          shadows: Cesium.ShadowMode.ENABLED, // 开启阴影
+        });
+        viewer.scene.primitives.add(Primitive);
+        polygonids.push(Primitive);
+
+        // 创建多边形的边界线
+
+        let pss = [];
+        // for (let index = 0; index < element.geometry.points.length; index++) {
+        //   const point = element.geometry.points[index];
+        //   pss.push(point.x);
+        //   pss.push(point.y);
+        //   pss.push(maxH);
+        // }
+        geojson.coordinates[0].forEach((gom) => {
+          pss.push(gom[0]);
+          pss.push(gom[1]);
+          pss.push(maxH);
+        });
+        var boundaryPolyline = new Cesium.GeometryInstance({
+          geometry: new Cesium.PolylineGeometry({
+            positions: Cesium.Cartesian3.fromDegreesArrayHeights(pss), // 注意这里需要处理高度为0的情况,因为边界线通常在地表
+            width: 1, // 边界线的宽度
+          }),
+          attributes: {
+            color: Cesium.ColorGeometryInstanceAttribute.fromColor(
+              Cesium.Color.CHARTREUSE.withAlpha(0.8)
+            ),
+          },
+        });
+        let boundaryPolylinePrimitive = new Cesium.Primitive({
+          geometryInstances: [boundaryPolyline],
+          appearance: new Cesium.PolylineColorAppearance({
+            edgeWidth: 1,
+            // vertexFormat: Cesium.PolylineVertexFormat.POSITION_AND_COLOR,
+            vertexFormat: Cesium.PolylineColorAppearance.VERTEX_FORMAT,
+          }),
+        });
+        viewer.scene.primitives.add(boundaryPolylinePrimitive);
+        polygonids.push(boundaryPolylinePrimitive);
+        // viewer.entities.add({
+        //   id: id,
+        //   polygon: {
+        //     hierarchy: Cesium.Cartesian3.fromDegreesArrayHeights(ps),
+        //     extrudedHeight: Number(maxH),
+        //     perPositionHeight: true,
+        //     material: Cesium.Color.CHARTREUSE.withAlpha(0.1),
+        //     outline: true,
+        //     outlineColor: Cesium.Color.MEDIUMSPRINGGREEN,
+        //     outlineWidth: 1.0,
+        //     shadows: Cesium.ShadowMode.ENABLED,
+        //   },
+        // });
+      }
+    },
+    removeEntities() {
+      for (let index = 0; index < polygonids.length; index++) {
+        const element = polygonids[index];
+        viewer.scene.primitives.remove(element);
+        // viewer.entities.removeById(element);
+      }
+      polygonids = [];
+    },
+  },
+  watch: { modelStretchShow(newVal) {} },
+};
+</script>
+  <style scoped lang="scss">
+.sm-panel {
+  max-width: 500px;
+}
+.modelStretch {
+  width: 400px;
+  height: 600px;
+  .range {
+    flex: 1;
+    width: 80%;
+  }
+  .xz_box {
+    padding: 0;
+  }
+  .inputwidth {
+    width: calc(100% - 20px);
+  }
+
+  .Btns {
+    width: 100%;
+    // display: -webkit-box;
+    // display: -ms-flexbox;
+    display: flex;
+    padding: 20px 30px;
+    // -webkit-box-pack: justify;
+    // -ms-flex-pack: justify;
+    justify-content: space-between;
+    // text-align: center;
+    // position: absolute;
+    // bottom: 0px;
+  }
+}
+</style>
+<style lang="scss">
+@import "../complianceAnalysis//ghzc.scss";
+</style>
+