1、简介
PostGIS提供了多种空间数据比较方法和线性参考技术。这次我用实例讲解了从完全相等到边界相等的不同比较层次,来介绍线性参考系统在道路、河流等线性地理特征分析中的应用,以及相关的核心函数。
2、相等
下面使用示例来说明
CREATE TABLE polygons (id integer, name varchar, poly geometry);
INSERT INTO polygons VALUES
(1, 'Polygon 1', 'POLYGON((-1 1.732,1 1.732,2 0,1 -1.732,
-1 -1.732,-2 0,-1 1.732))'),
(2, 'Polygon 2', 'POLYGON((-1 1.732,-2 0,-1 -1.732,1 -1.732,
2 0,1 1.732,-1 1.732))'),
(3, 'Polygon 3', 'POLYGON((1 -1.732,2 0,1 1.732,-1 1.732,
-2 0,-1 -1.732,1 -1.732))'),
(4, 'Polygon 4', 'POLYGON((-1 1.732,0 1.732, 1 1.732,1.5 0.866,
2 0,1.5 -0.866,1 -1.732,0 -1.732,-1 -1.732,-1.5 -0.866,
-2 0,-1.5 0.866,-1 1.732))'),
(5, 'Polygon 5', 'POLYGON((-2 -1.732,2 -1.732,2 1.732,
-2 1.732,-2 -1.732))');
2.1 完全相等
通过逐个顶点比较两个几何图形来确定完全相等
SELECT a.name, b.name,
CASE WHEN ST_OrderingEquals(a.poly, b.poly)
THEN 'Exactly Equal'
ELSE 'Not Exactly Equal' END
FROM polygons AS a, polygons AS b;
-- 多边形仅等于自身,不等于其他看似等价的多边形
2.2 空间相等
正如我们上面所看到的,精确相等没有考虑几何体的空间性质。有一个函数,恰如其分地命名为 ST_Equals,可用于测试几何体的空间相等性或等价性。
SELECT a.name, b.name,
CASE WHEN ST_Equals(a.poly, b.poly)
THEN 'Spatially Equal'
ELSE 'Not Equal' END
FROM polygons AS a, polygons AS b;
-- 多边形 1 到 4 是相等的
2.3 等界
为了便于更快的比较,提供了等界运算符 ~=。这仅对边界框(矩形)进行操作,确保几何图形占据相同的二维范围,但不一定占用相同的空间。
SELECT a.name, b.name,
CASE WHEN a.poly ~= b.poly
THEN 'Equal Bounds'
ELSE 'Non-equal Bounds' END
FROM polygons AS a, polygons AS b;
-- 所有图形的都是相等的
作用:在联接或过滤数据时,可以快速将庞大的比较集减少为更易于管理的块。
在 PostGIS 中,有一些特殊的空间运算符用于处理几何对象之间的空间关系。以下是这些运算符的意义:
<<:左操作对象的边界完全在右操作对象的边界之内。
&<:左操作对象的边界完全在右操作对象的边界之内,但左操作对象与右操作对象不相交。
&>:右操作对象的边界完全在左操作对象的边界之内,但左操作对象与右操作对象不相交。
>>
:右操作对象的边界完全在左操作对象的边界之内。
<<|:左操作对象的边界至少在右操作对象的边界之内。
&<|:左操作对象的边界至少在右操作对象的边界之内,但左操作对象与右操作对象不相交。
|&>:右操作对象的边界至少在左操作对象的边界之内,但左操作对象与右操作对象不相交。
|>>:右操作对象的边界至少在左操作对象的边界之内。
&&:两个对象的边界或内部至少有一个公共点。
@>:左操作对象完全包含于右操作对象。
<@:左操作对象完全被右操作对象包含。
~=:对象的边界或内部至少有一个公共点,但它们不完全相交。
3、线性参考
1、PostGIS中的线性参考系统(Linear Referencing System, LRS)是一种用于在一维线性空间上定位点和线段的方法。它主要用于道路、河流、管线等线性地理特征的空间分析和管理。线性参考的核心概念是使用线路上的测量值(通常是距离起点的长度)来定位点或线段,而不是使用传统的二维坐标系统。 线性参考的主要作用和应用场景包括:
● 定位和映射:在线性特征上精确定位事件或属性(如事故发生地点、交通标志、野生动物迁徙路径等),并将这些信息映射到地理空间上。
● 基于距离的查询:执行基于距离的查询,例如查找距离某一点一定距离范围内的所有事件或特征。
● 动态分段:根据属性值(如道路使用情况、河流污染水平)动态创建线性特征的分段,以便于分析和可视化。
● 路径和网络分析:在交通网络分析中,线性参考可以用来计算路径长度、确定最短路径、分析网络连通性等。
● 资产管理:在公路或铁路资产管理中,线性参考系统可以帮助管理和跟踪线路上的资产(如路灯、标志牌、轨道设施)的位置和状态。
2、PostGIS提供了一系列的线性参考函数,支持创建和操作线性参考系统中的数据。这些函数包括但不限于:
● ST_LineInterpolatePoint(geometry A, double measure):返回沿直线插值的点。此函数用于在给定的线性几何体上按比例找到一个点(返回一个点)
● ST_LineLocatePoint(geometry A, geometry B):返回一个介于 0 和 1 之间的浮点数,表示 LineString 上最接近给定点的位置。返回点在线上的相对位置(返回一个比例)。
● ST_LineSubstring(geometry A, double from, double to):返回一个线串,该线串是输入的子字符串,以总二维长度的给定分数开始和结束。根据起始和结束的测量值,返回线的一部分。
● ST_LocateAlong(geometry A, double measure):返回派生的几何集合值,其中包含与指定度量匹配的元素。返回线上与给定测量值相对应的点。
● ST_LocateBetween(geometry A, double from, double to):返回派生的几何集合值,其中包含与指定度量值范围匹配的元素。返回线上在给定测量值范围内的部分。
● ST_AddMeasure(geometry A, double from, double to)):返回派生几何图形,其中测量元素在起点和终点之间线性插值。如果几何没有测量尺寸,则添加一个尺寸。
PS:
大家好,我是小健,Java开发工程师一枚,我会持续发一些技术推文,偶尔也会发些工作求职,互联网热点的事情,希望各位小伙伴多多支持,如果觉得本篇文章对您有所帮助,记得点赞关注收藏喔~