需求分析
我们在做webgl的时候经常会遇到这样的需求,计算给定航路的拥堵情况,不同的拥堵显示不同的颜色,航路截取计算等等。基于这类问题统一都可以使用LineString进行处理
实现思路
如上图所示,航路是几个关键的点然后练成线,如果要实现上述的需求,就需要把每段航路进行划分成为线段,然后计算通过处理每个线段,最后汇总数据得到结果。
实现
下面是实现方案
- 首先拿到所有的线段的经纬度的点
- 通过calculator.getGeodeticPath(i);的截断方法获取起点和终点的截断
- 根据截断得到新的LineString
- 实现了把一个航路分段成多个小段
- 然后计算点到线段的距离知道每个线段的数量就可以实现线段变色了
/**
* 分段算法
* @param pointList
* @return
*/
public List<LineString> getRouteSegment(List<RoutePointDTO> pointList) {
List<LineString> lineStrings = new ArrayList<>();
for (int i = 0; i < pointList.size()-1; i++) {
RoutePointDTO startRoute = pointList.get(i);
RoutePointDTO endRoute = pointList.get(i+1);
Coordinate start = new Coordinate(startRoute.getLongitude(), startRoute.getLatitude(),
startRoute.getHeight());
log.debug("开始的位置:{}",start);
Coordinate end = new Coordinate(endRoute.getLongitude(),endRoute.getLatitude(),
endRoute.getHeight());
log.debug("结束的位置:{}",end);
List<Point2D> point2DS = GeoTools.point2DList(start, end, 5000);
for (int j = 0; j < point2DS.size()-1; j++) {
Point2D startPoint = point2DS.get(j);
Point2D endPoint = point2DS.get(j + 1);
Coordinate[] coordinates = new Coordinate[]{
new Coordinate(startPoint.getX(),startPoint.getY(),start.z),
new Coordinate(endPoint.getX(),endPoint.getY(),end.z)
};
LineString lineString = GeometryUtil.createLineString(coordinates);
lineStrings.add(lineString);
log.debug("截取后的:{}", Arrays.toString(coordinates));
}
}
return lineStrings;
}