GDAL ShapeFile实战笔记

Table of Contents generated with DocToc

[TOC]

准备

源码及工具

  • GDAL 2.4.0
  • swig
  • Ant

windows平台可以直接使用由第三方提供的dll文件GISInternals,同时在项目中直接依赖Maven中的Gdal对应版本即可,由于没有找到可用的2.4.0的linux下的动态链接库,所以只能自己编译了,蛋疼

动态链接库及Jar包

  • libgdal.so.20
  • libgdalalljni.so
  • gdal.jar

编译源码

cd $GDAL_HOME
./configure --with-java=$JAVA_HOME --prefix=$PATH_YOU_WANT_TO_INSTALL
make
make install

编译结束后,继续编译Java接口和JNI支持库

cd $GDAL_HOME/swig/java
make

如果编译Java的过程报作用域的错误,直接找到对应Java文件,加个public,简单粗暴。实际上有用的就这俩:libgdalalljni.sogdal.jar,如果不能确保maven中心库的编译工具和自己环境的编译工具一致,就不要引用maven中心库的jar包。

由于项目里暂时没法自定义基础容器,所以需要将这GDAL手动集成到项目的包里,又一个蛋疼

集成

源码编译完成后,将$PATH_YOU_WANT_TO_INSTALL/share $PATH_YOU_WANT_TO_INSTALL/lib复制出来放到项目的某个文件夹下比如$PROJECT_LIB/gdal,怎么打包可以百度,同时,由于容器化部署,GDAL的依赖库不一定都包含在了基础容器中,所以还要验证:

查看libgdalalljni.so所有动态链接库依赖:

# 懒得找linux环境了,Mac上的动态链接库依赖查看用otool
# Linux环境用 ldd libgdalalljni.so 
otool -L libgdalalljni.20.dylib 
	libgdalalljni.20.dylib:
	/Users/xjd/tools/gdal-2.4.0/build/lib/libgdalalljni.20.dylib (compatibility version 26.0.0, current version 26.0.0)
	/Users/xjd/tools/gdal-2.4.0/build/lib/libgdal.20.dylib (compatibility version 26.0.0, current version 26.0.0)
	/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 400.9.4)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.200.5)

查看基础容器中/usr/lib/usr/lib64中是否都包含了上面的依赖,如果没有,还需要将这些添加到你的$PROJECT_LIB/gdal/lib中。

容器化部署添加环境变量

ENV GDAL_DATA /opt/local/.../gdal-2.4.0/share/gdal/
ENV LD_LIBRARY_PATH /opt/local/.../gdal-2.4.0/lib/

应用启动时,加载动态库:

private static void loadJNILibDynamically() {
    String libPath = ":/opt/local/.../gdal-2.4.0/lib/"
    try {
        System.setProperty("java.library.path", System.getProperty("java.library.path") + libPath);
        Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths");
        fieldSysPath.setAccessible(true);
        fieldSysPath.set(null, null);
        System.loadLibrary("libjdalalljni.so");
    } catch (Exception e) {
        // do nothing for exception
    }
}

验证

由于部署环境为linux,如果需要在Windows上面或者Mac上进行调试,Windows下好办,直接在GISInternals下载对应版本,放到系统路径下,项目中直接引用Maven库中的GDAL就行了。Mac下虽然也有第三方编译好的库,但是,没有2.4.0版本的,所以还是得自己编译,编译方法同理,只是在mac下,动态链接库的后缀是.dylib

将Shapefile转换成Json的小Demo,程序参考自网络:

static void gdalTest() {
		ogr.RegisterAll();
    //文件路径
    String from = "service/src/main/resources/data/HRoad.shp";
    //转换后的文件路径
    String to = "service/src/main/resources/data/HRoad.json";
    //打开数据
    DataSource ds = ogr.Open(from,0);
    if (ds == null) {
      // something is wrong.
    }
  
    Driver dv = ogr.GetDriverByName("GeoJSON");
    if (dv == null) {
      // something is wrong.
    }
  
    dv.CopyDataSource(ds, to);
    System.out.println("转换成功!");
}

预热

地理空间基本概念

  • 基准面

    用来拟合地球表面的椭球体,这个椭球体是一个数学上表达的规则椭球。常见的基准面:

    基准面名称 长半轴(m) 短半轴(m) 扁率的倒数
    Krassovsky 1940 6378245 6356863.0188 298.2997381
    IAG 75 6378140 6356755.2882 298.257
    WGS 1984 6378137 6356752.3142 298.257223563
  • 地理坐标系 (GCS, Geographic Coordinate System)

    地理坐标系利用基准面定义的球面来定义地球上的位置,俗称真实世界坐标系。

  • 投影坐标系

    将由三维球面定义的地理坐标系,转换为二维坐标系,比如转换成平面地图。

模块简介

  • org.gdal.gdal 栅格数据处理,比如处理tiff格式文件
  • org.gdal.ogr 矢量数据处理,比如处理shapefile
  • org.gdal.gnm (Geographic Network Model) 地理空间网络模型
  • org.gdal.osr (Projection & Spatial Reference) 投影和空间索引

REFERENCES