Introduction to PostGIS 之线性参考、地理编码

今天学习了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 ..  效果是一样的。

原文地址:https://www.cnblogs.com/shitao/p/2098206.html