使用proj4将latlong转换为UTM时输出异常

时间:2014-07-25 07:49:04

标签: c++ proj4

以下代码在日本的一个位置点转移latlong到utm。但是,utm结果完全不正常如下。有人可以帮忙吗?举个例子比较好。谢谢。 *** 0.607968 2.438016 -14 ***

   #include "proj_api.h"
   #include "stdio.h"
   main(int argc, char **argv) {
        projPJ pj_utm, pj_latlong;
        double x = 34.8;
        double y = 138.4;

        if (!(pj_utm = pj_init_plus("+proj=utm +zone=54 +ellps=WGS84")) ){
                       printf("pj_init_plus error");
           exit(1);
           }
        if (!(pj_latlong = pj_init_plus("+proj=latlong +ellps=WGS84")) ){
                       printf("pj_init_plus error");
           exit(1);
           }

           x *= DEG_TO_RAD;
           y *= DEG_TO_RAD;
          int  p = pj_transform(pj_latlong, pj_utm, 1, 1, &x, &y, NULL );
           printf("%.2f\t%.2f\n", x, y);
        exit(0);
   }

1 个答案:

答案 0 :(得分:1)

我注意到你没有检查pj_transform上的错误代码,所以我抓住了它并自己检查了。

它正在返回-14。负返回码通常表示错误。

PROJ.4文档中的一些挖掘显示pj_strerrno函数返回与错误代码关联的错误消息。因此,我使用了该功能,发现-14表示latitude or longitude exceeded limits

我检查了你的代码并发现了这个:

double x = 34.8;
double y = 138.4;

显然,y应该在[-90,90]范围内。您错误地命名了坐标。

正确地命名您的坐标会产生结果262141.18N 3853945.50E,如预期的那样。

我的代码如下:

//Compile with: gcc cheese.cpp -lproj
#include <proj_api.h>
#include <stdio.h>
main(int argc, char **argv) {
  projPJ pj_latlong, pj_utm;
  double y = 34.8;
  double x = 138.4;

  if (!(pj_latlong = pj_init_plus("+proj=longlat +datum=WGS84")) ){
    printf("pj_init_plus error: longlat\n");
    exit(1);
  }
  if (!(pj_utm = pj_init_plus("+proj=utm +zone=54 +ellps=WGS84")) ){
    printf("pj_init_plus error: utm\n");
    exit(1);
  }

  x *= DEG_TO_RAD;
  y *= DEG_TO_RAD;
  int p = pj_transform(pj_latlong, pj_utm, 1, 1, &x, &y, NULL );
  printf("Error code: %d\nError message: %s\n", p, pj_strerrno(p));
  printf("%.2fN\t%.2fE\n", x, y);
}