Introduction to PostGIS 之线性参考、地理编码
- ST_Line_Interpolate_Point
geometry ST_Line_Interpolate_Point(geometry a_linestring, float a_fraction):返回线上内插的一个点
返回线上20%处得一个点
- ST_Line_Locate_Point
float ST_Line_Locate_Point(geometry a_linestring, geometry a_point):返回a_point离a_linestring在上最近的点位置(这个位置表示为一个0到1浮点数)。点具体的位置我们可以使用前面介绍的ST_Line_Interpolate_Point取出。
返回给定点到线的最近点
这两个方法对于地理编码(Geocoding)是很有用的,下面我就用上一篇导入的数据来做下试验:
首先我这里用到了QGIS这个软件使查询结果可视化(另外OpenJUMP也可以查询可视化)
1.首先添加图层
2.添加完图层之后,就开始执行我们的查询了,这里用到了QGIS中的一个插件工具RT Sql Layer
这个插件工具需要另外下载安装:1)插件—>Fetch Python Plugins..
2)点击Fetch Python Plugins后找到RT Sql Layer 安装
3.安装完插件后 点击RT Sql Layer 连接到数据库island,然后点击Query Builder,在弹出的窗体中输入如下查询语句:
SELECT ST_Line_Interpolate_Point(
ln.the_geom,
ST_Line_Locate_Point(
ln.the_geom,
pt.the_geom
)
)
FROM road as ln, features as pt;
4.得到如下结果:
从图上就会看到 路上多了很多点,但是这个结果并不是我所要的,因为这样的结果是把路两边的很远的features都拉过来了。所以要做下限制,只返回离道路一定距离的点,执行以下SQL:
SELECT DISTINCT ON (pt.gid)
pt.name AS pt_name,
pt.gid AS pt_id,
ST_Line_Interpolate_Point(
ln.the_geom,
ST_Line_Locate_Point(ln.the_geom, pt.the_geom)
) As snapped_point
FROM
features AS pt INNER JOIN
road AS ln
ON
ST_DWithin(pt.the_geom, ln.the_geom, 0.004)
ORDER BY
pt.gid;
这样的结果就比较理想了,这里用到了ST_DWithin方法,这个方法也是很常用的,执行一些地物查找就会用到它。
注:如果你所用的POSTGIS是1.5+的话,ST_ClosestPoint将是一个更好的方法:
geometry ST_ClosestPoint(geometry g1, geometry g2),这个就简洁了许多,g1不局限于线,g2不局限于点。
你可以用ST_ClosestPoint来替代ST_Line_Interpolate(ST_Line_Locate_Point .. 效果是一样的。