Получить центр на карте Cesium

Мне нужно знать, что является текущим центром Карты Цезия.

Я пытался использовать viewer.camera.position, но он всегда дает одно и то же значение z (x: 16921255.101297915, y: 5578093.302269477, z: 12756274), и я не уверен в значениях x и y. Они в метрах?

Большое спасибо!

РЕДАКТИРОВАТЬ: Решение

Со всей помощью, которую я получил (спасибо!) Я собрал это вместе:

getPosition(){
    if (viewer.scene.mode == 3) {
        var windowPosition = new Cesium.Cartesian2(viewer.container.clientWidth / 2, viewer.container.clientHeight / 2);
        var pickRay = viewer.scene.camera.getPickRay(windowPosition);
        var pickPosition = viewer.scene.globe.pick(pickRay, viewer.scene);
        var pickPositionCartographic = viewer.scene.globe.ellipsoid.cartesianToCartographic(pickPosition);
        console.log(pickPositionCartographic.longitude * (180 / Math.PI));
        console.log(pickPositionCartographic.latitude * (180 / Math.PI));
    } else if (viewer.scene.mode == 2) {
        var camPos = viewer.camera.positionCartographic;
        console.log(camPos.longitude * (180 / Math.PI));
        console.log(camPos.latitude * (180 / Math.PI));
    }
};

Эта функция дает координаты долготы/широты в градусах.


person Pri Santos    schedule 26.10.2015    source источник
comment
Да, декартовы значения в метрах. Ось X указывает от центра Земли к широте 0, долготе 0, высоте 0. Ось Z указывает от центра к северному полюсу. Ось Y образует правую систему координат с двумя другими. Вы должны использовать Ellipsoid.cartesianToCartographic (показано в ответе ниже) для выполнения преобразования.   -  person emackey    schedule 26.10.2015


Ответы (1)


viewer.camera.position указывает положение камеры в координатах X, Y, Z в метрах относительно центра Земли.

В зависимости от того, какой режим сцены вы используете, подход отличается:

СЦЕНА3D:

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

 function getMapCenter() {            
        var windowPosition = new Cesium.Cartesian2(viewer.container.clientWidth / 2, viewer.container.clientHeight / 2);
        var pickRay = viewer.scene.camera.getPickRay(windowPosition);
        var pickPosition = viewer.scene.globe.pick(pickRay, viewer.scene);
        var pickPositionCartographic = viewer.scene.globe.ellipsoid.cartesianToCartographic(pickPosition);
        console.log(pickPositionCartographic.longitude * (180/Math.PI));
        console.log(pickPositionCartographic.latitude * (180/Math.PI));
}

На основе этой темы.

Также попробуйте проверить, смотрит ли камера на карту, а не на небо.

СЦЕНА 2D:

Это простой 2D-вид с камерой, направленной прямо вниз.

Из документов:

2D режим. Карта просматривается сверху вниз с ортогональной проекцией.

var camPos = viewer.camera.positionCartographic; 
console.log(camPos.longitude * (180/Math.PI)); 
console.log(camPos.latitude * (180/Math.PI));

Остается вариант 2.5D или COLUMBUS_VIEW.

person Tomislav Muic    schedule 26.10.2015
comment
Хороший ответ. В случае, когда камера не смотрит на карту/глобус, вы должны проверить, соответствует ли (pickPosition === undefined), прежде чем использовать значение в cartesianToCartographic. - person emackey; 26.10.2015
comment
Я использую 2D-карту и использую предложенную функцию «getMapCenter()», но всегда получаю «pickPosition === undefined». Я не уверен, что я мог сделать, чтобы получить правильное положение, я не думаю, что камера не смотрит на карту... Она на экране. - person Pri Santos; 26.10.2015
comment
В простом случае, если вы не вращаете камеру и всегда смотрите на карту вниз, вы можете использовать это: var camPos = viewer.camera.positionCartographic; console.log(camPos.longitude * (180/Math.PI)); console.log(camPos.latitude * (180/Math.PI)); - person Tomislav Muic; 26.10.2015