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 ..? 效果是一樣的。
轉載于:https://www.cnblogs.com/shitao/archive/2011/07/05/2098206.html
總結
以上是生活随笔為你收集整理的Introduction to PostGIS 之线性参考、地理编码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学会使用svn:externals
- 下一篇: 利用 MySQL bin-log 恢复数