如何用R验证Point是否沿LineString并计算路段占比与距离?
LineString上最近点的距离与占比计算方案
核心函数用法
要获取站点对应道路上最近点的占比及距离,关键用PostGIS的ST_Line_Locate_Point函数——它直接返回最近点在LineString上的线性参考比例(范围0到1,0为起点,1为终点),配合ST_Length就能算出实际距离。
完整SQL示例
假设你有两张业务表:
stations:包含id(站点编号)、geom(站点Point)、road_id(关联道路的ID)roads:包含id(道路编号)、geom(道路LineString)
执行以下查询即可生成目标表格:
SELECT s.id AS 站点编号, ROUND(ST_Distance(s.geom, r.geom)::NUMERIC, 2) AS 站点到道路距离, ROUND(ST_Line_Locate_Point(r.geom, ST_NearestPoint(r.geom, s.geom))::NUMERIC, 4) AS 最近点占比, ROUND((ST_Line_Locate_Point(r.geom, ST_NearestPoint(r.geom, s.geom)) * ST_Length(r.geom))::NUMERIC, 2) AS 最近点到起点距离 FROM stations s JOIN roads r ON s.road_id = r.id;
两项检查的过滤逻辑
在上述查询基础上添加WHERE子句,即可实现规则过滤:
- 邻近性检查:设置距离阈值,比如只保留距离道路5米以内的站点:
WHERE ST_Distance(s.geom, r.geom) < 5 - 边界检查:排除靠近道路端点的站点,比如排除占比在0.05(5%)以内或0.95(95%)以上的点:
两个条件可结合使用:WHERE ST_Line_Locate_Point(r.geom, ST_NearestPoint(r.geom, s.geom)) BETWEEN 0.05 AND 0.95WHERE ST_Distance(s.geom, r.geom) < 5 AND ST_Line_Locate_Point(r.geom, ST_NearestPoint(r.geom, s.geom)) BETWEEN 0.05 AND 0.95
关键函数说明
ST_Line_Locate_Point(linestring, point):自动计算点到LineString的最近点,并返回该点在LineString上的比例值,无需手动先调用ST_NearestPoint(显式调用也不影响结果)。ST_Length(linestring):返回LineString的总长度,乘以比例值就能得到最近点到起点的实际距离。
内容的提问来源于stack exchange,提问作者Geoffrey Yip
相关产品推荐
相关产品推荐

