ie skaliert man ein Polygon so, dass es mit den Lat-Lon-Positionen beim Vergrößern / Verkleinern übereinstimm

Ich bin auf der Suche nach einem Cäsium-Guru, der mir dabei hilft, das zu finden, was ich brauche. Ich bin neu in Cäsium, arbeite aber mit den Tutorials und einem vorhandenen Code, den ich geerbt habe.

In meiner Caesium-App gebe ich meine Adresse ein und die Ansicht zoomt in meine Straße hinein. Yay! Dann zoome ich näher heran, um ein Polygon um mein Haus zu zeichnen. Der vorhandene Code macht das sehr gut. Jedochwenn ich verkleinere und dann wieder vergrößere, bleibt mein Polygon der Lat-Lon-Position meines Hauses nicht treu.

Enthält Caesium ein Hilfsprogramm zum Skalieren von Pixeln auf Lat-Lon-Koordinaten oder muss ich so etwas wie distanceToBoundingSphere (boundingSphere) verwenden und selbst berechnen? Ich möchte nur die x, y Koordinaten; Die Größe interessiert mich überhaupt nicht.

Ich habe mich in den Demos und Tutorials umgesehen und bisher nicht gefunden, wonach ich denke. Vielleicht habe ich etwas in der Nähe gefunden, aber ich weiß noch nicht genug, um zu wissen, ob ich es gefunden habe oder nicht. Hilfe

=========================== CODE ==================== ==============

Sammeln Sie die Positionen für das Polygon:

Ein einfacher Klick erfasst nur die Koordinaten für diesen Punkt und zeichnet eine Polylinie, während der Benutzer die Maus auf einen neuen Punkt zieht. Daher ein Bündel von Polylinien und eine Sammlung von Koordinaten für jeden Punkt.

    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);

A doubleClick verwendet dann die in der Funktion singleClick erfassten Koordinaten und ruft self.createAsset ('add', asset) auf, um das Polygon zu erstellen.

    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)

Erstellen des Polygons:

            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};

Es sieht so aus, als würden wir Terrain verwenden (glaube ich).

Welche Nummern sollten mich interessieren:

Wenn die Koordinaten gesammelt werden, ist nur das erste z keine Null:

Ich nehme diesen Wert und fülle die anderen z-Werte auf:

Nun, dass ich die z-Werte hinzugefügt habe, ist ein Fehler in der createAsset-Methode aufgetreten. Ich muss das Problem aufspüren, um die Ergebnisse zu sehen. Im Moment sieht es so aus:

WIRKLICH GROSS und die Konturen werden nicht entfernt.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage