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

本文介绍了PostGIS中ST_Line_Interpolate_Point与ST_Line_Locate_Point的使用方法,并通过实例展示了如何利用这些方法进行地理编码,包括限制查询结果的距离范围。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天学习了postGIS中的两个很有用的方法:
  • ST_Line_Interpolate_Point

        geometry ST_Line_Interpolate_Point(geometry a_linestring, float a_fraction):返回线上内插的一个点

 

2011070513000833.png

返回线上20%处得一个点

2011070513025793.png

  • 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取出。

2011070513040294.png

 

 

返回给定点到线的最近点 

2011070513045782.png

       这两个方法对于地理编码(Geocoding)是很有用的,下面我就用上一篇导入的数据来做下试验:

       首先我这里用到了QGIS这个软件使查询结果可视化(另外OpenJUMP也可以查询可视化)

      1.首先添加图层

2011070514083668.png

2011070514155040.png

      2.添加完图层之后,就开始执行我们的查询了,这里用到了QGIS中的一个插件工具RT Sql Layer

2011070514184013.png

 这个插件工具需要另外下载安装:1)插件—>Fetch Python Plugins..

2011070514252279.png

                                       

                                          2)点击Fetch Python Plugins后找到RT Sql Layer  安装

2011070514261040.png

      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;

 2011070514352084.png

       4.得到如下结果:

2011070514373524.png

从图上就会看到 路上多了很多点,但是这个结果并不是我所要的,因为这样的结果是把路两边的很远的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;

2011070514465029.png

这样的结果就比较理想了,这里用到了ST_DWithin方法,这个方法也是很常用的,执行一些地物查找就会用到它。

注:如果你所用的POSTGIS是1.5+的话,ST_ClosestPoint将是一个更好的方法:

geometry ST_ClosestPoint(geometry g1, geometry g2),这个就简洁了许多,g1不局限于线,g2不局限于点。

2011070615295141.jpg

你可以用ST_ClosestPoint来替代ST_Line_Interpolate(ST_Line_Locate_Point ..  效果是一样的。

转载于:https://www.cnblogs.com/shitao/archive/2011/07/05/2098206.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值