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
└── world 10 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. (2)RGB-D SLAM系列- 工具篇(依赖库及编译)

    做了个SLAM的小视频,有兴趣的朋友可以看下 https://youtu.be/z5wDzMZF10Q 1)Library depended 一个完整的SLAM系统包括,数据流获取,数据读取,特征提取 ...

  2. Linux动态库的编译与使用 转载

    http://hi.baidu.com/linuxlife/blog/item/0d3e302ae2384d3a5343c1b1.html Linux下的动态库以.so为后缀,我也是初次在Linux下 ...

  3. Windows下zlib库和libPng库的编译和使用

    关于zlib库和libpng是干嘛的,我就不说了,度娘和谷歌都能告诉你.这里主要记录下windows下如何利用vs2010编译和使用这两个库. 一.zlib库的编译 首先要下载这个库,这个谷歌和百度也 ...

  4. Linux动态库的编译与使用

    转载: http://hi.baidu.com/linuxlife/blog/item/0d3e302ae2384d3a5343c1b1.html Linux下的动态库以.so为后缀,我也是初次在Li ...

  5. 【UWP】FFmpeg库的编译

    本文是关于windows8.1/windows10通用应用下编译ffmpeg的一些需要注意的地方,针对最新的msys2而写,都是我在实际操作中遇到的,但是网上没有提到的.如果大家遇到什么问题或是在之前 ...

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

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

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

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

  8. linux上静态库和动态库的编译和使用(附外部符号错误浅谈)

    主要参考博客gcc创建和使用静态库和动态库 对于熟悉windows的同学,linux上的静态库.a相当于win的.lib,动态库.so相当于win的.dll. 首先简要地解释下这两种函数库的区别,参考 ...

  9. json库的编译方法和vs2010中导入第三方库的方法

    json库的编译方法和vs2010中导入第三方库的方法 一.去相应官网下载json.cpp文件 Jsoncpp下载:https://sourceforge.net/projects/jsoncpp/  ...

随机推荐

  1. jquery工具方法access详解

    access : 多功能值操作(内部) access方法可以使set/get方法在一个函数中体现.比如我们常用的css,attr都是调用了access方法. css的使用方法: $(selector) ...

  2. C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 网络订单提醒功能,网点区域功能增强

    客户端会提醒是否有网络订单来了,这样及时处理网络上的用户下单,当然也会有手机短信系统,全国几千个网点就可以协同作战了,竟然有序的处理海量用户的下单.网络订单提醒功能增强效果如下: 系统每5分钟会检查一 ...

  3. bash/shell编程学习(2)

    先来复习上节重定向的用法: 1.快速清空文件 cat demo.txt < /dev/null 注:linux中有一个经典名言[一切皆文件],/dev/null可以认为是一个特殊的空文件,更形象 ...

  4. 基于webmagic的爬虫项目经验小结

    大概在1个月前,利用webmagic做了一个爬虫项目,下面是该项目的一些个人心得,贴在这里备份: 一.为什么选择webmagic? 说实话,开源的爬虫框架已经很多了,有各种语言(比如:python.j ...

  5. JS组件系列——Bootstrap右键菜单解决方案:ContextMenu

    前言:有段时间没发表随笔了,过个年人都变得懒了.新年刚来上班,今天正好得空,将去年遗留的两个小组件总结记录下.有朋友跟我说:你的bootstrap组件要能够形成一个可以满足一般项目需求的系列组件,才有 ...

  6. 浅谈对Spring Framework的认识

    Spring Framework,作为一个应用框架,官方的介绍如下: The Spring Framework provides a comprehensive programming and con ...

  7. Visual Studio 2015 Pre Secondary Installer 在哪里

    安装vs2015 pre后,会自动打开Secondary Installer, 用于Cross Platform的移动开发框架,包括Cordova插件.若安装失败,启动程序位置: "D:\P ...

  8. Ubuntu 16.04 LTS设置国内更新源

    ubuntu一般多用于开发环境,centos/redhat多用于企业环境.suse多用于银行金融行业!!! 01.ubuntu源地址 /etc/apt/sources.list 02.更新缓存资源索引 ...

  9. k8s总结(图片打开略慢请知晓)

  10. Android BLE 蓝牙编程(一)

    最近在研究这个,等我有时间来写吧! 终于在端午节给自己放个假,现在就来说说关于android蓝牙ble的 最近的学习成果吧!! 需要材料(写个简单教程吧--关于小米手环的哦!嘿嘿) Android 手 ...