Proj.4库的编译及使用

Proj.4是开源GIS最著名的地图投影库,GRASS GIS, MapServer, PostGIS, Thuban, OGDI, Mapnik, TopoCad, GDAL/OGR等软件的投影都直接或间接的使用Proj.4。
Proj.4的功能主要有经纬度坐标与地理坐标的转换,坐标系的转换,包括基准变换等,下面以命令行方式和编程方式来说明经纬度坐标与地理坐标转换功能的使用。

Proj.4的下载和编译

使用git进行下载。

git clone https://github.com/OSGeo/proj.4.git

Linux下的编译和安装

下载之后,使用cmake生成Makefile进行编译。

mkdir -p build &&cd build   #进入proj.4工程目录后,创建一个构建目录,并进入
# 使用cmake生成Makefile,指定安装路径和生成库类型为静态库
cmake  -DCMAKE_INSTALL_PREFIX=./install -DBUILD_LIBPROJ_SHARED=OFF ..
# 编译
make
# 安装,安装的目录是之前指定的目录,就是当前目录下的install目录
make install

安装完成之后进入install目录,可以看到对应的头文件和库文件。

> tree
.
├── bin
│   ├── cs2cs
│   ├── geod
│   ├── nad2bin
│   └── proj
├── include
│   ├── geodesic.h
│   ├── proj_api.h
│   └── projects.h
├── lib
│   └── libproj.a
└── share├── cmake│   └── PROJ4│       ├── proj4-config.cmake│       ├── proj4-config-version.cmake│       ├── proj4-targets.cmake│       └── proj4-targets-release.cmake├── man│   ├── man1│   │   ├── cs2cs.1│   │   ├── geod.1│   │   └── proj.1│   └── man3│       ├── geodesic.3│       └── pj_init.3└── proj├── CH├── epsg├── esri├── esri.extra├── GL27├── IGNF├── nad27├── nad83├── nad.lst├── ntf_r93.gsb├── null├── nzgd2kgrid0005.gsb├── other.extra├── proj_def.dat└── world10 directories, 34 files

Windows下使用VS2013进行编译

先使用cmake生成VS工程

cd build    # 先进入build目录
# 下面设置了安装目录和编译参数等
cmake -DCMAKE_INSTALL_PREFIX=D:/proj.4 -DBUILD_LIBPROJ_SHARED=OFF -G"Visual Studio 12 Win64" ..

打开VS2013 x64本机命令行工具,然后进入build目录,执行下面命令

msbuild ALL_BUILD.vcxproj /p:Configuration="Release"
msbuild INSTALL.vcxproj /p:Configuration="Release"

编译安装完成后,可以进入D:\Proj.4目录查看输出的头文件和库文件(以及share目录下的一些数据文件)。

使用Proj.4库

使用以下代码来做测试

#include <stdio.h>
#include <stdlib.h>#include "proj_api.h"int main()
{// 定义一个北京54的横轴墨卡托投影坐标系// +proj=lcc    投影类型:横轴墨卡托投影// +ellps=krass 椭球体// +lat_1=25n +lat_2=47n    维度范围(标准纬线)// +lon_0=117e  中央经度为东经117度// +x_0=20500000    X轴(东)方向偏移量// +y_0=0           Y轴(北)方向偏移量// +units=m         单位// +k=1.0           比率const char* beijing1954="+proj=lcc +ellps=krass +lat_1=25n +lat_2=47n +lon_0=117e +x_0=20500000 +y_0=0 +units=m +k=1.0";//如果你想转换到WGS84基准 //"+towgs84=22,-118,30.5,0,0,0,0"projPJ pj;  // 坐标系对象指针// 初始化坐标系对象if (!(pj = pj_init_plus(beijing1954))){exit(-1);   // 初始化失败,退出程序}// 待转换的坐标(投影坐标)// 注意坐标系定义中的+x_0=20500000,坐标值应该也是带有带号的projUV parr[4] = {{20634500.0,4660000.0},{20635000.0,4661000.0},{20635500.0,4659000.0},{20634000.0,4662000.0}};printf("DEG_TO_RAD = %f  (1度=%f弧度)\n",DEG_TO_RAD,DEG_TO_RAD);// 逐点转换for(int i=0; i<4; i++){printf("\n--------------转换第%d点---------------\n",i+1);projUV p;p = pj_inv(parr[i],pj); // 投影逆变换(投影坐标转经纬度坐标)printf("北京54投影  坐标:%10lf,%10lf\n",parr[i].u,parr[i].v);printf("北京54经纬度坐标:%10lf,%10lf\n",p.u/DEG_TO_RAD,p.v/DEG_TO_RAD);    // 输出的时候,将弧度转换为度p = pj_fwd(p,pj);       // 投影正变换(经纬度坐标转投影坐标)printf("北京54投影  坐标:%10lf,%10lf\n",p.u,p.v);}// 释放投影对象内存pj_free(pj);return 0;
}

编译的时候,需要链接pthreadm两个库,因为前面编译的时候,生成的是静态库。如果生成的是动态库,则是不需要的。
test.cinstall目录下写的,所以指定的路径是如下的。

gcc test.c -Iinclude -Llib -lproj -lpthread -lm -o test

运行结果如下:

> ./test
DEG_TO_RAD = 0.017453  (1度=0.017453弧度)--------------转换第1点---------------
北京54投影  坐标:20634500.000000,4660000.000000
北京54经纬度坐标:118.611065, 40.462077
北京54投影  坐标:20634500.000000,4660000.000000--------------转换第2点---------------
北京54投影  坐标:20635000.000000,4661000.000000
北京54经纬度坐标:118.617253, 40.471148
北京54投影  坐标:20635000.000000,4661000.000000--------------转换第3点---------------
北京54投影  坐标:20635500.000000,4659000.000000
北京54经纬度坐标:118.622841, 40.452777
北京54投影  坐标:20635500.000000,4659000.000000--------------转换第4点---------------
北京54投影  坐标:20634000.000000,4662000.000000
北京54经纬度坐标:118.605475, 40.480447
北京54投影  坐标:20634000.000000,4662000.000000

Proj.4库的编译及使用相关推荐

  1. linux 编译mqtt静态库_编译MQTT C++ Client

    nmake  -f  ms\nt.mak(这是静态库,动态库是ntdll.mak) nmake  -f  ms\nt.mak test(测试命令,如果成功则最后显示"passed all t ...

  2. PCL-1.8.1从源码搭建开发环境三(QHULL库的编译)

    原文首发于微信公众号「3D视觉工坊」:PCL-1.8.1从源码搭建开发环境三(QHULL库的编译) 首先,介绍一下QHull库. QHull是一个开源的程序软件,用来研究解决凸包问题,生成凸包形体.官 ...

  3. PCL-1.8.1从源码搭建开发环境二(FLANN库的编译)

    原文首发于微信公众号「3D视觉工坊」,PCL-1.8.1从源码搭建开发环境二(FLANN库的编译) 首先,快速近似最近邻搜索库FLANN-Fast Library for Approximate Ne ...

  4. Linux下boost库的编译、安装详解

    1.下载源文件 去官网下载:http://www.boost.org/ 这里下载最新版本 wget https://dl.bintray.com/boostorg/release/1.64.0/sou ...

  5. Linux下Json库的编译及代码测试

    一.Json基础 JSON(JavascriptObject Notation)是一种轻量级的数据交换语言,以文字为基础,且易于让人阅读.尽管JSON是在Javascript的一个子集,但JSON是独 ...

  6. vs2008中xlslib与libxls库的编译及使用

    C++用来操作Excel的方法很多,但是涉及到跨平台,同时又要对Excel的读写操作兼顾,而且免费的库,那应该是要用xlslib和libxls了.由于技术比较菜,折腾这个折腾了一个星期了.最开始是使用 ...

  7. 【Android NDK 开发】NDK 交叉编译 ( NDK 函数库目录 | Linux 交叉编译环境搭建 | 指定头文件目录 | 指定函数库目录 | 编译 Android 命令行可执行文件 )

    文章目录 I . NDK platforms 目录下的 函数库 II . Ubuntu 配置 NDK 交叉编译环境 III . 同时指定编译的头文件和库文件 IV . 指定编译的头文件 V . 指定编 ...

  8. MFC模块的动态链接库DLL以及静态链接库LIB编译后的调用

    静态链接库LIB和动态链接库DLL的区别,创建和示例   1.什么是静态连接库,什么是动态链接库   静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都 ...

  9. Linux上静态库和动态库的编译和使用

    linux上静态库和动态库的编译和使用(附外部符号错误浅谈) 这就是静态库和动态库的显著区别,静态库是编译期间由链接器通过include目录找到并链接到到可执行文件中,而动态库则是运行期间动态调用,只 ...

  10. gcc/g++ 链接库的编译与链接

          程序编译一般需要经预处理.编译.汇编和链接几个步骤.在实际应用中,有些公共代码需要反复使用,就把这些代码编译成为"库"文件.在链接步骤中,连接器将从库文件取得所需的代码 ...

最新文章

  1. Python解密2021年最新富豪榜,马云居然连前三都没进
  2. 在浏览器输入一个网址,按回车之后发生了什么?
  3. webpack从入门到精通(三)生产环境的基本配置
  4. exchange2013-Database is mandatory on UserMailbox..
  5. NHibernate学习(转)
  6. 里rust怎么找蓝图_Rust错误处理
  7. 前端总结·基础篇·CSS(二)视觉
  8. 微服务技术栈:流量整形算法,服务熔断与降级
  9. python报表自动化系列 - 为pandas.DataFrame制作自然数索引(更改索引为从1开始的自然数)
  10. PCS7 DCS 水泥粉磨程序
  11. 7 Python文件和数据格式化
  12. 1篇SCI二区+4篇一类可定A档博士!110万房补,享副教授甚至教授待遇!
  13. 红米k40pro一键root教程
  14. [解决]IDEA每次启动都会打开Licenses激活弹窗、IDEA打不开
  15. 四川省评高级教师考职称计算机,四川省中学教师中、高级职称评审条件
  16. antd中reset为啥点击两次
  17. python取整数部分的几种方法
  18. Linux-hexdump命令调试event驱动—详解(13)
  19. 2. Vmware vCenter部署
  20. 马云的故事:缔造阿里巴巴帝国秘诀

热门文章

  1. 鸿蒙会像IOS,你更看好鸿蒙还是苹果?iOS系统升级 分享与互联成苹果发布会主题...
  2. 性能测试--jmeter中的用户自定义变量【13】
  3. 1130 无法登录 mysql_无法登录phpmyadmin,报1130错误
  4. 被替换的项目不是替换值长度的倍数_机器学习中处理缺失值的9种方法
  5. go实现json格式文件的输出---小示例
  6. kettle 驱动位置
  7. mysql safe 模式_MYSQL的安全模式:sql_safe_updates介绍
  8. 网络驱动器映射成功但无法更新文件_FTP映射网络驱动器-ExpanDrive for mac
  9. 建模步骤_数学建模的基本步骤
  10. CentOS 设置网络(修改IP修改网关修改DNS)