123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416 |
- <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">×</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, FLOORH: 5 } };
- },
- 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;
- text-align: left;
- 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>
-
|