0%

PROJ API调用的一个简单例子

基本知识

PROJ是什么?

PROJ 是安装GMT时依赖的一个程序,功能是提供地理坐标、大地测量坐标和投影坐标的转换功能。GMT中的投影、坐标转换和椭球面距离计算等功能来自PROJ。如果用户自己加入或者修改投影,则修改此程序。
PROJ项目开始于1983年。

PROJ怎么安装

PROJ使用c++编写,从官网下载源程序,依照编译指南编译。默认安装路径为/usr/local
如果通过在线安装,目录为/usr/bin

PROJ命令行怎么用?

可以通过命令行使用,例如

1
2
3
yangleir@DESKTOP-FVRFATD MINGW64 ~
$ echo 55.2 12.2 | proj +proj=merc +lat_ts=56.5 +ellps=GRS80
3399483.80 752085.60

API的调用

官网提供的一个C语言例子,经过编译可以正常运行。

编译时如果找不到库,可以使用:

1
gcc projtest.c -I/usr/local/include -L/usr/local/lib -lproj -o projtest

或者简化为:

1
gcc projtest.c  -lproj -o projtest

结果为:

1
2
3
yl@yl-Precision-Tower-7810:~/test$ ./projtest 
easting: 691875.632, northing: 6098907.825
longitude: 12, latitude: 55

PROJ 6示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <stdio.h>
#include <proj.h>
int main (void) {
PJ_CONTEXT *C;
PJ *P;
PJ* P_for_GIS;
PJ_COORD a, b;

/* or you may set C=PJ_DEFAULT_CTX if you are sure you will */
/* use PJ objects from only one thread */
C = proj_context_create();

P = proj_create_crs_to_crs (C,
"EPSG:4326",
"+proj=utm +zone=32 +datum=WGS84", /* or EPSG:32632 */
NULL);

if (0==P) {
fprintf(stderr, "Oops\n");
return 1;
}

/* This will ensure that the order of coordinates for the input CRS */
/* will be longitude, latitude, whereas EPSG:4326 mandates latitude, */
/* longitude */
P_for_GIS = proj_normalize_for_visualization(C, P);
if( 0 == P_for_GIS ) {
fprintf(stderr, "Oops\n");
return 1;
}
proj_destroy(P);
P = P_for_GIS;

/* a coordinate union representing Copenhagen: 55d N, 12d E */
/* Given that we have used proj_normalize_for_visualization(), the order of
/* coordinates is longitude, latitude, and values are expressed in degrees. */
a = proj_coord (12, 55, 0, 0);

/* transform to UTM zone 32, then back to geographical */
b = proj_trans (P, PJ_FWD, a);
printf ("easting: %.3f, northing: %.3f\n", b.enu.e, b.enu.n);
b = proj_trans (P, PJ_INV, b);
printf ("longitude: %g, latitude: %g\n", b.lp.lam, b.lp.phi);

/* Clean up */
proj_destroy (P);
proj_context_destroy (C); /* may be omitted in the single threaded case */
return 0;
}

注意

  • 需要提前设置PROJ_LIB的用户变量,在linux下使用方法
  • 在windows的vs平台需要设置PROJ_LIB的用户变量,方法见这里
  • windows下的proj库可以使用vcpkg快速编译,如果使用vcpkg编译出dll/include/lib,则不需要再vs中进行路径设置,因为vs已经默认