JAVA 通過wContour和geotools實現等值面分析、裁切、出圖、入庫、抽稀

做氣象相關專題數據顯示時,根據氣象數據顯示圖層。需要用java來分析數據生成等值面圖片,數據入庫后發布矢量服務

在這里總結分享一下。

實現思路主要是 wContour分析等值數據,geotools用于轉換分析結果和邊界裁切,使用GDAL ogr2ogr入庫,入庫后使用geoserver發布矢量數據服務,針對等距二維數組數據可以做簡單的抽稀。

數據庫:postgresql+postgis

分析部分參考了java實現NC數據等值線等值面可視化

用到的第三方包:wContour(點擊下載),geotools (SpringBoot通過maven引入)

結果效果:

廣東省雷達效果圖


主要步驟:

1.讀取專題數據,構造對應二維數組數據,如需輸出效果圖片(提供等值對應顏色)

2.進行等值面分析,裁切(如果原數據為等距二維數組,不進行IDW插值計算,可對原數據進行簡單抽稀,提供分析效率)

3.添加樣式 透明度,顏色級別

4.輸出效果圖片

5.輸出geoJson

6.讀取geojson數據入庫

7.GeoServer發布PostGis數據

直接上代碼

一.原數據為等距網格數據,不需要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,有不足之處請多多指教

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
禁止轉載,如需轉載請通過簡信或評論聯系作者。

推薦閱讀更多精彩內容