GIS+RS应用

PostGIS实现路径等间距插值方法

2022-08-19  本文已影响0人  忘我怎么解

1 简介

在业务上要实现一条路径等间距插值点的位置信息,便于后端给前端实时推送。

2 技术路线

利用PostGIS函数ST_LineInterpolatePoint实现在LineString上指定位置插入点对象,并返回插入点。

geometry  ST_LineInterpolatePoint(geometry  aLinestring , float8  aFraction);

3 实现方法

    @Query(value = "SELECT ST_AsText(ST_LineInterpolatePoint(geom, ?1)) FROM (SELECT ?2 \\:\\: geometry as geom) As insert_point ;",
            nativeQuery = true)
    String findDataByDistance(float percent, String route);
public class RouteService {
    protected Logger logger =  LoggerFactory.getLogger(this.getClass());

    private static final DataConvertTools cv = new DataConvertTools();

    @Autowired
    private TblTestRepository tblTestRepository;

    public List<String> getPointByDistance(double length, int distance, String routePath) {
        List<String> pointList = new ArrayList<>();
        for(int dis = 0;dis < length;dis++){
            float percent;
            if(length-dis >= distance){
                Double doubleValue = dis/length;
                percent = doubleValue.floatValue();
                dis+=distance;
            }else{
                percent = 1f;
            }
            String point = tblTestRepository.findDataByDistance(percent,routePath);
            pointList.add(point);
        }
        return pointList;
    }
}
@CrossOrigin
@RestController
@RequestMapping("/route")
@Api(value = "获取路径等距离点Controller", tags = "获取路径等距离点接口")
public class RouteController extends BaseController{

    @Autowired
    private RouteService routeService;

    @RequestMapping(value = "/getPointByDistance", method = RequestMethod.POST)
    @ApiOperation(value = "根据间距获取路径插值点",notes = "routePath类似于:LINESTRING(0 0,2 2)")
    public List<String> queryByPeriod(@RequestParam(value="length") double length, @RequestParam(value="distance") int distance, @RequestParam(value="routePath") String routePath) {
        return routeService.getPointByDistance(length,distance,routePath);
    }
}
上一篇 下一篇

猜你喜欢

热点阅读