Подтвердить что ты не робот

Цезий как "драпировать" многоугольник или линию на поверхности рельефа

Итак, я использую цезий, и я хочу добавить полигон или линию, чтобы представить границу свойства на поверхности местности.

Мой многоугольник отлично работает на плоской поверхности/поверхности эллипсоида, но, к сожалению, многоугольник не может автоматически задрапироваться поверх поверхности, когда показан ландшафтный слой.

Я уверен, что на самом деле у меня нет значений z/height, поэтому я использую метод sampleTerrain.js для интерполяции значений высоты на основе ландшафт. Эта часть работает отлично, я получаю свои значения высоты. Но что тогда?

Я попытался создать объект многоугольника с моими загруженными по высоте позициями, но безрезультатно - он просто игнорирует значения высоты. Когда я читаю документы, я могу увидеть любую ссылку на принимаемые значения высоты - все массивы "позиции" являются двумерными?

Единственная ссылка на рассматриваемые значения высоты находится в PolygonOutlineGeometry, которая имеет многообещающее свойство вида perPositionHeight.

Это, по сути, то, что я хочу - я не хочу устанавливать высоту всего поля, я хочу, чтобы каждое значение высоты точки использовалось.

Вот одна из моих неудачных попыток:

Entity/Polygon:

var entity = viewer.entities.add({
    polygon : {
        hierarchy : cartesianPositions, //array of positions with z values
        outline : true,
        outlineColor : Cesium.Color.RED,
        outlineWidth : 9,
        material : Cesium.Color.BLUE.withAlpha(0.0),
   }
});


Нижняя строка: Мне просто нужен объект многоугольника или полилинии, который прекрасно сидит на поверхности местности.

EDIT:

Используя пример Orange Polygon в комментариях к принятому ответу в сочетании с sampleTerrain.js, я мы смогли смоделировать "драпировку" многоугольника на рельеф, со списком позиций, у которых не было значений z, здесь грубый пример:

var positions = []; // xy position array    

var cesiumTerrainProvider = new Cesium.CesiumTerrainProvider({
    url : '//assets.agi.com/stk-terrain/world'
});
viewer.terrainProvider = cesiumTerrainProvider;

// go off and sample the terrain layer to get interpolated z values for each position..
var promise = Cesium.sampleTerrain(cesiumTerrainProvider, 11, positions);
Cesium.when(promise, function(updatedPositions) {

    var cartesianPositions = Cesium.Ellipsoid.WGS84.cartographicArrayToCartesianArray(updatedPositions);

        var entity = viewer.entities.add({
            polygon : {
                  hierarchy : cartesianPositions,
                  outline : true,
                  outlineColor : Cesium.Color.RED,
                  outlineWidth : 9,
                  perPositionHeight: true,
                  material : Cesium.Color.BLUE.withAlpha(0.0),
            }
        });

    viewer.flyTo(entity);   

});
4b9b3361

Ответ 1

Начиная с версии 1.13, цезий теперь поддерживает GroundPrimitives. Они будут драпировать по рельефу.

Он выглядит так: http://cesiumjs.org/images/2015/09-01/groundPrimitives.gif

В этом примере Цезий дает:

var rectangleInstance = new Cesium.GeometryInstance({
  geometry : new Cesium.RectangleGeometry({
    rectangle : Cesium.Rectangle.fromDegrees(-140.0, 30.0, -100.0, 40.0)
  }),
  id : 'rectangle',
  attributes : {
    color : new Cesium.ColorGeometryInstanceAttribute(0.0, 1.0, 1.0, 0.5)
  }
});
scene.primitives.add(new Cesium.GroundPrimitive({
  geometryInstance : rectangleInstance
}));

Ответ 2

Цезий еще не поддерживает векторные данные о местности. Он активно работает, и большинство функций должно появиться в цезие 1.10, которое выйдет 1 июня. Все, что не делает этот выпуск, должно быть в 1.11 1 июля.

В частности, для полигонов вы можете выполнить запрос на подачу GitHub: https://github.com/AnalyticalGraphicsInc/cesium/pull/2618

Для рекламных щитов и надписей: https://github.com/AnalyticalGraphicsInc/cesium/pull/2653

Полилины еще не запущены, но будут выполнены, как только будут завершены два выше.