做气象相关专题数据显示时,根据气象数据显示图层。需要用java来分析数据生成等值面图片,数据入库后发布矢量服务
在这里总结分享一下。
实现思路主要是 wContour分析等值数据,geotools用于转换分析结果和边界裁切,使用GDAL ogr2ogr入库,入库后使用geoserver发布矢量数据服务,针对等距二维数组数据可以做简单的抽稀。
数据库:postgresql+postgis
分析部分参考了java实现NC数据等值线等值面可视化
用到的第三方包:wContour(点击下载),geotools (SpringBoot通过maven引入)
结果效果:
广东省雷达效果图
![](https://img.haomeiwen.com/i15615530/7ce986dc4051e2fc.png)
主要步骤:
1.读取专题数据,构造对应二维数组数据,如需输出效果图片(提供等值对应颜色)
2.进行等值面分析,裁切(如果原数据为等距二维数组,不进行IDW插值计算,可对原数据进行简单抽稀,提供分析效率)
3.添加样式 透明度,颜色级别
4.输出效果图片
5.输出geoJson
6.读取geojson数据入库
直接上代码
一.原数据为等距网格数据,不需要IDW插值格网点
![](https://img.haomeiwen.com/i15615530/0838645d1d6dddb1.png)
二.等值面分析,做网格计算,并IDW插值计算
![](https://img.haomeiwen.com/i15615530/bac1aad6858d680f.png)
![](https://img.haomeiwen.com/i15615530/5cb90db715b923db.png)
三.Polygon转FeatureCollection
![](https://img.haomeiwen.com/i15615530/8f4ce3a501aa6ab6.png)
四.geotools创建FeatureCollection
![](https://img.haomeiwen.com/i15615530/a4f7bf3ddea2d1c2.png)
五.结果裁切
![](https://img.haomeiwen.com/i15615530/c7e5933b37181feb.png)
![](https://img.haomeiwen.com/i15615530/84aa55471f67be8d.png)
六.添加样式 透明度,颜色级别,featureCollection等值面图层
![](https://img.haomeiwen.com/i15615530/b416b4052c745df0.png)
七.根据四至坐标、长、宽像素获取地图内容,并生成图片
![](https://img.haomeiwen.com/i15615530/04bd8dc5017d8f4d.png)
八.输出保存GeoJson
![](https://img.haomeiwen.com/i15615530/72e2939fbe09d4c2.png)
九.执行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 (这里是入库的表名)
![](https://img.haomeiwen.com/i15615530/30e4fe00050045b6.png)
在这里,我补充一下抽稀的方法,由于是个小demo,只做了简单的抽取
![](https://img.haomeiwen.com/i15615530/84275e5135da8b38.png)
![](https://img.haomeiwen.com/i15615530/fc7589e795d33c8c.png)
![](https://img.haomeiwen.com/i15615530/61097495935f71b9.png)
![](https://img.haomeiwen.com/i15615530/b62e70eadc14f5b9.png)
测试代码,以气象温度举例子
气象温度对应颜色
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;
}
测试类
![](https://img.haomeiwen.com/i15615530/195618a281887140.png)
![](https://img.haomeiwen.com/i15615530/632990facf8ea0db.png)
裁切后保存的图片效果
![](https://img.haomeiwen.com/i15615530/059a067c36a739d0.png)
总结:从数据到图片效果,发布服务是一个比较长线的流程,针对这个过程后期会提供从源头到可配置化的气象专题方案。由于数据保密无法提供测试数据,以上是一个小demo,有不足之处请多多指教
网友评论