Cesio cómo escalar un polígono para que coincida con las posiciones de Lat-Lon al acercar / alejar

Estoy buscando un Cesium Guru para que me ayude a encontrar lo que necesito. Soy nuevo en Cesium pero he estado trabajando con los tutoriales y algunos códigos existentes que heredé.

En mi aplicación Cesium, ingreso mi dirección y la vista se acerca a mi calle. ¡Hurra! Luego me acerco para poder dibujar un polígono alrededor de mi casa. El código existente hace esto muy bien. sin embargocuando alejo y luego vuelvo a acercar, mi polígono no se mantiene fiel a la posición Lat-Lon de mi casa.

¿El cesio contiene una utilidad para escalar píxeles a coordenadas lat-lon ¿o necesito usar algo como distanceToBoundingSphere (boundingSphere) y calcularlo yo mismo? Solo quiero las coordenadas x, y; No me importa la altura en absoluto.

He estado buscando en las demostraciones y tutoriales y hasta ahora no he encontrado lo que creo que estoy buscando. Tal vez he encontrado algo cercano, pero aún no sé lo suficiente como para saber si lo he encontrado o no. ¡Ayuda!

============================ CÓDIGO ===================== =============

Recolectando las posiciones para el polígono:

Un solo clic solo captura las coordenadas para ese punto y dibuja una polilínea a medida que el usuario arrastra el mouse a un nuevo punto. Por lo tanto, un montón de polilíneas y una colección de coordenadas para cada punto.

    positionHandler.setInputAction(function (click) {
        cartesian = scene.camera.pickEllipsoid(click.position, ellipsoid);
        if (cartesian) {
            var setCartographic = ellipsoid.cartesianToCartographic(cartesian);
            asset.latlonalt.push(
                Cesium.Math.toDegrees(setCartographic.latitude).toFixed(15),
                Cesium.Math.toDegrees(setCartographic.longitude).toFixed(15),
                Cesium.Math.toDegrees(setCartographic.height).toFixed(15)
            );
            lla.push(Cesium.Math.toDegrees(setCartographic.longitude), Cesium.Math.toDegrees(setCartographic.latitude));
            if (lla.length >= 4) {
                self.loggingMessage((lla.length / 2) + ' Points Added');
            }
            Cesium.sampleTerrain(terrainProvider, 11, [cartographic])
                .then(function (updatedPositions) {
                    asset.latlonalt[2] = updatedPositions[0].height;
                    stage = 1;
                });
        }
    }, Cesium.ScreenSpaceEventType.LEFT_CLICK);

DoubleClick toma las coordenadas capturadas en la función singleClick y llama a self.createAsset ('add', asset) para crear el polígono.

    positionHandler.setInputAction(function (doubleClick){
        if (asset.shape == 'Polygon') {
            var len = asset.latlonalt.length;
            if(len > 9) {
                asset.rad = (len / 3);
                console.log("Creating Asset");
                self.loggingMessage("Creating Asset");
                socket.emit('newElement', asset.cType, asset);
                self.createAsset('add', asset);
                viewer.entities.remove(entity);
                viewer.entities.remove(newCircle);
                viewer.entities.remove(newPolygon);
                viewer.entities.remove(newOutline);
                positionHandler = positionHandler && positionHandler.destroy();
            }else{
                console.log('3+ Positions Required');
                loggingMessage('3+ Positions Required.');
            }
        }
    }, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK)

Creando el polígono:

            var newPolygon = viewer.entities.add({
                name : asset.id,
                polygon : {
                    hierarchy : Cesium.Cartesian3.fromDegreesArray(vertices),
                    material : rgba[0],
                    outline : true,
                    outlineColor : rgba[1]
                }
            });
            var newLabel = viewer.entities.add({
                position: Cesium.Cartesian3.fromDegrees(asset.latlonalt[1], asset.latlonalt[0], 1000),
                name: asset.id,
                label: {
                    text: asset.name,
                    font : '16px Helvetica'
                }
            });
            var newPoint = viewer.entities.add({
                position: Cesium.Cartesian3.fromDegrees(asset.latlonalt[1], asset.latlonalt[0], 0),
                name: asset.id,
                point : {
                pixelSize : 5,
                    color : Cesium.Color.RED,
                    outlineColor : Cesium.Color.RED,
                    outlineWidth : 2
                }
            });
            self.currentGeometry[asset.id] = {shape: newPolygon, label: newLabel, point: newPoint};

Parece que estamos usando Terrain (creo).

En qué números debería estar interesado:

Cuando se recopilan las coordenadas, solo la primera z no es ceros:

Tomé ese valor y rellené los otros valores z:

Ahora que he agregado los valores z, algo está fallando en el método createAsset. Necesito rastrear ese problema para ver los resultados. En este momento, se ve así:

REALMENTE GRANDE y los contornos no se eliminan.

Respuestas a la pregunta(1)

Su respuesta a la pregunta