Здравствуйте.
Раньше использовали собственные библиотеки для работы с координатами,
теперь хотим всё работу с координатами проводить только через MAPAPI.
Разбираю пример с конвертированием координат по EPSG коду.
Функция из примера конвертирующая в СК-42:
Функция из примера конвертирующая по коду EPSG:
Точка на общеземном эллипсоиде WGS-84: B: 60.0, L: 29.9999
Результат работы программы:
Обратите внимание на плоские прямоугольные координаты - долготу.
На общеземном эллипсоиде WGS84 долгота 29.9999 попадает в 5-ую зону, но
при переводе в СК-42 она уже в 6-ой,
а так как номер зоны в функции convertToSK42 вычисляется по долготе на
эллипсоиде в WGS84, то плоские прямоугольные координаты вычисляются
относительно центрального меридиана 5-ой зоны.
Это корректно? Или правильнее сначала перевести в геодезические СК-42, а
уже потом вычислять зону по долготе?
И ещё вопрос.
В функцию convertByEPSG отдаётся код EPSG с учётом зоны, я правильно
понимаю что при вызове функции mapGeoWGS84ToUserGeo на зону не смотрят и
координаты просто переводятся в геодезические на указанном эллипсоиде. А
учитывается зона только при переводе в плоские прямоугольные ?
А ещё можете написать код epsg для ПЗ-90? (если он существует).
Коды для других требуемых систем координат (ПЗ90.02, ПЗ90.11) я нашёл в примере.
Спасибо.
Раньше использовали собственные библиотеки для работы с координатами,
теперь хотим всё работу с координатами проводить только через MAPAPI.
Разбираю пример с конвертированием координат по EPSG коду.
Функция из примера конвертирующая в СК-42:
Код |
---|
int convertToSK42( double B, double L ) { int zoneNumber = mapGetZoneByMeridian( L ); int epsg = base_epsg_sk42 + zoneNumber; return convertByEPSG( B, L, epsg ); } |
Функция из примера конвертирующая по коду EPSG:
Код |
---|
int convertByEPSG( double B, double L, int epsg ) { HANDLE userSystemHandle = mapCreateUserSystemParametersByEpsg( epsg ); if ( userSystemHandle == 0 ) { printf( "Невозможно создать пользовательскую систему координат с кодом EPSG = %d\n", epsg ); return 0; } mapGeoWGS84ToUserGeo( userSystemHandle, &B, &L ); printf( "Выполнен пересчет в СК с кодом EPSG = %d : ", epsg ); printDegree( B, L ); printRadian( B, L ); if ( mapGetUserSystemType(userSystemHandle) == 1 ) { mapUserGeoToUserPlane( userSystemHandle, &B, &L ); printf( "Выполнен пересчет в прямоугольные координаты : " ); printMeters( B, L ); } else { printf( "Выбранная система координат не поддерживает пересчет в метры на плоскости. EPSG = %d\n", epsg ); } mapDeleteUserSystemParameters( userSystemHandle ); return 1; } |
Точка на общеземном эллипсоиде WGS-84: B: 60.0, L: 29.9999
Результат работы программы:
Код |
---|
Исходная точка в общеземном эллипсоиде WGS-84: B = +60°00'0,00000" , L = +29°59'59,64000" B = 1,047197551 , L = 0,523597030 Выполнен пересчет в СК с кодом EPSG = 28405 : B = +60°00'0,11449" , L = +30°00'7,78658" B = 1,047198106 , L = 0,523636526 Выполнен пересчет в прямоугольные координаты : X = 6657993,983756073 , Y = 5667484,989601249 |
Обратите внимание на плоские прямоугольные координаты - долготу.
На общеземном эллипсоиде WGS84 долгота 29.9999 попадает в 5-ую зону, но
при переводе в СК-42 она уже в 6-ой,
а так как номер зоны в функции convertToSK42 вычисляется по долготе на
эллипсоиде в WGS84, то плоские прямоугольные координаты вычисляются
относительно центрального меридиана 5-ой зоны.
Это корректно? Или правильнее сначала перевести в геодезические СК-42, а
уже потом вычислять зону по долготе?
И ещё вопрос.
В функцию convertByEPSG отдаётся код EPSG с учётом зоны, я правильно
понимаю что при вызове функции mapGeoWGS84ToUserGeo на зону не смотрят и
координаты просто переводятся в геодезические на указанном эллипсоиде. А
учитывается зона только при переводе в плоские прямоугольные ?
А ещё можете написать код epsg для ПЗ-90? (если он существует).
Коды для других требуемых систем координат (ПЗ90.02, ПЗ90.11) я нашёл в примере.
Спасибо.