2016-11-15 9 views
1

Я много дней обходил эту проблему, но не смог найти объяснения тому, что я делаю неправильно. Надеюсь, ты можешь протянуть мне руку.Преобразование из UTM в LongLat с использованием Proj4 в C++

У меня есть набор UTM координаты (epsg:23030), что я хочу, чтобы преобразовать в LongLat Координаты (epsg:4326) с помощью библиотеки Proj4 для C++ (libproj-dev). Мой код выглядит следующим образом:

#include "proj_api.h 
#include <geos/geom/Coordinate.h> 

geos::geom::Coordinate utm2longlat(double x, double y){ 

    // Initialize LONGLAT projection with epsg:4326 
    if (!(pj_longlat = pj_init_plus("+init=epsg:4326"))){ 
     qDebug() << "pj_init_plus error: longlat"; 
    } 

    // Initialize UTM projection with epsg:23030 
    if (! (pj_utm = pj_init_plus("+init=epsg:23030"))){ 
     qDebug() << "pj_init_plus error: utm"; 
    } 

    // Transform UTM projection into LONGLAT projection 
    int p = pj_transform(pj_utm, pj_longlat, 1, 1, &x, &y, NULL); 

    // Check for errors 
    qDebug() << "Error message" << pj_strerrno(p) ; 

    // Return values as coordinate 
    return geos::geom::Coordinate(x, y) 
} 

Мой вызов функции utm2longlat:

... 
// UTM coordinates 
double x = 585363.1; 
double y = 4796767.1; 
geos::geom::Coordinate coord = utm2longlat(x, y); 

qDebug() << coord.x << coord.y; 

/* Result is -0.0340087 0.756025 <-- WRONG */ 

В моем примере:

  • Я знаю, что UTM координаты (585363.1 4796767.1) относятся к LongLat координаты (-1.94725 43.3189).
  • Однако при вызове функция возвращает набор неправильных координат: (-0.0340087 0.756025).

мне было интересно, есть ли у меня неверные настроек при инициализации проекции, так что я решил проверить привязки Proj4 Python (pyproj), просто чтобы проверить, получил ли я те же неправильные координаты ... и как ни странно, я получил хорошее из них.

from pyproj import Proj, transform 

// Initialize UTM projection 
proj_utm = Proj(init='epsg:23030') 
// Initialize LongLat projection 
proj_lonlat = Proj(init='epsg:4326') 

x_utm, y_utm = 585363.1, 4796767.1 

x_longlat, y_longlat = transform(proj_utm, proj_lonlat, x_utm, y_utm) 

// Print results 
print "original", x_utm, y_utm  
print "utm2lonlat", x_longlat, y_longlat 

/* Result is -1.94725 43.3189 <-- CORRECT */ 

Из того, что я понимаю pyproj представляет собой набор Cython привязок над Proj4 библиотеки, поэтому я использую то же самое ядро ​​в обоих языках программирования.

У вас есть какие-либо сведения о том, что может быть неправильным? Мне не хватает какого-либо преобразования в функции C++?

Заранее спасибо.

ответ

1

Результат кажется мне правильным, но он возвращается в радианах вместо градусов. Преобразуйте результат в градусы и снова проверьте.

+0

Это было, спасибо, очень! Если бы я мог, я бы ответил на ваш ответ, но у меня пока нет репутации. Я полагаю, что привязки Python делают это неявно. Надеюсь, это может помочь другим. –