В функции mapPlaneUTMToPlaneUTMByZone есть ошибка. В новой версии она исправлена. Спасибо за сообщение!
Есть общий алгоритм для пересчета любых координат. Для его работы в папке с приложением должны быть файлы epsg.csg, epsg.csp, epsg.csu.
Стандартный алгоритм имеет следующий вид для данной задачи:
Код |
---|
// Подготовить систему координат для применения
HANDLE hsrc = mapCreateUserSystemParametersByEpsg(32600 + 31); // UTM zone 31
HANDLE htarget = mapCreateUserSystemParametersByEpsg(32600 + 30); // UTM zone 30
// Выполняем пересчет
double x = 3959421.35;
double y = 251329.557;
// От UTM зона 31 к WGS84
mapUserPlaneToGeoWGS84(hsrc, &x, &y);
// От WGS84 к UTM зона 30
mapGeoWGS84ToUserPlane(htarget, &x, &y);
sprintf(message, "X = %.5lf Y = %.5lf", x, y);
::MessageBox(0, message, "User CRS", MB_OK | MB_TASKMODAL | MB_ICONINFORMATION);
// Освобождаем ресурсы
mapDeleteUserSystemParameters(hsrc);
mapDeleteUserSystemParameters(htarget); |
Если нужно работать с системой координат, для которой нет стандартного кода EPSG, то можно задать параметры через структуры MAPREGISTEREX, ELLIPSOIDPARAM, DATUMPARAM.
Можно ввести пользовательский код EPSG через файл crslist.xml, который должен быть в папке с приложением.
Добавить новую систему в файл crslist.xml можно через диалог Паспорт карты или в текстовом редакторе.
Старый алгоритм (он построен на том же принципе - переход к WGS84 и от нее к новой системе) :
Код |
---|
// Старая функция возвращает точно такой же результат (после исправления)
x = 3959421.35;
y = 251329.557;
mapPlaneUTMToPlaneUTMByZone(31, 30, &x, &y);
char message[200];
sprintf(message, "X = %.5lf Y = %.5lf", x, y);
::MessageBox(0, message, "UTM to UTM", MB_OK | MB_TASKMODAL | MB_ICONINFORMATION); |