Как показать многоугольник в 3d с цезием и олцезием

У меня есть источник geosjon:

"geometry": {
            "type": "Polygon",
            "coordinates": [
                [
                    [
                        12.671038571165692,
                        55.64399279138965,
                        85.8672
                    ],
                    [
                        12.685366241531373,
                        55.63688636891217,
                        85.8672
                    ],
...

Я пробовал следующее

 var ol3d = new olcs.OLCesium({ map: this.map}); // map is the ol.Map instance
            var scene = ol3d.getCesiumScene();
            ol3d.setEnabled(true);
            let datasources = ol3d.getDataSources();
            console.log(datasources);
            let f = new ol.format.GeoJSON({ defaultDataProjection: "EPSG:4326", featureProjection: this.map.getView().getProjection() });
            for (let feature of this._limModel.visualizationSource.getFeatures()) {
                feature.set("altitudeMode","relativeToGround");
            }
            let geojson = JSON.parse(f.writeFeatures(this._limModel.visualizationSource.getFeatures()));

            var dataSource = Cesium.GeoJsonDataSource.load(geojson, { clampToGround:false}).then(
                function (dataSource) {
                    var p = dataSource.entities.values;
                    for (var i = 0; i < p.length; i++) {
                        p[i].polygon.perPositionHeight = true;  

                    }
                    datasources.add(dataSource);


                }
            );

но и синхронизированный векторный слой, который olcesium преобразует из моей карты ol, и источник данных geojson рисуются на эллипсе/земле, а не на высоте координаты z в источнике geojson, показанном выше.

Что я должен сделать, чтобы показать мой многоугольник как поверхность в 3D.


person Poul K. Sørensen    schedule 14.10.2017    source источник


Ответы (1)


Мне удалось сделать прототип, который работал со следующим кодом.

            var dataSource = new Cesium.CustomDataSource('myData');

            function addPolygon(coordinates) {
                let flatten = [].concat.apply([], coordinates);
                console.log([flatten.length, flatten]);
                var orangePolygon = dataSource.entities.add({
                    name: 'Orange polygon with per-position heights and outline',
                    polygon: {
                        hierarchy: Cesium.Cartesian3.fromDegreesArrayHeights(
                            flatten),
                        extrudedHeight: 0,
                        perPositionHeight: true,
                        material: Cesium.Color.ORANGE.withAlpha(0.5),
                        outline: true,
                        outlineColor: Cesium.Color.BLACK
                    }
                });
            }
            for (let feature of this._limModel.visualizationSource.getFeatures()) {
                let coordinates : Array < Array<number>>;
                let geom = feature.getGeometry();
                if (geom instanceof ol.geom.Polygon) {

                    addPolygon(geom.getCoordinates()[0].map(c => ol.proj.toLonLat(c)));

                } else if (geom instanceof ol.geom.MultiPolygon) {


                    for (let poly of geom.getCoordinates()) {
                        addPolygon(poly[0].map(c => ol.proj.toLonLat(c)));
                    }
                }


            }
            datasources.add(dataSource);

но было бы неплохо, если бы это работало только в ol-cesium

person Poul K. Sørensen    schedule 14.10.2017