gdal 源码是c++ 写的,Java想使用,就得用jni调用,使用教程
1、从https://www.gisinternals.com/release.php下载编译好的gdal
2、我下载的是release-1911-x64-gdal-3-2-0-mapserver-7-6-1.zip这个版本
3、将下载的zip 解压,目录结构如下:
3、将
(1) D:\develop\release-1911-x64-gdal-3-2-0-mapserver-7-6-1\bin
(2) D:\develop\release-1911-x64-gdal-3-2-0-mapserver-7-6-1\bin\gdal\java
(3) D:\develop\release-1911-x64-gdal-3-2-0-mapserver-7-6-1\bin\gdal\apps
上述3个路径加入环境变量。(1)和(2)是编译好的dll路径,(3)是提供了命令行工具,不用可以不添加环境变量
4、创建java项目,导入 D:\develop\release-1911-x64-gdal-3-2-0-mapserver-7-6-1\bin\gdal\java\
5、添加测试代码
public static void main(String[] args) {
// System.out.println(System.getProperty("java.library.path"));
ogr.RegisterAll();
}
运行 没有报错,就是成功了
6一般情况,不会这么顺利,
A: 假如报找不到什么lib,可以System.out.println(System.getProperty("java.library.path")) 看看lib 路径是什么,把上面(1)(2)(3),放入打印出来的路径即可。
B: 或者换个编译工具,我本来设置好环境变量,在eclipse 中运行一直报找不到lib,但是同样的代码在idea 中可以正常运行,现在想来可能是idea和eclipse 读取环境变量路径不同
最后,目录结构:
做了一个反距离差插值的测试代码:网上都是python或者c++的,对java很不友好,读了gdal 提供的反距离插值源码,才知道怎么搞了 ,醉醉的
package gdalTest;
import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.DoubleBuffer;
import java.nio.FloatBuffer;
import java.nio.LongBuffer;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.gdal.gdal.Dataset;
import org.gdal.gdal.gdal;
import org.gdal.gdalconst.gdalconst;
public class Test {
public static void main(String[] args) throws Exception {
System.out.println(System.getProperty("java.library.path"));
gdal.AllRegister();
List<String> list = FileUtils.readLines(new File("dem.csv"));
double[][] points = new double[4][3];
for (int i = 1; i < list.size(); i++) {
String line = list.get(i);
String[] tmp = line.split(",");
points[i - 1][0] = Double.parseDouble(tmp[0]);
points[i - 1][1] = Double.parseDouble(tmp[1]);
points[i - 1][2] = Double.parseDouble(tmp[2]);
}
DoubleBuffer db =IDW(points, 85000, 89000, 894000, 890000, 10, 10);
}
public static DoubleBuffer IDW(double[][] points, double leftX, double rigthX,double topY, double bottonY,
double increaseX, double increaseY) {
int xCount = (int) ((rigthX - leftX) / increaseX);
int yCount = (int) ((topY - bottonY) / increaseY);
gdal.AllRegister();
String algorithmOptions = "invdist:power=2.000000:smoothing=1.000000:radius1=5.000000:radius2=5.000000:angle=0.000000:max_points=0:min_points=0:nodata=0.000000";
int gdtFloat64 = gdal.GetDataTypeSize(gdalconst.GDT_Float64);
int capacity = (gdtFloat64 / 8) * xCount * yCount;
ByteBuffer nioBuffer = ByteBuffer.allocateDirect(capacity);
gdal.GridCreate(algorithmOptions, points, leftX, rigthX, topY, bottonY, xCount, yCount, gdalconst.GDT_Float64,
nioBuffer);
ByteBuffer nio = nioBuffer.order(ByteOrder.LITTLE_ENDIAN);
return nio.asDoubleBuffer();
}
}
如果 觉得文章帮到了你,点个赞吧!