Lat Long в положение XYZ в JS .. не работает - PullRequest
11 голосов
/ 24 января 2012
var phi   = (90-lat)*(Math.PI/180);
var theta = (lng+180)*(Math.PI/180);

marker_mesh.position.x = ((rad) * Math.sin(phi)*Math.cos(theta));
marker_mesh.position.z = ((rad) * Math.sin(phi)*Math.sin(theta));
marker_mesh.position.y = ((rad) * Math.cos(phi));

Учитывая вышеизложенное, мой маркер не переводится в правильное положение на трехмерной сфере ... мысли?

Это относительно близко (на том же континенте), но близко: \

, приведенное ниже ... оно должно отображаться в

lat : 41.7307619 long : -71.276195

мой глобус имеет boundRadius : 500px

текущий результат функции

x: -119.7801015013779

y: 332.8157297895266

z: 353.3927238766871

enter image description here

1 Ответ

18 голосов
/ 24 января 2012

Ваша формула немного отличается от геодезической до расчета ECEF. Обратитесь к формулам на Dr Math Широта и долгота, Преобразование GPS и Википедия Геодезические в / из координат ECEF . Это проецирует широту, долготу на сплюснутую сферу (т.е. реальная Земля не является совершенно сферической).

var cosLat = Math.cos(lat * Math.PI / 180.0);
var sinLat = Math.sin(lat * Math.PI / 180.0);
var cosLon = Math.cos(lon * Math.PI / 180.0);
var sinLon = Math.sin(lon * Math.PI / 180.0);
var rad = 6378137.0;
var f = 1.0 / 298.257224;
var C = 1.0 / Math.sqrt(cosLat * cosLat + (1 - f) * (1 - f) * sinLat * sinLat);
var S = (1.0 - f) * (1.0 - f) * C;
var h = 0.0;
marker_mesh.position.x = (rad * C + h) * cosLat * cosLon;
marker_mesh.position.y = (rad * C + h) * cosLat * sinLon;
marker_mesh.position.z = (rad * S + h) * sinLat;

В вашем сценарии, поскольку кажется, что вы стремитесь к идеальной сфере, вам нужно вместо этого поставить f = 0.0 и rad = 500.0. Это приведет к тому, что C и S станут 1,0, поэтому упрощенная версия формулы сокращается до:

var cosLat = Math.cos(lat * Math.PI / 180.0);
var sinLat = Math.sin(lat * Math.PI / 180.0);
var cosLon = Math.cos(lon * Math.PI / 180.0);
var sinLon = Math.sin(lon * Math.PI / 180.0);
var rad = 500.0;
marker_mesh.position.x = rad * cosLat * cosLon;
marker_mesh.position.y = rad * cosLat * sinLon;
marker_mesh.position.z = rad * sinLat;

N.B. Я не проверял синтаксис примеров кода Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...