功能介绍
- JTS(Java Topology Suite)是一套用于创建、操作和分析二维几何对象的Java库。JTS提供了丰富的几何操作和分析功能,是GIS(地理信息系统)应用中的重要工具。
- 本文章是根据一条不规则的线所画出一个多边形缓冲区,根据特定的范围,来核算点位是否存在于缓冲区内
- 更新1:返回点到线的最短距离
代码操作
起始操作代码,传入一条线上的经纬度和公里范围,需转换为度
String rs = "[[106.58088,29.552085], [106.593744,29.555824],[106.597697,29.568359],[106.595038,29.577186],[106.590726,29.574076]]";
JSONArray jsonArray = JSON.parseArray(rs);
//线对象
Geometry lineString = calculatedCache(jsonArray, degree);
//多边形对象
Geometry gf= calculatedCachePolygon(lineString ,1000);
//返回是否包含结果集、距离
List<Map<String,Object>> list = polygonsContain(lineString,bg,list)
此方法返回线对象结果集
/**
* 计算线对象
* @param coordinatesList 初始河流点位数据集 线对象
* @return
*/
public static Geometry calculatedCache(List<Object> coordinatesList) {
Coordinate[] coordinates4 = new Coordinate[coordinatesList.size()];
for (int i = 0; i < coordinatesList.size(); i++) {
Object positionList = coordinatesList.get(i);
List<BigDecimal> positionArr = (List<BigDecimal>) positionList;
double x = (new BigDecimal(String.valueOf(positionArr.get(0)))).doubleValue();
double y = (new BigDecimal(String.valueOf(positionArr.get(1)))).doubleValue();
coordinates4[i] = new Coordinate(x, y);
}
GeometryFactory gf = new GeometryFactory();
Geometry gfLineString = gf.createLineString(coordinates4);
return gfLineString ;
}
此方法根据传入的经纬度,计算出一个缓冲区多边形
/**
* 计算缓冲区多边形,返回数据结果让下一个方法调用
* @param coordinatesList 初始河流点位数据集
* @param meter 缓冲区范围值 米
* double degree = 100米 / (2 * Math.PI * 6371004) * 360; // 按米转化为度单位
* @return
*/
public static Geometry calculatedCachePolygon(Geometry gfLineString, double meter) {
double degree = meter / (2 * Math.PI * 6371004) * 360;
// 缓冲区建立
BufferOp bufOp = new BufferOp(gfLineString);
// 结束端点样式
bufOp.setEndCapStyle(BufferParameters.CAP_ROUND);
// 设置线段:象线段-闭合处线段数量,越大越想圆,但数据会越多,建议5-8
bufOp.setQuadrantSegments(5);
Geometry bg = bufOp.getResultGeometry(degree);
// bg.getArea(); 多边形面积
return bg;
}
此方法是返回多边形的经纬度点,用于在地图上画出多边形
/**
* 此方法用于返回多边形集合
* @param bg 多边形数据
* @return
*/
public static List<Map<String,Object>> polygonList(Geometry bg) {
Coordinate[] coordinates = bg.getCoordinates();
//返回的xy值集合
List<Map<String,Object>> listxy = new ArrayList();
for (Coordinate coordinate:coordinates) {
Map<String,Object> map = new HashMap<>();
map.put("x",coordinate.x);
map.put("y",coordinate.y);
listxy.add(map);
}
return listxy;
}
此方法用于判断传入点位是否在多边形里面,是否包含,如果包含则加入集合返回
/**
* 此方法用于返回多边形是否包含点位
* @param lineString 线对象
* @param bg 多边形数据
* @param list 要判断的点位数据
* @return
*/
public static List<Map<String,Object>> polygonsContain(Geometry lineString,Geometry bg,List<Map<String,Object>> list) {
//返回被包含的点位数据
List<Map<String,Object>> containList = new ArrayList<>();
//循环判断点位是否被包含
for (Map<String,Object> map:list) {
// 判断点是否在多边形内
Coordinate point = new Coordinate((Double) map.get("x"),(Double) map.get("y"));
PointLocator a = new PointLocator();
if(a.intersects(point, bg)){
//计算点到线的距离
PointPairDistance ppd = new PointPairDistance();
DistanceToPoint.computeDistance(lineString,point,ppd);
//结果度
double du = ppd.getDistance();
//转换米
double m = du/360* (2 * Math.PI * 6371004);
map.put("m",m);
containList.add(map);
}
}
return containList;
}