Как преобразовать x, y, z в долготу, широту, высоту в цезии?

Используя библиотеку three.js, я собрал конструкцию (растение). Этот дизайн содержит так много меньших моделей, которые имеют ссылку на положение в (x, y, z) от начала координат (0,0,0). Прикрепил пример скриншота по следующей ссылке

Справочное изображение собранной модели

Теперь я хочу загрузить в Cesium индивидуальную модель со своей позицией. Когда я пытаюсь загрузить прямое преобразование положения (x, y, z) в (север, восток, вверх), результат не такой, как ожидалось. Все модели разбросаны.

Функциональность, которую я пытаюсь достичь, заключается в том, что, основываясь на некоторой точке начала (долгота, широта, высота), я должен расположить модель в цезии со ссылкой (x, y, z) относительно координат цезия (долгота, широта, высота )

E.g.

  • Географические координаты начала координат (ori_lon, ori_lat, ori_alt) =› (-106.690647, 36.806761, 0)

  • Координаты модели (m_x, m_y, m_z) =› (-150,9, 126,26, 217,7)

  • Ожидание координат для цезия: (ori_lon + m_x, ori_lat + m_y, ori_alt + m_z)

или некоторый алгоритм для достижения этого.

В следующей статье я попытался преобразовать (x, y, z) в (long, lat, alt) с некоторым происхождением (long, lat, alt), но безуспешно: (

(x, y, z) координаты ›› геокоординаты

Совет/помощь в решении проблемы.


person Premkumar Jayaseelan    schedule 06.02.2015    source источник
comment
Чтобы не запутаться: gis.stackexchange.com/questions/334002/cesium- проекционная система Чтобы еще больше запутаться: groups.google. com/forum/#!topic/cesium-dev/a7QjKQ1Dt1M   -  person Andrew    schedule 07.05.2020


Ответы (2)


Cartesian3 в лонглат, если кому понадобится

function toDegrees(cartesian3Pos) {
  let pos = Cesium.Cartographic.fromCartesian(cartesian3Pos)
  return [pos.longitude / Math.PI * 180, pos.latitude / Math.PI * 180]
}

console.log(toDegrees({
  x: -1681498.1800000381,
  y: 4576516.394998055,
  z: 4098410.649998016
})) // [110.17428132202518, 40.23966923800238]

person Josh Lin    schedule 30.09.2020

EDIT: поскольку поисковые системы, похоже, отправляют сюда людей в поисках декартово-картографических преобразований, я дам ответ на этот вопрос здесь.

Функция Cartographic.fromCartesian — самый простой способ выполнить это преобразование. . Обратите внимание, что он вернет Cartographic, выраженное в радианах, а не в градусах. Высота возвращается в метрах.

var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
console.log(
    'lon ' + Cesium.Math.toDegrees(cartographic.longitude) + ', ' +
    'lat ' + Cesium.Math.toDegrees(cartographic.latitude) + ', ' +
    'alt ' + cartographic.height);

Исходный ответ: если вы читаете подробности исходного вопроса здесь, автор вопроса пытался сложить координаты вместе в пространстве LLA, что неверно. Мой первоначальный ответ здесь объясняет, как преобразовать их в декартово пространство и добавить туда результаты.

Это можно сделать с помощью Cesium.Cartesian3.fromDegrees.

var position = Cesium.Cartesian3.fromDegrees(-106.690647, 36.806761, 0);
var offset = new Cesium.Cartesian3(-150.9, 126.26, 217.7);
Cesium.Cartesian3.add(position, offset, position);

В зависимости от того, в какой системе координат находится offset, может потребоваться вращение для применения к глобальному декартовому пространству. Например, если это Восток-Север-Вверх, вы должны использовать соответствующую функцию для создания и применения этого преобразования.

person emackey    schedule 29.10.2015
comment
Ваш код преобразует LLA в XYZ, вопросы задают XYZ в LLA. - person ekerner; 19.04.2017
comment
Да, первоначальный вопросник пытался пойти неправильным путем, преобразовывая смещение x/y/z в LLA с целью смещения модели в пространстве LLA, что неверно. Мой ответ переворачивает это, преобразовывая положение LLA в Cartesian3 и добавляя туда декартово смещение, что необходимо для его случая. Однако цезий содержит оба преобразования, и, если хотите, я могу отредактировать свой ответ, включив в него подробности другого способа. - person emackey; 19.04.2017