java 配置gdal以及反距离插值java demo

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();
	}

}

  如果 觉得文章帮到了你,点个赞吧!

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值