最近项目原因需要用到克里金和等直线算法 ,在网上找了许久都不太满意,不是话说到一半就是 示例不正确,要不就是没库等等,捣鼓许久弄出来,把示例代码发出来分享一下。

首先了说明一下为什么要使用到克里金算法 因为气象方面很多气象站点零散的分布在地图各个位置,在这零散的位置上就可能会产生区域覆盖不完整的情况,这个时候就需要做插值覆盖。而等直线的意义跟插值业务一样,因为在地图上热力图的绘制需要大量格点数据来支撑绘制所以,就会出现在绘制热力图的时候光是下载格点数据都是很大的,这个取决于格点密度,密度越大那么数据量就会很大,在网络传输过程中光是下载这个数据都需要花费很多时间,更别说绘制了。所以等值线数据就尤为的重要。例如:

根据区域划分成勾勒出线的坐标,其内的值都是等值范围这样的数据就不会很多,当然等值范围越精确数据也会递增。

这次示例使用到的库wContour和geo,因为代码不复杂 加上代码也有注释,所以我就不细致解释下去了直接上demo

package kriginDemo.test;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.util.ArrayList;

import java.util.List;

import org.json.simple.JSONObject;

import com.alibaba.fastjson.JSON;

import krigingDemo.util.CommonMethod;

import krigingDemo.util.KrigingUtil;

import wContour.Contour;

import wContour.Interpolate;

import wContour.Global.Border;

import wContour.Global.PointD;

import wContour.Global.PolyLine;

import wContour.Global.Polygon;

public class Test {

/**

* 通过本地文件访问json并读取

*

* @param path:json文件路径

* @return:json文件的内容

*/

public static String readFile(String path) {

StringBuffer laststr = new StringBuffer();

File file = new File(path);// 打开文件

BufferedReader reader = null;

try {

FileInputStream in = new FileInputStream(file);

reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));// 读取文件

String tempString = null;

while ((tempString = reader.readLine()) != null) {

laststr = laststr.append(tempString);

}

reader.close();

} catch (IOException e) {

e.printStackTrace();

} finally {

if (reader != null) {

try {

reader.close();

} catch (IOException el) {

}

}

}

return laststr.toString();

}

private static String getPolygonGeoJson(List cPolygonList) {

String geo = null;

String geometry = " { \"type\":\"Feature\",\"geometry\":";

String properties = ",\"properties\":{ \"hvalue\":";

String head = "{\"type\": \"FeatureCollection\"," + "\"features\": [";

String end = " ] }";

if (cPolygonList == null || cPolygonList.size() == 0) {

return null;

}

try {

for (Polygon pPolygon : cPolygonList) {

List ptsTotal = new ArrayList();

List pts = new ArrayList();

PolyLine pline = pPolygon.OutLine;

for (PointD ptD : pline.PointList) {

List pt = new ArrayList();

pt.add(ptD.X);

pt.add(ptD.Y);

pts.add(pt);

}

ptsTotal.add(pts);

if (pPolygon.HasHoles()) {

for (PolyLine cptLine : pPolygon.HoleLines) {

List cpts = new ArrayList();

for (PointD ccptD : cptLine.PointList) {

List pt = new ArrayList();

pt.add(ccptD.X);

pt.add(ccptD.Y);

cpts.add(pt);

}

if (cpts.size() > 0) {

ptsTotal.add(cpts);

}

}

}

JSONObject js = new JSONObject();

js.put("type", "Polygon");

js.put("coordinates", ptsTotal);

double hv = pPolygon.HighValue;

double lv = pPolygon.LowValue;

if (hv == lv) {

if (pPolygon.IsClockWise) {

if (!pPolygon.IsHighCenter) {

hv = hv - 0.1;

lv = lv - 0.1;

}

} else {

if (!pPolygon.IsHighCenter) {

hv = hv - 0.1;

lv = lv - 0.1;

}

}

} else {

if (!pPolygon.IsClockWise) {

lv = lv + 0.1;

} else {

if (pPolygon.IsHighCenter) {

hv = hv - 0.1;

}

}

}

geo = geometry + js.toString() + properties + hv

+ ", \"lvalue\":" + lv + "} }" + "," + geo;

}

if (geo.contains(",")) {

geo = geo.substring(0, geo.lastIndexOf(","));

}

geo = head + geo + end;

} catch (Exception e) {

e.printStackTrace();

return geo;

}

return geo;

}

public static void main(String[] args) {

//雅安样本数据

double[][] trainData = JSON.parseObject(readFile("G:\\t.json"), double[][].class);

KrigingUtil kriging = new KrigingUtil(KrigingUtil.SPHERICAL_MODEL, 0, 100);

kriging.train(trainData[2], trainData[0], trainData[1]);

//经度起点

double left = 101.91;

//经度结束点

double right =103.395;

//维度起点

double bottom = 28.845;

//维度结束点

double top = 30.935;

double[] bottomLeft = {left, bottom};

double[] topLeft = {left, top};

double[] topRight = {right, top};

double[] bottomRight = {right, bottom};

double[][][] polygons = {{bottomLeft, topLeft, topRight, bottomRight}};

//计算经纬度格点距离

double xWidth = Math.abs(right - left) / 297;

double yWidth = Math.abs(top - bottom) / 418;

//克里金插值

KrigingUtil.Grid grid = kriging.grid(polygons, xWidth, yWidth);

//等值线阈值

double[] dataInterval = new double[]{10,20,25,30,35};

//异常数据样本

double _undefData = -9999.0;

double[] _X = new double[420];

double[] _Y = new double[298];

Interpolate.createGridXY_Num(101.91,28.845,103.395,30.935, _X, _Y);

int[][] S1 = new int[grid.A.length][grid.A[0].length];

//绘线

List _borders = Contour.tracingBorders(grid.A, _X, _Y,S1, _undefData);

List cPolylineList = new ArrayList();

cPolylineList = Contour.tracingContourLines(grid.A, _X, _Y, dataInterval.length, dataInterval, _undefData, _borders, S1);// 生成等值线

cPolylineList = Contour.smoothLines(cPolylineList);// 平滑

List cPolygonList = new ArrayList();

cPolygonList = Contour.tracingPolygons(grid.A, cPolylineList,_borders, dataInterval);

String geojsonpogylon = getPolygonGeoJson(cPolygonList);

CommonMethod cm = new CommonMethod();

cm.append2File("G:\\data.json",geojsonpogylon);

}

}

double[][] trainData = JSON.parseObject(readFile("G:\\t.json"), double[][].class);

这个数据是我的样本数据

//计算经纬度格点距离

double xWidth = Math.abs(right - left) / 297;

double yWidth = Math.abs(top - bottom) / 418;

这个297和418 是我自己计算的值意思是从开始经纬度 和结束经纬度 以0.005为格点距离计算出来的数值

CommonMethod cm = new CommonMethod();

cm.append2File("G:\\data.json",geojsonpogylon);

最后将JSON 输出到文件 因为数据也是比较大的

来源:oschina

链接:https://my.oschina.net/umbrellall1/blog/4256500

java 等值线,java 克里金插值+等值线划分示例相关推荐

  1. python绘制边界等值线_pykrig克里金插值后绘制等值线图+边界外白化

    用到的主要有Matplotlib.Pykrig俩包,首先载入需要的数据文件 from mpl_toolkits.basemap import Basemap import matplotlib.pyp ...

  2. 前端实现克里金插值分析(二)

    作者:yangjunlin   在上一篇文章中我们已经使用了像素法实现克里金插值的方式,但是问题也就随之抛了出来.1.第一点,在反距离权重插值的时候,因为处理的数据量大会直接导致主线程卡,导致用户体验 ...

  3. 基于主动学习和克里金插值的空气质量推测

    基于主动学习和克里金插值的空气质量推测 常慧娟, 於志文, 於志勇, 安琦, 郭斌 西北工业大学计算机学院,陕西 西安 710072 福州大学数学与计算机科学学院,福建 福州 350108    摘要 ...

  4. gstat | 空间插值(四)——克里金插值之协同克里金和交叉验证

    本篇是介绍克里金插值的第三篇推文,也是最后一篇. 因为前面两篇使用的数据中已知点的样本太少,本篇使用gstat工具包说明文档中的数据集.该数据集来自sp工具包. 实际上,gstat工具包的方法对sp和 ...

  5. gstat | 空间插值(三)——克里金插值之泛克里金和简单克里金

    本篇接着上篇继续介绍克里金插值.首先加载相关工具包和上篇使用的示例数据: library(gstat) library(sf) library(tidyverse) library(readxl) l ...

  6. gstat | 空间插值(二)——克里金插值之普通克里金

    说明:昨天的推文误把可吸入颗粒物当作PM2.5,实应该为PM10,这里修正后重发. 从本篇开始计划分三篇介绍克里金插值.与反距离权重插值不同,克里金插值是无偏估计,其中也涉及到模型估计.本篇先对普通克 ...

  7. ArcGIS中使用协同克里金插值(co-kriging interplotation )对气象数据插值

    ArcGIS中如何使用协同克里金插值(co-kriging interplotation )对气象数据插值 ANUSPLIN气象站点数据插值局限性 百度搜索ArcGIS 克里金插值 搭建梯子搜索Arc ...

  8. 克里金插值---MATLAB程序

    最近在研究克里金插值,拜读了@lanainluv的笔记,备受启发, 在这里做一些补充,并分享自己的代码,希望对各位有所帮助,有误的地方请批评指正!(有帮助的话点个赞吧~) @lanainluv的原文链 ...

  9. 克里金插值详细步骤_openlayers4 入门开发系列之前端动态渲染克里金插值 kriging 篇(附源码下载)...

    前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...

  10. ArcGIS之克里金插值教学

    本文来自:GIS科研实验室 基本概念 1.什么是克里金插值? 克里金插值又称空间局部插值法,是以半变异函数理论和结构分析为基础,在有限区域内对区域化变量进行无偏最优估计的一种方法,是地统计学的主要内容 ...

最新文章

  1. 俄克拉荷马州立大学冯锋组博士生招聘-植物与微生物互作
  2. python内置函数sorted(x)的作用是_Python内置filter与sorted函数
  3. 本地Run Page时报检测到意外的 URL 参数,它将被忽略。
  4. 【玩转cocos2d-x之九】动作类CCAction
  5. WKViewManager iOS 弹窗架构
  6. RAC环境数据库重启实例
  7. Mybatis异常There is no getter for property named ‘XXX‘ in ‘class java.lang.String‘
  8. 如何在 Mac 上的“照片”中更改和增强视频?
  9. SelectionKey 说 明
  10. 随笔——我悄悄地更新了我的博客
  11. C/C++语言经典、实用、趣味程序设计编程百例精解
  12. Python学习笔记—— 面向对象4.类属性、类方法、静态方法
  13. 如何在MAC上查看系统运行信息、内存使用率等
  14. 【密码学/密码分析】基于TMTO的密码分析方法
  15. 酷派大神F1移动版刷机教程卡刷教程
  16. 基于Zotero和坚果云的大规模文献同步管理环境配置及常用功能介绍(超详细)
  17. WIN7登陆界面去掉下面windows 7 旗舰版
  18. 哪些进销存软件既好用又免费?
  19. GO语言GET安装问题{cccccccccccccccccccc}
  20. 6.24:K60电源管理V5_最简版本蓄水池

热门文章

  1. 渗透测试报告模板_网站安全测试报告模板该如何写
  2. python骰子游戏分析_python知识分解析掷骰子游戏
  3. 百度开放平台SDK错误解决
  4. ubuntu 键盘输入法为空_Ubuntu12下键盘输入中文设置 - 卡饭网
  5. 【一起学习输入法】华宇拼音输入法开源版本解析(5)
  6. 二维数组指针表示,C语言指针引用二维数组详解
  7. 浏览器内核信息和功能查看
  8. 实体机黑苹果安装教程
  9. 常见的图标库有哪些?
  10. Eclipse学习笔记