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 ...
随机推荐
- 【大数据课程】高途课程实践-Day03:Scala实现商品实时销售统计
〇.概述 1.实现内容 使用Scala编写代码,通过Flink的Source.Sink以及时间语义实现实时销量展示 2.过程 (1)导包并下载依赖 (2)创建数据源数据表并写⼊数据 (3)在Mysql ...
- 【实时数仓】Day04-DWS层业务:DWS设计、访客宽表、商品主题宽表、流合并、地区主题表、FlinkSQL、关键词主题表、分词
一.DWS层与DWM设计 1.思路 之前已经进行分流 但只需要一些指标进行实时计算,将这些指标以主题宽表的形式输出 2.需求 访客.商品.地区.关键词四层的需求(可视化大屏展示.多维分析) 3.DWS ...
- 【HBase】简介、结构、数据模型、快速入门部署、shell操作、架构原理、读写数据流程、数据刷写、压缩、分割、Phoenix、表的映射、与hive集成、优化
一.简介 1.定义 分布式.可扩展.支持海量数据存储的NoSQL数据库 2.数据模型 2.1逻辑结构 2.2物理存储结构 2.3数据模型介绍 Name Space:相当于数据库,包含很多张表 Regi ...
- 【JUC】循环屏障CyclicBarrier详解
欢迎关注专栏[JAVA并发] 前言 jdk中提供了许多的并发工具类,大家可能比较熟悉的有CountDownLatch,主要用来阻塞一个线程运行,直到其他线程运行完毕.而jdk还有一个功能类似并发工具类 ...
- [攻防世界][江苏工匠杯]unseping
打开靶机对应的url 上来就是代码审计 <?php highlight_file(__FILE__); class ease{ private $method; private $args; f ...
- 5、Idea同时选择多处光标进行编辑
1.按住Alt+Shift,然后用鼠标左键点击文本,可以让光标在多个位置出现2.每个光标都会同时输入你正在输入的文本3.ESC退出 搜索 复制
- vue 中安装并使用echart
本文为博主原创,转载请注明出处: 1.安装echart 依赖: 安装命令: npm install echarts --save 在vscode 的终端窗口进行执行,如图所示: 执行完之后,查看 项目 ...
- dfs 返回值用bool相对void会快一点
力扣 剑指 Offer 12. 矩阵中的路径 超时代码 dfs返回值是void,用类内的全局变量flag表示找到或没找到. class Solution { public: bool flag; in ...
- BC4-牛牛学说话之-浮点数
题目描述 会说整数之后,牛牛开始尝试浮点数(小数),输入一个浮点数,输出这个浮点数. 输入描述 输入一个浮点数 输出描述 输出一个浮点数,保留三位小数 示例 1 输入:1.359578 输出:1.36 ...
- 解决安装node-sass报错的方法
1.下载源码放到本地搞~~ 适合内网开发的苦孩子们~~~ 先进入https://github.com/sass/node-sass/releases下载自己需要的包 可以点击tags然后找到自己需要的 ...