由于网上的这个报错有点少且出bug的代码不太相同,所以我在此记录一下。
报错展示:
之前坐标数据量少,没发现什么问题,当数据量一增大,就报错了
java.lang. IllegalArgument异常:LinearRing中的点数无效(发现2 -必须为0或>= 4)
报错原因:
根据提示,当我们用GeometryFactory()去构建Polygon多边形的时候,点数points必须为0或者大于等于4,这是因为LinearRing是一个闭合的线性环,由它我们再来构建多边形Polygon,要求点数必须为0或者大于等于4才能构建,所以当点数大于0小于4的时候,无法构建出LinearRing。
解决方法:
增加判断方法:
/**
* 判斷 -- 是否是闭合的(Polygon)
* @param coords
* @return
*/
public static boolean isClosed(Coordinate coords[]){
/**
* 闭合条件
* 1.点(坐标)数组不等于空
* 2.点(坐标)数组至少含4个元素(>=4 or >3 -- 最基本的闭合多边形是---> 三角形)
* 3.点(坐标)数组首尾元素相当(关键条件,所谓的闭合,也就是首尾点是同一个点,绕了一圈又绕回来了才称之为闭合)
*/
return coords!=null && coords.length>3 && coords[0].equals(coords[coords.length-1]);
}
将原来直接构建Polygon多边形的方法,从直接构建
Coordinate[] coordinates = new Coordinate[rangeArray.size()];
...
...
...(省略若干代码)
Geometry geometry = new GeometryFactory().createPolygon(coordinates);
变成(增加个判断)
Coordinate[] coordinates = new Coordinate[rangeArray.size()];
...
...
...(省略若干代码)
Geometry geometry;
GeometryFactory geometryFactory = new GeometryFactory();
if (isClosed(coordinates)){
//如果是闭合的多边形
geometry = geometryFactory.createPolygon(coordinates);
}else {
if(coordinates.length==1){
//如果坐标数组就一个元素的话,除了Point,我想不到其他Geometry
geometry = geometryFactory.createPoint(coordinates[0]);
}else{
//否则的话,不闭合也不是点,那么它只能是线了--- LineString
geometry =geometryFactory.createLineString(coordinates);
}
}
ok了。
参考文章:
构建Polygon多边形的时候提示 -- Invalid number of points in LinearRing (found 3 - must be 0 or >= 4)-CSDN博客