2015-02-09 3 views
2

Я пытаюсь перепроверить координату lat/lon в системе WGS84 на UTM один в системе координат SIRGAS 2000.Повторное проектирование координат с использованием библиотеки GDAL

Использование GDAL, я начал с изменением известной UTM координат в широта/долгота аналог в той же системе координат (29 N), просто чтобы проверить, что я написал правильный код (я опускаю проверки ошибок здесь):

OGRSpatialReference monUtm; 
monUtm.SetWellKnownGeogCS("WGS84"); 
monUtm.SetUTM(29, true); 

OGRSpatialReference monGeo; 
monGeo.SetWellKnownGeogCS("WGS84"); 

OGRCoordinateTransformation* coordTrans = OGRCreateCoordinateTransformation(&monUtm, &monGeo); 

double x = 621921.3413490148; 
double y = 4794536.070196861; 

int reprojected = coordTrans->Transform(1, &x, &y); 
// If OK, print the coords. 

delete coordTrans; 
coordTrans = OGRCreateCoordinateTransformation(&monGeo, &monUtm); 
reprojected = coordTrans->Transform(1, &x, &y); 

// If OK, Print the coords. 
delete coordTrans; 

координаты 621921.3413490148, 4794536.070196861correspond to the Moncelos region in northern Galicia. Трансформация вперед-и-обратно, кажется, работает права: широта/долгота coordiantes являются правильными, и при проецировании обратно в UTM, я получаю то же как оригинал:

UTM:   621921.34135 , 4794536.0702 
Lat/lon:  43.293779579 , -7.4970160261 
Back to UTM: 621921.34135 , 4794536.0702 

Теперь перепроецирование из WGS84 lat/long в SIRGAS 2000 UTM:

// Rodovia dos Tamoios, Brazil: 
// - UTM   -> 23 S 
// - WGS 84  -> EPSG:32723 
// - SIRGAS 2000 -> EPSG:31983 

OGRSpatialReference wgs; 
wgs.SetWellKnownGeogCS("WGS84"); 

OGRSpatialReference sirgas; 
sirgas.importFromEPSG(31983); 

coordTrans = OGRCreateCoordinateTransformation(&wgs, &sirgas); 

double x = -23.57014667; 
double y = -45.49159617; 

reprojected = coordTrans->Transform(1, &x, &y); 
// If OK, print results 
delete coordTrans; 

coordTrans = OGRCreateCoordinateTransformation(&sirgas, &wgs); 
reprojected = coordTrans->Transform(1, &x, &y); 
// If OK, print results. 

это не дает те же результаты:

WGS84 Lat/Lon input:  -23.57014667 , -45.49159617 
SIRGAS 2000 UTM output: 2173024.0216 , 4734004.2131 
Back to WGS84 Lat/Lon: -23.570633824 , -45.491627598 

вы можете видеть, что оригинальные WGS84 lat/lon и back-to_WGS84 lat/lon не являются точно такими же, в отличие от первого тестового примера. Кроме того, UTM x-coord имеет 7 цифр (я думал, что он ограничен 6 (?)).

In Google Maps, мы можем видеть, что есть разница в 27 метров между двумя точками (оригинальная точка представлена ​​кругом. Моей «назад-перепроецируется» точка представлена ​​кинжала).

И, наконец, вопрос: правильно ли я делаю репрокцию? Если да, то почему разница между повторениями во втором тестовом случае составляет 27 метров?

ответ

3

Проблема в том, что вам нужно поменять порядок оси, чтобы использовать декартовое пространство X/Y или Lon/Lat, а не «Lat/Lon».

Установка должна работать.

double x = -45.49159617; // Lon 
double y = -23.57014667; // Lat 

разницы вы видели от вашего обращения туда-обратно был от проектирования вне границ для зоны UTM вследствие выгружено порядка оси.

+0

Спасибо! Это сработало! Поскольку репроцессия была «успешной», я не понимал, что порядок координат ошибочен. –