2016-11-15 452 views
1

我一直在解決這個問題好幾天,但一直沒有找到解釋我做錯了什麼。我希望你能幫我一把。使用C++中的Proj4從UTM轉換爲LongLat

我有一套UTM座標(epsg:23030),我想通過使用C++ (libproj-dev)的proj4庫將其轉換爲LongLat座標(epsg:4326)。我的代碼如下:

#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綁定會隱式執行轉換。希望這可以幫助別人。 –