jk3d的使用方法详解——克里金插值的java实现

99封情书 提交于 2020-11-15 06:30:08

关于克里金的资料我这里就不罗嗦了,反正这种插值算法是非常优秀的,插值结果可靠度高,最近也是一个问题需要使用插值来解决,首选克里金,但是我大概了解克里金是怎么一回事儿,但要是自己去写算法实现,对我来说这成本还是高了些,网上搜索克里金插值的java实现,几乎搜不到,全是c、c++或是matlab的,本来想找个c的自己转成java,但是看了看c的源码,还是放弃了,因为那样只会把自己引入另一个无法预测深渊,功夫不负有心人,还是找到了一个java的实现,是一个jar包,也就是标题提到的jk3d,开始很开心,但过不多久,就发现自己被忽悠了,这个库没有例子,没有文档,google、baidu甚至bing都找不到有任何关于jk3d的例子,能找到的就只有一段话:

jk3d is a java code for 3d interpolation of scattered data. jk3d uses a quality weighted ordinary Kriging method and optional an inverse distances weighting method. It has no graphical user interface and uses ASCII files to define the input.
然后就是一个下载链接,郁闷之极,不过它提供了javadoc的下载,开始也是很开心,没有例子,看看api文档也是不错的,不过,我发现,我再一次被忽悠了,所谓的javadoc里面就只是包名、类名、方法名和方法的参数列表,连类和方法最起码的描述都没有,更别说每个参数是什么意义,但是,真正的算法就藏在里面,只剩下最后一个线索,jk3d的源码,必须承认,看人家的代码是一件比较痛苦的事情,而且源码也鲜有注释,九成九的类和方法都没有注释,描述这个方法或是类作用的句子都没有,只能初步判断,这个包最顶层的接口应该是在jk3d这个类里面,而这个类的构造函数需要一个文件的路径,这回我大概明白,需要把待插值的数据存成文本,然后交给这个类处理,那么问题又来了,这个文本是怎样的格式呢?


这中间又是经历了一番波折,总算知道了它的用法:
要运行jk3d需要两个文件:

第一个文件的内容:


Parameters for jk3d
                  *******************

START OF PARAMETERS:
E:/workspace/kriging/testdata-iw3d-3D.dat         -file with data
1   2   3    4     0             -columns for X, Y, Z, var, sec var
-1.0e21   1.0e21                 -trimming limits
0                                -option: 0=grid, 1=cross, 2=jackknife
xvk.dat                          -file with jackknife data
1   2   0    3    0              -columns for X,Y,Z,vr and sec var
3                                -debugging level: 0,1,2,3
testdata-iw3d-3D.dbg             -file for debugging output
testdata-iw3d-3D.out             -file for kriged output
10 0 0.05                         -nx,xmn,xsiz
10 0 0.05                         -ny,ymn,ysiz
1 0 0.05                         -nz,zmn,zsiz
1    1      1                    -x,y and z block discretization
1    16                          -min, max data for kriging
16    8                           -max per octant (0-> not used), blank if more than this many octants are empty
1.1  1.1  1.1                    -maximum search radii
0.0   0.0   0.0                  -angles for search ellipsoid
1     -1001                      -0=SK,1=OK,2=non-st SK,3=exdrift
0 0 0 0 0 0 0 0 0                -drift: x,y,z,xx,yy,zz,xy,xz,zy
0                                -0, variable; 1, estimate trend
extdrift.dat                     -gridded file with drift/mean
4                                -column number in gridded file
1    0.0                         -nst, nugget effect
3   0.04    0.0   0.0   0.0      \it,cc,ang1,ang2,ang3
   0.994  0.994   0.84            \a_hmax, a_hmin, a_vert
3   0.0336  0.0   0.0  90.0      \it,cc,ang1,ang2,ang3
   0.85 0.85 0.0                 \a_hmax, a_hmin, a_vert

 这个文件 是jk3d运动的参数,主要需要设置的有-file with data这行,把地址替换为需要插值的文件的路径,这个文件里面什么格式后面会提到,然后就是 -nx,xmn,xsiz 、-ny,ymn,ysiz和-nz,zmn,zsiz这三行,这几个参数我还没理解透什么意义,只知道第一列是表示长度,根据上面的文本,意义就是,数据是一个10*10*1(x*y*z)的矩阵,其他参数暂时不知道具体意义,因为我也是刚刚才破解其用法,差点忘了,还有-file for kriged output这一行,表示结果数据的路径。

第二个文件:

primary data
4
X
Y
Z
VAL
0.25	0.0	0.0	0.5949055284903
0.1	0.05	0.0	0.6571611788389199
0.1	0.1	0.0	0.6720057966901514
0.25	0.25	0.0	0.6626711463208254
0.1	0.35	0.0	0.5627861035427689
0.25	0.35	0.0	0.5563930406058681
0.0	0.4	0.0	0.4732733688276998
0.25	0.4	0.0	0.4885665990444264
0.25	0.45	0.0	0.42513590873906865
这个代表的就是数据文件,第二行的4估计是字段数的意思,后面几个字母都不理他,大概意思就是第一列是x,第二列是y,第三列是z,第四列是val。

ok有了这些了解,就可以进行插值操作了:
代码很简单

public static void main(String[] args){
		
		String path="E:/workspace/kriging/jk3d.par";//第一个文件的路径
		jk3d j=new jk3d(path);
		
	}

好了,找到结果文件打开看看吧。

上两张效果图:

插值前:

插值后:

要是我这篇文章帮到了你,就顶一个吧


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!