编译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

You may also like...