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.so
和gdal.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
- 《GDAL 源码剖析及开发指南》
- GDAL 官网