C++ libproj, поменять координатыC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 C++ libproj, поменять координаты

Сообщение Anonymous »

У меня есть программа на C++, работающая в Linux уже много лет. Он использует некоторое преобразование координат, для этой цели мы используем libproj (версия 6.3.1).
Интересно, что один клиент предоставил входной параметр epsg:2180 тогда все взорвалось.
Похоже, что для нескольких преобразований epsg вывод меняется местами. Вот команды, которые я использовал, чтобы это доказать:
Сначала получите строку проекции:

Код: Выделить всё

$ projinfo epsg:2180

PROJ.4 string:
+proj=tmerc +lat_0=0 +lon_0=19 +k=0.9993 +x_0=500000 +y_0=-5300000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs +type=crs
Если я использую его с образцом координат (формат LatLon), как показано ниже, я сначала получаю результат как восточное. (В основном это команда cs2cs epsg:4326 +to -f %.4f)

Код: Выделить всё

echo "55.12578267 16.77291767" | cs2cs epsg:4326 +to +proj=tmerc +lat_0=0 +lon_0=19 +k=0.9993 +x_0=500000 +y_0=-5300000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs +type=crs -f %.4f
Результат, который все ожидают:



358037,8085
809219,1725
0,0000



Однако, если я использую простую команду:

Код: Выделить всё

echo "55.12578267 16.77291767" | cs2cs epsg:4326 epsg:2180 -f %.4f
Затем результат меняется (клиент недоволен):



809219.1725
358037.8085
0.0000



Проблема на этом не заканчивается: в C++ я использую ту же библиотеку, та же проблема. Вопрос в том, как я могу убедиться, что Easting будет первым параметром?
Я уже пробовал использовать proj_normalize_for_visualization, поскольку в документации предполагается, что это будет делать замена координат, но на самом деле это не меняет результат.

Код: Выделить всё

#include 
#include 
#include
int main(int argc, char** argv)
{
PJ_CONTEXT* projContext_m = proj_context_create();

// hardcode epsg (in reality it is user defined)
int epsg_p = 2180;

char _buff[100];
snprintf(_buff, sizeof (_buff), "EPSG:%d", epsg_p);
PJ* projEPSG_m = proj_create_crs_to_crs(projContext_m,
"EPSG:4326",
_buff, NULL);

if (projEPSG_m != nullptr)
{
proj_normalize_for_visualization(projContext_m, projEPSG_m);
}

// fake input (in reality it is user defined)
PJ_COORD input_p;
input_p.xy.x = 55.12578267;
input_p.xy.y = 16.77291767;

PJ_COORD result = proj_trans(projEPSG_m, PJ_FWD, input_p);    // input_p is the coordinate we need to transform

// we assume `result.x` is the Easting
printf("Easting: %f, Northing %f", result.xy.x, result.xy.y);

return 0;
}

Выход:

Восточное положение: 809219.172518, северное 358037.808510
Что мне следует сделать, чтобы заставить result.x всегда быть восточным?

Подробнее здесь: https://stackoverflow.com/questions/791 ... oordinates
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»