[3D ГИС визуализация] Реализация умного города на основе Vue+Cesium+Supermap (3)

GIS
[3D ГИС визуализация] Реализация умного города на основе Vue+Cesium+Supermap (3)
                                    FBI  WARNING!
                                    五一假期已结束
               不知道xdm都去哪里玩了?给点游玩的建议,我十一假期参考一下啊哈哈……

В прошлой статье мы сначала говорили о нескольких основных элементах карты, включая точки, линии и поверхности, а затем узнали об основных системах координат, используемых в двухмерных и трехмерных картах, и методах их преобразования. Наконец, мы вкратце рассказали о Cesium Сущности Viewer и Camera соответствуют окну и камере. Далее, давайте приступим к практике и узнаем, как добавлять точечные, линейные и полигональные объекты на нашу землю. Если в статье есть какая-либо ошибка, пожалуйста, укажите на нее в области комментариев, смиренно попросите совета и вовремя исправьте ее!

Сущность


В Cesium существует несколько способов добавления объектов, например, использование Entity для добавления и Primitive для добавления. Последний ближе к нижнему слою движка рендеринга, поэтому я не буду его сегодня представлять. Используя Entity в Cesium, можно добавить множество фигур: точки, линии, поверхности, трубы, цилиндры и т. д. на официальном сайте Cesium.SandcastleВ нем есть соответствующие примеры, вы можете сами проверить, если вам это нужно.

точкаBillboard

В Цезии точка черезBillboardСпособ представления, как следует из названия, представляет собой рекламный щит.BillboardУказанное изображение, обращенное к экрану, будет сгенерировано в указанных координатах. Без лишних слов давайте посмотрим на код:

viewer.entities.add({
    position: Cesium.Cartesian3.fromDegrees(121.54035, 38.92146,100),
    billboard: {
      image: require("@/views/images/blueCamera.png"), // default: undefined
      show: true, // default
      pixelOffset: new Cesium.Cartesian2(0, -50), // default: (0, 0)
      eyeOffset: new Cesium.Cartesian3(0.0, 0.0, 0.0), // default
      horizontalOrigin: Cesium.HorizontalOrigin.CENTER, // default
      verticalOrigin: Cesium.VerticalOrigin.BOTTOM, // default: CENTER
      scale: 2.0, // default: 1.0
      color: Cesium.Color.LIME, // default: WHITE
      rotation: Cesium.Math.PI_OVER_FOUR, // default: 0.0
      alignedAxis: Cesium.Cartesian3.ZERO, // default
      width: 100, // default: undefined
      height: 25, // default: undefined
    },
});

Я вижу это здесь.ViewerВнизentitiesследующий методadd, сущность добавляется вviewerВнутри.

Я присвоил ему небольшое значение высоты во время преобразования координат, чтобы сделать его более полным. Эффект следующий

1.gif

НитьPolyline

такой жеBillboardТочно так же линия проходит черезviewer.add()Метод добавлен. Затем сначала поместите код:

viewer.entities.add({
        // name:entity.name,
    polyline: {
      positions: Cesium.Cartesian3.fromDegreesArray([121.534575,38.926131, 121.537579,38.92543,121.541784,38.924578,121.543973,38.924144,121.545947,38.923944]),
      width: 2,
      material: Cesium.Color.DARKORANGE.withAlpha(0.7),
      // clampToGround: true,
      // show: true,
    },
});

positionsНабор декартовых таблиц необходим для рисования линий,widthширина линии,materialэто материал линии (это ключ к нашей генерации динамических линий),clamToGroundЭто выбор того, будет ли линия рендериться на земле.На базовой карте с ландшафтом режим заземления будет отрисовываться против колебаний рельефа, а абсолютная высота будет проходить через рельеф.showЭто отображается.

Базовый эффект (чтобы эффект хорошо отображался, было изменено темное базовое изображение)

2.gif

В это время вы, возможно, сказали, что эта линия слишком уродлива.Я думаю, что линии других людей все светятся (вы говорите об Ультрачеловеке? Действительно ли Ультрачеловек в этом мире?). Не волнуйтесь, я дам идею для достижения люминесценции.Конечно, идея не только здесь, и заинтересованные друзья могут поискать больше в Интернете. Код включен!

// 在上边添加过的线基础上我们再添加一条动效线
viewer.entities.add({
        // name:entity.name,
    polyline: {
      positions: Cesium.Cartesian3.fromDegreesArray([
        121.534575,
        38.926131,
        121.537579,
        38.92543,
        121.541784,
        38.924578,
        121.543973,
        38.924144,
        121.545947,
        38.923944,
      ]),
      width: 4, // 线的宽度,像素为单位
      material: new Cesium.PolylineTrailMaterialProperty({
        // 尾迹线材质
        color: Cesium.Color.GOLD,
        trailLength: 0.4,
        period: 3.0,
      }),
    },
});

Эффект следующий

3.gif

Эффект линии выглядит хорошо, но если это дорожная сеть внизу, эффект на самом деле хороший.

4.gif

Я считаю, что умные друзья нашли это. Эй, вы добавляете точку. Строка использует метод добавления, и переданная структура параметров в основномpositionи соответствующий объект. Да, на самом деле мы можем инкапсулировать его на основе такой структуры.EntityКласс объекта и последующие второго редакционных сущностей ничьей, не описаны здесь.

лапшаPolygon

Картинка выше на самом деле показывает нам элемент поверхности, вы наверняка подумаете, что я говорю о зеленой области, рисунок мелкий! На самом деле эти здания — лица, но мы растягиваем их на определенную высоту, чтобы сформировать так называемые лица. Добавляется так же, как точки и линии, поэтому не буду вдаваться в подробности, просто перейду к коду.

viewer.entities.add({
    polygon: {
      hierarchy: Cesium.Cartesian3.fromDegreesArray([
        121.539208,
        38.924962,
        121.539176,
        38.924737,
        121.540195,
        38.924486,
        121.540281,
        38.924737,
      ]),
      extrudedHeight: 50,
      material: Cesium.Color.WHITE,
      // closeTop: false,
      // closeBottom: false,
    },
});

Смотрите эффект:

5.gif

Это всего лишь способ генерировать здания, а также одно из многих применений поверхности.Я отвечаю только за бросание кирпичей, а все - нефрит.

Нажмите, чтобы получить лицо, рекламный щит

В проекте мы не можем просто представить перед глазами эти точки, линии и поверхности.Наши элементы должны нести соответствующие данные или атрибуты.Нам нужно получать данные, атрибуты или пользовательские операции, кликая на соответствующие элементы.

давайте пройдемсяScreenSpaceEventHandlerзарегистрировать глобальныйhandlerЗатем используйтеsetInputActionрегистрLEFT_CLICKСобытие щелчка левой кнопкой мыши, в его обратном вызове, мы можем получить объект щелчка мыши. затем пройтиviewer.scene.pickметод(场景拾取,返回在场景中该窗口位置对应的第一个图元对象,如果该位置没有任何物体则返回undefined), передать координаты и получить объект позиции, в которой щелкнули.


handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction((e) => {
    var pick = viewer.scene.pick(e.position);
    console.log(e , pick);
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

6.gif

Посмотрим, что напечатано

image.png

eДля экрана двумерная координатная группа нашей мыши на экране,pick— возвращаемый примитивный объект, гдеidсущность, которую мы подобрали.

полный код

<template>
  <div class="container">
    <div id="cesiumContainer"></div>
  </div>
</template>

<script>
var viewer, camera, handler;
export default {
  data() {
    return {};
  },
  mounted() {
    this.init();
  },
  methods: {
    init() {
      viewer = new Cesium.Viewer("cesiumContainer", {});
      var layer = viewer.imageryLayers.addImageryProvider(
        new Cesium.UrlTemplateImageryProvider({
          url:
            "https://map.geoq.cn/arcgis/rest/services/ChinaOnlineStreetPurplishBlue/MapServer/tile/{z}/{y}/{x}",
        })
      );
      //   初始化场景位置
      viewer.scene.camera.flyTo({
        // 初始化相机经纬度
        destination: new Cesium.Cartesian3.fromDegrees(
          121.54035,
          38.92146,
          2000
        ),
        orientation: {
          heading: Cesium.Math.toRadians(0.0),
          pitch: Cesium.Math.toRadians(-25.0), //从上往下看为-90
          roll: 0,
        },
      });

      handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
      handler.setInputAction((e) => {
        var pick = viewer.scene.pick(e.position);
        console.log(e, pick);
      }, Cesium.ScreenSpaceEventType.LEFT_CLICK);

      this.addBillboard();
      this.addPolyline();
      this.addPolygon();
    },
    addBillboard() {
      viewer.entities.add({
        position: Cesium.Cartesian3.fromDegrees(121.54035, 38.92146, 50),
        billboard: {
          image: require("./images/blueCamera.png"), // default: undefined
          // show: true, // default
          // pixelOffset: new Cesium.Cartesian2(0, -50), // default: (0, 0)
          // eyeOffset: new Cesium.Cartesian3(0.0, 0.0, 0.0), // default
          // horizontalOrigin: Cesium.HorizontalOrigin.CENTER, // default
          // verticalOrigin: Cesium.VerticalOrigin.BOTTOM, // default: CENTER
          // scale: 2.0, // default: 1.0
          // color: Cesium.Color.LIME, // default: WHITE
          // rotation: Cesium.Math.PI_OVER_FOUR, // default: 0.0
          // alignedAxis: Cesium.Cartesian3.ZERO, // default
          // width: 100, // default: undefined
          // height: 25, // default: undefined
        },
      });
    },
    addPolyline() {
      viewer.entities.add({
        polyline: {
          positions: Cesium.Cartesian3.fromDegreesArray([
            121.534575,
            38.926131,
            121.537579,
            38.92543,
            121.541784,
            38.924578,
            121.543973,
            38.924144,
            121.545947,
            38.923944,
          ]),
          width: 4,
          material: Cesium.Color.DARKORANGE.withAlpha(0.3),
          // clampToGround: true,
          // show: true,
        },
      });
      viewer.entities.add({
        // name:entity.name,
        polyline: {
          positions: Cesium.Cartesian3.fromDegreesArray([
            121.534575,
            38.926131,
            121.537579,
            38.92543,
            121.541784,
            38.924578,
            121.543973,
            38.924144,
            121.545947,
            38.923944,
          ]),
          width: 4, // 线的宽度,像素为单位
          material: new Cesium.PolylineTrailMaterialProperty({
            // 尾迹线材质
            color: Cesium.Color.GOLD,
            trailLength: 0.4,
            period: 3.0,
          }),
          // clampToGround: true,
          // show: true,
        },
      });
    },
    addPolygon() {
      viewer.entities.add({
        polygon: {
          hierarchy: Cesium.Cartesian3.fromDegreesArray([
            121.539208,
            38.924962,
            121.539176,
            38.924737,
            121.540195,
            38.924486,
            121.540281,
            38.924737,
          ]),
          extrudedHeight: 50,
          material: Cesium.Color.WHITESMOKE,
          // closeTop: false,
          // closeBottom: false,
        },
      });
    },
  },
};
</script>

<style lang="scss" scoped>
</style>

наконец

В этих статьях были представлены самые основные операции, связанные с цезием, и мои кирпичи также были выброшены.Далее вам нужно вырезать нефрит самостоятельно. В дальнейшем я также разберу клики по точкам и граням, и классы, которые просто инкапсулируют несколько общих функций. Все могут общаться и прогрессировать вместе.Ведь я тоже начинающий Cesium ^-^.

приложение

[3D ГИС-визуализация] Реализация умного города на основе Vue+Cesium+Supermap (1)

[3D ГИС-визуализация] Реализация умного города на основе Vue+Cesium+Supermap (2)

[На основе] трехмерной ГИС-визуализации Vue + Cesium + Supermap умный город (четыре)