隔点预报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;
	}
	
	
	

}

好利用该思路,再进行测试个用例看看

 

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

哟~成功!!

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