2015-04-28 3 views
14

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

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

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

Я попытался создать объект многоугольника с моими загруженными по высоте позициями, но безрезультатно - он просто игнорирует значения высоты. When I read the docs, я действительно вижу любую ссылку на значения высоты, принимаемые внутрь - все массивы «позиции» являются двумерными?

Единственная ссылка на рассматриваемые значения высоты находится в 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 example в комментариях принятого ответа в сочетании с 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); 

}); 
+0

почему у вас 'альфа (0,0)', если вы хотите увидеть полигон? в соответствии с [Цезий spec] (http://cesiumjs.org/Cesium/Build/Documentation/Color.html) 0.0 is _zero intensity_ –

+0

Я намеренно скрыл поверхность многоугольника, так как меня больше интересует граница, который * * *. Это не имеет отношения к моему вопросу. – danwild

+0

Я использую тот же код, но некоторые из сегментов пути все еще находятся под землей. Кто-нибудь знает причину? – sabrina

ответ

8

Начиная с версии 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 
})); 
+0

Можно ли использовать GroundPrimitives также для дорожек? Это мой код: целевая переменная = viewer.entities.add ({ позиций: образец, путь: { разрешение: 60, материал: Cesium.Color.BLUE, ширина: 4, trailTime: 360, leadTime: 0 } }); где sampe - объект Cesium.SampledPositionProperty, поэтому путь распространяется со временем. Как я могу проложить путь по рельефу? – sabrina

+0

Вам нужно будет использовать примитивный тип и добавить его в коллекцию scene.primitives. Похоже, вы создаете сущность. – Zac

+0

@emackey Есть ли способ достичь этого с помощью CZML? – Slaiyer

5

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

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

Для щитах и ​​этикетки, проверьте: https://github.com/AnalyticalGraphicsInc/cesium/pull/2653

полилинии не были начаты, но еще будет, как только выше двух.

+0

Хорошо, никакой официальной поддержки но, но тот факт, что sampleTerrain.js существует, говорит мне, что должен быть способ сделать это, конечно? Почему кто-то будет использовать цезий над открытым слоем, если цезий не сможет обрабатывать точки в трехмерном пространстве? – danwild

+0

Приношу свои извинения, я неправильно понял ваш вопрос. Чтобы использовать значения высоты с позиций, для свойства perPositionHeight установлено значение true. Оранжевый полигон в этом примере делает то, что вы хотите: http://cesiumjs.org/Cesium/Apps/Sandcastle/index.html?src=Polygon.html&label=Geometries –

+0

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

Смежные вопросы