//识别面:判断面是否与边界相交。FeatureCollection fc边界, SimpleFeatureCollection gs预警区域多边形
public static FeatureSource identifyRegionFeatureCollectionReversal(SimpleFeatureCollection bdyfeatures, SimpleFeatureCollection warnfeatures) {
long startTime = System.currentTimeMillis();// 开始时间
FeatureSource cs = null;
try {
List<Map<String, Object>> values = new ArrayList<Map<String, Object>>();
// 多边形(预警区域多边形)
FeatureIterator bdyFeatureIterator = bdyfeatures.features();
String fields = "crs:4326,the_geom:MultiPolygon,";
Integer isAllFields = 0;
// 迭代读取数据记录(边界循环187个)
while (bdyFeatureIterator.hasNext()) {
// 数据下一条数据
Feature bdyFeature = bdyFeatureIterator.next();
// 数据"the_geom"属性的值
if(bdyFeature.getProperty("the_geom") == null || bdyFeature.getProperty("the_geom").getValue() == null) continue;
Geometry bdyGeometry = (Geometry) bdyFeature.getProperty("the_geom").getValue();
if(!bdyGeometry.isValid() && !bdyGeometry.buffer(0).toString().equals("POLYGON EMPTY")){
//System.out.println(bdyFeature.getProperty("PAC").getValue() + "行政区划边界范围bdyGeometry:是无效的,buffer(0)修复几何。" + "\r\n");
bdyGeometry = bdyGeometry.buffer(0);
}
// 预警区域数据(预警循环1410个)
FeatureIterator warnFeatureIterator = warnfeatures.features();
while (warnFeatureIterator.hasNext()) {
//获取行政区划边界信息
Feature warnFeature = warnFeatureIterator.next();
if(warnFeature.getProperty("geometry") == null || warnFeature.getProperty("geometry").getValue() == null) continue;
Geometry warnGeometry= (Geometry) warnFeature.getProperty("geometry").getValue();
try{
//(2)这里需要修改为,将相交的部分保存出去,并可以计算他的面积信息
//查询多边形的有效性
if(!warnGeometry.isValid() && !warnGeometry.buffer(0).toString().equals("POLYGON EMPTY")){
//System.out.println("预警范围warnGeometry:是无效的,buffer(0)修复几何。" + "\r\n");
warnGeometry = warnGeometry.buffer(0);
}
//判断当前预警区域warnGeometry与行政区划boundaryGeometry是否相交
if (warnGeometry.intersects(bdyGeometry)) {
Map<String, Object> map = new HashMap<String, Object>();
//(1)这个以前是将相交的行政区划的边界,全部都存储起来,
//map.put("the_geom", boundaryGeometry);
//求相交之后的区域
//Geometry intersectGeom = bdyGeometry.intersection(warnGeometry);
//反转一下
Geometry intersectGeom = warnGeometry.intersection(bdyGeometry);
map.put("the_geom", intersectGeom);
//将行政区划boundaryFeature的其他属性信息,存入到最新的属性信息中
Iterator<Property> iterator1 = warnFeature.getProperties().iterator();
while(iterator1.hasNext())
{
String key = iterator1.next().getName().toString();
if(key !="geometry"){
map.put(key, warnFeature.getProperty(key).getValue().toString());
if(isAllFields==0){
fields=fields+key+":String,";
}
}
}
//将预警区域warnFeature的其他属性信息,存入到最新的属性信息中
Iterator<Property> iterator2 = bdyFeature.getProperties().iterator();
while(iterator2.hasNext())
{
String key = iterator2.next().getName().toString();
if(key !="the_geom"){
map.put(key, bdyFeature.getProperty(key).getValue().toString());
if(isAllFields==0){
fields=fields+key+":String,";
}
}
}
values.add(map);
isAllFields=1;
}
}
catch (Exception e){
System.out.println(bdyFeature.getProperty("PAC").getValue() + "抛出异常,当前的两个Geometry无法执行相交计算" + "\r\n");
}
}
warnFeatureIterator.close();
}
bdyFeatureIterator.close();
//System.out.println("反转--对行政区划进行裁剪和文字识别:"+(System.currentTimeMillis()-startTime));
// 数据再次组合的开始时间
startTime = System.currentTimeMillis();
if(values.size()==0){
return null;
}
SimpleFeatureCollection sc = FeaureUtil.creatSimpleFeatureByFeilds("polygons",
fields, values);
cs = FeaureUtil.creatFeatureSourceByCollection(sc);
//System.out.println("反转--再次组装的时间输出:"+(System.currentTimeMillis()-startTime));
} catch (Exception e) {
//e.printStackTrace();
return cs;
}
return cs;
}
识别面:判断面是否与边界相交。FeatureCollection fc边界, SimpleFeatureCollection gs预警区域多边形
最新推荐文章于 2024-03-21 17:27:58 发布