做氣象相關專題數據顯示時,根據氣象數據顯示圖層。需要用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,有不足之處請多多指教