java 等值线,java 克里金插值+等值线划分示例
最近项目原因需要用到克里金和等直线算法 ,在网上找了许久都不太满意,不是话说到一半就是 示例不正确,要不就是没库等等,捣鼓许久弄出来,把示例代码发出来分享一下。
首先了说明一下为什么要使用到克里金算法 因为气象方面很多气象站点零散的分布在地图各个位置,在这零散的位置上就可能会产生区域覆盖不完整的情况,这个时候就需要做插值覆盖。而等直线的意义跟插值业务一样,因为在地图上热力图的绘制需要大量格点数据来支撑绘制所以,就会出现在绘制热力图的时候光是下载格点数据都是很大的,这个取决于格点密度,密度越大那么数据量就会很大,在网络传输过程中光是下载这个数据都需要花费很多时间,更别说绘制了。所以等值线数据就尤为的重要。例如:
根据区域划分成勾勒出线的坐标,其内的值都是等值范围这样的数据就不会很多,当然等值范围越精确数据也会递增。
这次示例使用到的库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 克里金插值+等值线划分示例相关推荐
- python绘制边界等值线_pykrig克里金插值后绘制等值线图+边界外白化
用到的主要有Matplotlib.Pykrig俩包,首先载入需要的数据文件 from mpl_toolkits.basemap import Basemap import matplotlib.pyp ...
- 前端实现克里金插值分析(二)
作者:yangjunlin 在上一篇文章中我们已经使用了像素法实现克里金插值的方式,但是问题也就随之抛了出来.1.第一点,在反距离权重插值的时候,因为处理的数据量大会直接导致主线程卡,导致用户体验 ...
- 基于主动学习和克里金插值的空气质量推测
基于主动学习和克里金插值的空气质量推测 常慧娟, 於志文, 於志勇, 安琦, 郭斌 西北工业大学计算机学院,陕西 西安 710072 福州大学数学与计算机科学学院,福建 福州 350108 摘要 ...
- gstat | 空间插值(四)——克里金插值之协同克里金和交叉验证
本篇是介绍克里金插值的第三篇推文,也是最后一篇. 因为前面两篇使用的数据中已知点的样本太少,本篇使用gstat工具包说明文档中的数据集.该数据集来自sp工具包. 实际上,gstat工具包的方法对sp和 ...
- gstat | 空间插值(三)——克里金插值之泛克里金和简单克里金
本篇接着上篇继续介绍克里金插值.首先加载相关工具包和上篇使用的示例数据: library(gstat) library(sf) library(tidyverse) library(readxl) l ...
- gstat | 空间插值(二)——克里金插值之普通克里金
说明:昨天的推文误把可吸入颗粒物当作PM2.5,实应该为PM10,这里修正后重发. 从本篇开始计划分三篇介绍克里金插值.与反距离权重插值不同,克里金插值是无偏估计,其中也涉及到模型估计.本篇先对普通克 ...
- ArcGIS中使用协同克里金插值(co-kriging interplotation )对气象数据插值
ArcGIS中如何使用协同克里金插值(co-kriging interplotation )对气象数据插值 ANUSPLIN气象站点数据插值局限性 百度搜索ArcGIS 克里金插值 搭建梯子搜索Arc ...
- 克里金插值---MATLAB程序
最近在研究克里金插值,拜读了@lanainluv的笔记,备受启发, 在这里做一些补充,并分享自己的代码,希望对各位有所帮助,有误的地方请批评指正!(有帮助的话点个赞吧~) @lanainluv的原文链 ...
- 克里金插值详细步骤_openlayers4 入门开发系列之前端动态渲染克里金插值 kriging 篇(附源码下载)...
前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...
- ArcGIS之克里金插值教学
本文来自:GIS科研实验室 基本概念 1.什么是克里金插值? 克里金插值又称空间局部插值法,是以半变异函数理论和结构分析为基础,在有限区域内对区域化变量进行无偏最优估计的一种方法,是地统计学的主要内容 ...
最新文章
- 俄克拉荷马州立大学冯锋组博士生招聘-植物与微生物互作
- python内置函数sorted(x)的作用是_Python内置filter与sorted函数
- 本地Run Page时报检测到意外的 URL 参数,它将被忽略。
- 【玩转cocos2d-x之九】动作类CCAction
- WKViewManager iOS 弹窗架构
- RAC环境数据库重启实例
- Mybatis异常There is no getter for property named ‘XXX‘ in ‘class java.lang.String‘
- 如何在 Mac 上的“照片”中更改和增强视频?
- SelectionKey 说 明
- 随笔——我悄悄地更新了我的博客
- C/C++语言经典、实用、趣味程序设计编程百例精解
- Python学习笔记—— 面向对象4.类属性、类方法、静态方法
- 如何在MAC上查看系统运行信息、内存使用率等
- 【密码学/密码分析】基于TMTO的密码分析方法
- 酷派大神F1移动版刷机教程卡刷教程
- 基于Zotero和坚果云的大规模文献同步管理环境配置及常用功能介绍(超详细)
- WIN7登陆界面去掉下面windows 7 旗舰版
- 哪些进销存软件既好用又免费?
- GO语言GET安装问题{cccccccccccccccccccc}
- 6.24:K60电源管理V5_最简版本蓄水池