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 ...
随机推荐
- 使用Google OR-Tools分析过去20年中国金融资产最佳配置组合
前两天,在朋友圈里看到一张截至2022年Q2的金融资产历年收益图如下,图中列举了国内从2005年到2022年近20年主要的金融资产历年收益率,随产生想法分析和验证下面几个问题: 过去20年,基于怎样的 ...
- npm Error: Cannot find module 'are-we-there-yet'
npm 损坏了,are-we-there-yet是npm所依赖的npmlog依赖的一个包,重新安装npm即可 踩坑,直接安装还是报错,不管执行哪个命令都是报下面这个错 网上百度了很多,有的说把node ...
- Centos7下vim最新版本安装
一直以来用的都是vim,因为之前都是系统自带的vim没有研究过怎么自己安装,今天趁着刚装完新系统,顺便装下vim. 同样vim也有两种安装方法: 一.yum安装,centos下安装软件最简单的方法了, ...
- [编程基础] Python装饰器入门总结
Python装饰器教程展示了如何在Python中使用装饰器基本功能. 文章目录 1 使用教程 1.1 Python装饰器简单示例 1.2 带@符号的Python装饰器 1.3 用参数修饰函数 1.4 ...
- 迁移学习(DANN)《Domain-Adversarial Training of Neural Networks》
论文信息 论文标题:Domain-Adversarial Training of Neural Networks论文作者:Yaroslav Ganin, Evgeniya Ustinova, Hana ...
- java基础篇——异常
异常的三种类型 1.检查型异常:通常是由用户错误或者问题引起,是程序员无法预见的,例如用户要打开一个不存在的文件... 2.运行时异常:最有可能被程序员忽略的异常,可以在编译时被忽略,例如无限递归调用 ...
- [LeetCode]杨辉三角 II
题目 代码 class Solution { public: vector<int> getRow(int rowIndex) { vector<int> array(rowI ...
- [数据结构]普里姆(Prim)算法生成最小生成树
前提介绍:最小生成树概念 一个连通图的生成树是图的极小连通子图,它包含图中的所有定点,并且只含尽可能少的边,这意味着对于生成树来说,就砍去使生成树变成非连通图:若给它怎家一条边就会形成图中的一条回路. ...
- [C++]C++11右值引用
右值引用的概念(摘自C++Primer) 左值和右值的概念 1.左值和右值是表达式的属性,一些表达式要求生成左值,一些表达式要求生成右值:左值表达式通常是一个对象的身份,而一个右值表达式表示的是对象的 ...
- Django框架之drf:5、反序列化器校验部分源码分析、断言、drf之请求与响应、视图组件介绍及两个视图基类、代码部分实战
Django框架之drf 目录 Django框架之drf 一.反序列化类校验部分源码解析 二.断言 三.drf之请求 1.Request能够解析的前端传入编码格式 2.Request类中的属性和方法 ...