Как конвертировать Координаты в LCC, используя PROJ.4

Я написал приложение дополненной реальности, которое будет размещать объекты поверх печатных карт улиц. Я знаю координаты GPS каждого угла каждой карты и могу рассчитать относительное значение, где разместить любой объект на этой карте. Хотя это хорошо работало с форматом атласа, сейчас я интегрирую большие складные карты (Франция), где отклонение позиций стало неприемлемым.

У меня нет никакого опыта в проектировании координат, поэтому я нашел proj.4, который казался идеальным и был действительно счастлив найти интеграцию с unity3d. Но что бы я ни пытался, я получаю неправильные значения обратно (вероятно, моя вина, потому что я не понимаю, что я здесь делаю)

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

"+proj=lcc +lat_1 =49 +lat_2=46 +lat_0=47.5 +lon_0=13.33333333333333 +x_0=400000 +y_0=400000 +ellps = bessel +datum=hermannskogel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +units=m +no_defs";

Я бы предположил, что мне нужно проецировать из сферического латлона или вебмеркатора, которые кажутся очень похожими (по крайней мере, результаты) на lcc

Webmercator:

"+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext  +no_defs";

LatLon:

"+proj=latlong +a=6370 +b=6370 +towgs84=0,0,0 +no_defs"

Поэтому я инициализирую проекции, а затем преобразую список позиций: WebMercator.Transform(mainMapProj, xValues, yValues);

В качестве набора тестовых данных я использую GPS-координаты моей карты южной Франции:

  testMap.TopLeft_lat = 46.985;
  testMap.TopLeft_lon = -3.702;
  testMap.TopRight_lat = 47.3162;
  testMap.TopRight_lon = 9.1447;
  testMap.BottomRight_lat = 42.41;
  testMap.BottomRight_lon = 9.1667;
  testMap.BottomLeft_lat = 41.3022;
  testMap.BottomLeft_lon = -2.291;

Как и координата случайного города chereay

cheray.lat = 45.97316;
cheray.lon = -1.352547;

Координаты карты

Правильно спроецированные координаты должны примерно привести к появлению прямоугольника (печатная страница), а город должен быть расположен относительно приблизительно (0,1748,0,9044) от нижнего левого угла прямоугольника.

Ценности, которые я получаю, далеки. Я не знаю, что я делаю не так и как продолжать. Заранее спасибо за любой намек.

1 ответ

Меркатор не круговой. Вы хотите конвертировать из конической формы, которая является круглой, используя центр карты в качестве контрольной точки. Земля имеет 25000 миль в окружности и 8000 миль в диаметре. Поэтому, если вы посмотрите на Землю с Луны и увидите Землю плоской, вы увидите круги диаметром 8000 миль, которые на самом деле находятся на экваторе, полукругом в 12 500 миль. Таким образом, кривизна земли составляет отношение 12500/8000 = 1,5. На самом деле это пи * г /2р = пи /2 = 1,57.

Долгота GPS изменяется от -324000000(запад) до +324000000 (восток), а широта - от 0 (экватор) до +/-162000000.0 (север / южный полюс). Вы заметите, что максимальная долгота (180 градусов) в два раза больше максимальной широты (90 градусов). Таким образом, масштаб GPS одинаков как для широты, так и для долготы.

Поэтому я думаю, что единственное, что вам нужно сделать, это умножить расстояние на коэффициент масштабирования 1,57.

Другие вопросы по тегам