PostGIS之线性参考
1. 概述
PostGIS 是PostgreSQL数据库一个空间数据库扩展,它添加了对地理对象的支持,允许在 SQL 中运行空间查询
PostGIS官网:About PostGIS | PostGIS
PostGIS官方教程:PostGIS 简介 — Introduction to PostGIS
PostGIS相关教程:文章目录汇总 - 知乎 (zhihu.com)
本文基于官方教程描述PostGIS中的线性参考
数据准备可参考:
数据介绍可参考:
2. 线性参考
2.1 定义与用途
线性参考,ArcGIS文档中是这样定义的:线性参考是使用沿测量的线状要素的相对位置存储地理位置的方法
一个很常见的例子就是GPS轨迹,如下图,通常GPS轨迹是在道路上产生的,由于误差和精度问题,轨迹点往往是在道路两侧:

根据实际,GPS轨迹点应该是在路网上的,所以,需要以路网为参考,对GPS轨迹点纠偏,将轨迹点放到路网上,利用路网的相对位置存储GPS轨迹点,这就是线性参考

2.2 创建线性参考
计算某个点在一个线段(LineString)中的相对位置,主要使用的函数有:
- ST_LineLocatePoint (a_linestring, a_point) Returns the fractional location of the closest point on a line to a point
比如计算线段LINESTRING(0 0, 2 2)上(1, 1)和(0, 2)的相对位置:
-- Simple example of locating a point half-way along a line
SELECT ST_LineLocatePoint('LINESTRING(0 0, 2 2)', 'POINT(1 1)');
-- Answer 0.5
-- What if the point is not on the line? It projects to closest point
SELECT ST_LineLocatePoint('LINESTRING(0 0, 2 2)', 'POINT(0 2)');
-- Answer 0.5
可以看到,如果点不在线段上,它会投影到离它最近的线段上的点,再计算相对位置
2.3 还原线性参考
有了线性参考值,知道了它的相对位置,就可以还原出它所在的点,主要使用的函数有:
- ST_LineInterpolatePoint (a_linestring, a_fraction) Returns a point interpolated along a line at a fractional location
比如,利用上面求的线性参考值0.5,还原POINT在线段LINESTRING(0 0, 2 2)上的位置:
-- Simple example of locating a point half-way along a line
SELECT ST_AsText(ST_LineInterpolatePoint('LINESTRING(0 0, 2 2)', 0.5));
-- Answer POINT(1 1)
可以看到,利用线性参考值0.5,就记录了POINT(1 1)的位置,当然,这也说明,使用线性参考记录的点,必须在线段上
2.4 路网匹配
通过上述的例子,很自然的就想到了一个应用:路网匹配
路网匹配是基于位置服务中的关键预处理步骤,它将GPS轨迹点匹配到实际路网上,以此为基础对数据进行分析和挖掘,能够辅助解决城市计算中相关问题,例如建立智能交通系统、协助用户规划出行
在这里进行扩展,基于nyc数据集,将公交站点数据匹配到路网上
比如,原始数据上,公交站点是和路网之间是存在偏离的:

站点匹配的第一步,找到每个站点和其最近的路段:
-- 1. 建立一个临时表,按站点ID和街道距离排序
CREATE TABLE station_nearest_street AS
SELECT nyc_subway_stations.gid AS stations_gid,
nyc_streets.gid AS streets_gid,
nyc_subway_stations.geom AS stations_geom,
ST_GeometryN(nyc_streets.geom, 1) AS streets_geom,
ST_Distance(nyc_subway_stations.geom, nyc_streets.geom) AS distance
FROM nyc_streets
JOIN nyc_subway_stations
ON ST_DWithin(nyc_subway_stations.geom, nyc_streets.geom, 200)
ORDER BY stations_gid, distance ASC;

第二步,建立线性参考值:
-- 2. 选取每个站点最近的街道(即每个stations_gid的第一条记录)计算线性参考值表
CREATE TABLE stations_ref AS
SELECT DISTINCT ON (stations_gid)
stations_gid,
streets_gid,
ST_LineLocatePoint(streets_geom, stations_geom) AS reference,
distance
FROM station_nearest_street;

第三步,还原线性参考值到路网上:
-- 3. 利用线性参考值与街道路网还原站点
CREATE TABLE stations_reduction AS
SELECT stations_gid,
streets_gid,
ST_LineInterpolatePoint(ST_GeometryN(nyc_streets.geom, 1), reference) AS geom
FROM stations_ref
JOIN nyc_streets
ON streets_gid = nyc_streets.gid;

使用QGIS加载匹配后的公交站点:

可以看到,公交站点已经被匹配到路网上,另外,利用线性参考表stations_ref,有效记录了公交站点数据
3. 参考资料
[2]PostGIS教程十七:线性参考 - 知乎 (zhihu.com)
[5]基于PostGIS的高级应用(3)--线性参考-阿里云开发者社区 (aliyun.com)
[6]什么是线性参考?—ArcMap | 文档 (arcgis.com)
PostGIS之线性参考的更多相关文章
- Linear Referencing Tools(线性参考工具)
线性参考工具 # Process: 创建路径 arcpy.CreateRoutes_lr("", "", 输出路径要素类, "LENGTH" ...
- PostgreSQL+PostGIS的使用 函数清单
一. PostgreSQL与PostGIS的关系 PostgreSQL 是世界上技术最先进的开源数据库,其前身是1977年一个源于Berkeley名为Ingres的非关系型数据库,其项目领导人为Mic ...
- PostGis常用函数中文介绍
记录常用PostGis常用函数: 1.OGC标准函数 管理函数: 添加几何字段 AddGeometryColumn(, , , , , ) 删除几何字段 DropGeometryColumn(, , ...
- PostGIS官方教程汇总目录
一.PostGIS介绍 二.PostGIS安装 三.创建空间数据库 四.加载空间数据 五.数据 六.简单的SQL语句 七.几何图形(Geometry) 八.关于几何图形的练习 九.空间关系 十.空间连 ...
- PostGIS 常用函数中文介绍说明
1.OGC标准函数 管理函数: 添加几何字段 AddGeometryColumn(, , , , , ) 删除几何字段 DropGeometryColumn(, , ) 检查数据库几何字段并在geom ...
- [第四篇] PostGIS:“我让PG更完美!”
概要 本篇文章主要分为几何图形处理函数.仿生变换函数.聚类函数.边界分析函数.线性参考函数.轨迹函数.SFCGAL 函数.版本函数这八部分. Geometry Processing ST_Buffer ...
- 线性参照,M值的相关测试
怎样使用普通线要素获取带M值的线要素 怎样查看线要素各个折点上的M值,怎样导出为一张表 线性参照:http://resources.arcgis.com/zh-cn/help/main/10.2/in ...
- 使用pgrouting进行最短路径搜索
PgRouting是基于开源空间数据库PostGIS用于网络分析的扩展模块,最初它被称作pgDijkstra,因为它只是利用Dijkstra算法实现最短路径搜索,之后慢慢添加了其他的路径分析算法 ...
- 这13个开源GIS软件,你了解几个?【转】
泰伯网有看点的空间地理信息资讯都在这,你还在等什么? 这些开源GIS软件,你了解几个?本文内容部分来源于一份罗列了关于GIS软件应用的文章,笔者将其编译整合. 地理信息系统(Geographic In ...
- 13个开源GIS软件 你了解几个?
地理信息系统(Geographic Information System,GIS)软件依赖于覆盖整个地球的数据集.为处理大量的 GIS 数据及其格式,编程人员创建了若干开源库和 GIS 套件. GIS ...
随机推荐
- 【每日一题】【优先队列、迭代器、lambda表达式】2022年1月15日-NC119 最小的K个数
描述 给定一个长度为 n 的可能有重复值的数组,找出其中不去重的最小的 k 个数.例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4(任意顺序皆可). 数据范围: ...
- Win10系统安装U盘,安装纯净版Win10的通用教程
安装前准备:1.准备8G或8G以上U盘(32G以内).2.制作U盘会格式化U盘,U盘内的重要文件也要事先备份好.操作步骤:1.打开微软下载WIN10网址:(如果网址无法打开,可以下载解压运行附件内的工 ...
- 1+x初级Web的关键词填写
H5+CSS: 声明HTML网页标准:<!DOCTYPE> 图片标签 img css颜色样式color 定位 position 绝对absolute 相对 relative 外边距:mar ...
- VuePress个人博客搭建
vuepress概述 VuePress 由两部分组成:第一部分是一个极简静态网站生成器 (opens new window),它包含由 Vue 驱动的主题系统和插件 API,另一个部分是为书写技术文档 ...
- Js/Jq 截图并上传
今天想做一个 Js + Jq 截取网页图并上传到后端,经过一番折腾最终达到了效果. 1·首先需要用到一个非常强大的外部依赖库 html2canvas html2canvas 官网:html2canva ...
- 洛谷P6599 「EZEC-2」异或【题解】
题目大意 有\(T\)组数据,每组数据给定两个\(l,n\in\mathbb{N*}\),构造一个长为\(l\),每个元素不超过\(n\)的数组 令他为\(a\),要使 \[\sum_{i=1}^l\ ...
- VUE基础之:visible.sync-模态框显示隐藏、elementUI dialog组件报错或者visible属性不生效问题
VUE基础之:visible.sync-模态框显示隐藏.elementUI dialog组件报错或者visible属性不生效问题 这篇文档存成草稿2年了,最近终于有时间拉出来写完了.... 我们日常开 ...
- 模板层语法、模板层之标签、模板的继承与导入、模型层之ORM常见关键字
模板层语法.模板层之标签.模板的继承与导入.模型层之ORM常见关键字 一.模板层语法 1.模板语法的传值 urls代码: path('modal/', views.modal) views代码: de ...
- Linux环境下:程序的链接, 装载和库[静态链接]
看以下例子 main.c extern int x; int main() { int y = 100; swap(&x,&y); return 0; } int x = 1; voi ...
- Java JDK1.5: 泛型 新特性的讲解说明
Java JDK1.5: 泛型 新特性的讲解说明 每博一文案 听到过这样一句话:"三观没有标准.在乌鸦的世界里,天鹅也有罪." 环境.阅历的不同,造就了每个人独有的世界观.人生观. ...