隔點預報GRIB繪製等值線矢量圖問題分析(二)

         上一次用grib 繪製等值線矢量圖  https://my.oschina.net/umbrellall1/blog/4423342  時,發現繪製的時候有個嚴重bug,因爲我繪製GeoJson圖層的時候是從輕到重,所以繪製出來的圖形粗略看是沒問題但是通過地圖描繪就看到了存在一個bug.

       利用上次的代碼繪製出來的圖形是這個樣子的:

粗略一看是沒什麼問題但是對比地圖就會發現個問題

紅色框的部分應該鏤空的但是繪製出來的圖片卻是實體,所以問題大概是在繪製圖形上面出現問題了我繪製圖形採用的是Graphics2D 而Polygon 不支持帶孔的多邊形,所以問題就來了,如何來解決這個問題?

起初我是這樣想的先繪製圖形最後繪製鏤空的部分不就好了,於是修改了代碼運行效果:

嗯?孔到是出來了 中間的點卻被覆蓋了?怎麼回事?我把那個空的區域繪製出來看一下

原來geoJson 這個繪製的時候也是由於不支持帶孔的所以會把中間那幾個區域給覆蓋掉。

這條路不通啊。那如何來做呢?去網上搜索如何繪製有孔多邊形,經過搜索發現Polygon  單純繪製不出有孔的需要通過轉化Area 在通過Area的裁剪函數在來繪製就可以繪製出來

Area area = new Area(p);
Area area2 = new Area(p2);
area2.subtract(area)

既然可以繪製有孔的,那麼現在要解決的是在什麼情況下剪切什麼情況下繪製,我這邊試想一下如果 A = 空白區域,B = 圖形區域,如果A 在B 的範圍內那麼就需要把A 的空白區域繪製出來,如果A 區域 在B 區域範圍外那麼久將A區域裁剪一個B區域孔出來在進行繪製。那麼首先解決的是如何判斷A 是否在B 範圍內呢?

又經過一段時間搗鼓出一段代碼

/***
	 * 單線程跑
	 * a 多邊形座標
	 * b  多邊形座標
	 * */
	public static OverlapModel isOverlap2(JSONArray a,JSONArray b){
		OverlapModel temp = new OverlapModel();
		temp.setFlg(false);
		Point[] ps = getPoint(a);
		JSONArray coordinate = b.getJSONArray(0);
		for (int i = 0; i < coordinate.size(); i++) {
			JSONArray point = coordinate.getJSONArray(i);
			// 獲取點的地理經度
			double lon = point.getDouble(0);
			// 獲取點的地理緯度
			double lat = point.getDoubleValue(1);
			double[] result = transferCoord(new double[] { lon, lat });
			if(isPtInPoly(result[0] ,result[1] , ps)) {
				 temp.setFlg(true);
				 temp.setType(1);
				 break;
			}
		}
		if(!temp.isFlg()) {
			ps = getPoint(b);
			coordinate = a.getJSONArray(0);
			for (int j = 0; j < coordinate.size(); j++) {//遍歷座標
				JSONArray point = coordinate.getJSONArray(j);
				// 獲取點的地理經度
				double lon = point.getDouble(0);
				// 獲取點的地理緯度
				double lat = point.getDoubleValue(1);
				double[] result = transferCoord(new double[] { lon, lat });
				if(isPtInPoly(result[0] ,result[1] , ps)) {
					 temp.setFlg(true);
					 temp.setType(2);
					 break;
				}
			}
		}
		return temp;
	}
	

OverlapModel:

package com.geojson.model;

public class OverlapModel {
	//是否包含
	private boolean  flg;
	// 1:A包含於B 2:A在B內部
	private int type;

	public boolean isFlg() {
		return flg;
	}

	public void setFlg(boolean flg) {
		this.flg = flg;
	}

	public int getType() {
		return type;
	}

	public void setType(int type) {
		this.type = type;
	}
	
	
	

}

好利用該思路,再進行測試個用例看看

 

嗯可以,然後在跑一道程序看看效果

喲~成功!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章