编译Android版本的Proj.4库
目录
Proj4(http://proj4.org/)是一个强大的坐标转换库,官方支持CMake编译,操作非常简单,但却没有编译成Android库的指导。
在Linux系统下编译Android版本的proj库操作如下(别问我Windows下怎么办,我也不知道,不过可以试试msys2):
1.创建独立工具链
创建一个独立的NDK工具链,具体参考http://blog.csdn.net/suningning/article/details/74510125
按照需要创建工具链,比如我创建了arm和arm64架构两个,建议带上-lstdc++选项 。
把bin目录加入PATH
2.configure
进入proj源码目录,构建arm架构的库,执行下面的configure代码,–prefix指定了要安装的路径
CFLAGS="-mthumb" CXXFLAGS="-mthumb" LIBS="-lstdc++" ./configure --prefix=/home/zouleid/proj/android --host=arm-linux-androideabi --enable-shared=yes
如果构建arm64架构,执行下面的代码
LIBS="-lstdc++" ./configure --prefix=/home/zouleid/proj/android --host=aarch64-linux-android --enable-shared=yes
3.make
直接make,没啥可说的。
4.make install
make完了make install,构建出来的结果就被安装在了构建时–prefix指定的路径中。
lib目录下的libproj.so、libproj.a分别是动态库和静态库。
我编译好的,头文件、动态链接库libproj.so和动态库libproj_static.a,armeabi-v7a和arm64-v8a版本:
http://download.csdn.net/download/zzzzllll2006/10121210
5.后记
使用示例
#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;
}
程序编译的时候需要链接pthread和m两个库,运行结果:
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
坐标转换原理图:
赫尔默特变换
转载自:https://blog.csdn.net/zzzzllll2006/article/details/78549539