做气象相关专题数据显示时,根据气象数据显示图层。需要用java来分析数据生成等值面图片,数据入库后发布矢量服务
在这里总结分享一下。
实现思路主要是 wContour分析等值数据,geotools用于转换分析结果和边界裁切,使用GDAL ogr2ogr入库,入库后使用geoserver发布矢量数据服务,针对等距二维数组数据可以做简单的抽稀。
数据库:postgresql+postgis
分析部分参考了java实现NC数据等值线等值面可视化
用到的第三方包:wContour(点击下载),geotools (SpringBoot通过maven引入)
结果效果:
广东省雷达效果图
主要步骤:
1.读取专题数据,构造对应二维数组数据,如需输出效果图片(提供等值对应颜色)
2.进行等值面分析,裁切(如果原数据为等距二维数组,不进行IDW插值计算,可对原数据进行简单抽稀,提供分析效率)
3.添加样式 透明度,颜色级别
4.输出效果图片
5.输出geoJson
6.读取geojson数据入库
直接上代码
一.原数据为等距网格数据,不需要IDW插值格网点
二.等值面分析,做网格计算,并IDW插值计算
三.Polygon转FeatureCollection
四.geotools创建FeatureCollection
五.结果裁切
六.添加样式 透明度,颜色级别,featureCollection等值面图层
七.根据四至坐标、长、宽像素获取地图内容,并生成图片
八.输出保存GeoJson
九.执行Ogr2Ogr命令GeoJson数据入库
ogr2ogr -f 'PostgreSQL' PG:'host=192.168.1.65 port=5413 user=postgres password=***** dbname=db_test schemas=public' \
/Users/***/Downloads/geojson.json \
-nlt CONVERT_TO_LINEAR \
-dim XY \
-overwrite -progress --config OGR_ORGANIZE_POLYGONS ONLY_CCW --config SHAPE_ENCODING 'UTF-8' -nlt PROMOTE_TO_MULTI -nln vector_temp (这里是入库的表名)
在这里,我补充一下抽稀的方法,由于是个小demo,只做了简单的抽取
测试代码,以气象温度举例子
气象温度对应颜色
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 气象温度颜色对应枚举
*
* @author hxd
*/
public enum TempColorEnum {
T_5(5, "#81a8ff"),
T_10(10, "#81a8ff"),
T_15(15, "#81fbff"),
T_17(17, "#81ffbc"),
T_19(19, "#99ff81"),
TC_21(21, "#d1ff81"),
TC_23(23, "#fffa7a"),
TC_25(25, "#fff000"),
TC_30(30, "#ffde00"),
TC_35(35, "#ffa318"),
TC_37(37, "#ff6600"),
TC_39(39, "#ff0000")
;
TempColorEnum(double value, String color) {
this.value = value;
this.color = color;
}
/**
* 开氏度=摄氏度+273.15
*/
private double value;
/**
* 温度对应颜色
*/
private String color;
public double getValue() {
return value;
}
public String getColor() {
return color;
}
/**
* 摄氏度数组
*
* @return
*/
public static double[] getValueArray() {
int length = TempColorEnum.values().length;
double[] tempArray = new double[length];
int i = 0;
for (TempColorEnum anEnum : TempColorEnum.values()) {
tempArray[i++] = anEnum.value;
}
return tempArray;
}
/**
* 温度对应颜色Map
*
* @return
*/
public static Map<Double, String> getValueColorMap() {
Map<Double, String> map = new LinkedHashMap<>();
for (TempColorEnum anEnum : TempColorEnum.values()) {
map.put(anEnum.value, anEnum.getColor());
}
return map;
}
测试类
裁切后保存的图片效果
总结:从数据到图片效果,发布服务是一个比较长线的流程,针对这个过程后期会提供从源头到可配置化的气象专题方案。由于数据保密无法提供测试数据,以上是一个小demo,有不足之处请多多指教