PostGis--相等以及线性参考


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开发工程师一枚,我会持续发一些技术推文,偶尔也会发些工作求职,互联网热点的事情,希望各位小伙伴多多支持,如果觉得本篇文章对您有所帮助,记得点赞关注收藏喔~

### PostGIS 中 `postgis-3.so` 文件缺失的解决方案 当遇到 `postgis-3.so` 文件缺失的问题时,通常是因为 PostgreSQL 数据库缺少必要的 PostGIS 扩展安装或者路径配置错误。以下是详细的分析和解决方法: #### 1. 验证 PostGIS 是否已正确安装 在尝试解决问题之前,应先确认 PostGIS 已经成功安装到系统中。可以通过以下命令验证是否存在 `postgis-3.so` 文件: ```bash find /usr/lib/postgresql/ -name "postgis-3*.so" ``` 如果该文件不存在,则说明 PostGIS 的共享对象文件尚未被正确部署。 #### 2. 安装或更新 PostGIS 软件包 对于基于 Debian 或 Ubuntu 的 Linux 发行版,可以使用以下命令来安装或修复 PostGIS 包: ```bash sudo apt-get update sudo apt-get install postgis postgresql-<version>-postgis-3 ``` 其中 `<version>` 是指当前使用的 PostgreSQL 版本号,例如 `14` 表示 PostgreSQL 14[^1]。 #### 3. 创建并启用 PostGIS 扩展 即使已经安装了 PostGIS,仍需手动创建数据库中的扩展才能正常使用其功能。执行如下 SQL 命令以激活 PostGIS 支持: ```sql CREATE EXTENSION IF NOT EXISTS postgis; CREATE EXTENSION IF NOT EXISTS postgis_topology; ``` 上述操作可通过 shell 进行自动化处理,具体方式已在引用材料中提供。 #### 4. 检查动态链接库路径 有时尽管安装完成但仍报错找不到 `.so` 文件,这可能是由于 PostgreSQL 动态链接器未能找到正确的目录位置所致。此时可编辑 PostgreSQL 的配置文件 (`postgresql.conf`) 并添加自定义的共享库路径: ```plaintext shared_preload_libraries = '$libdir/plugins/plugin_debugger.dll,$libdir/postgis-3' ``` 重启 PostgreSQL 后再次测试连接情况。 #### 5. 替代方案——升级至更高版本 考虑到兼容性和稳定性问题,建议考虑将整个环境迁移到最新稳定版本上运行。比如从旧版 PostgreSQL 升级到较新的 LTS (长期支持) 版本,并同步匹配对应的 PostGIS 插件版本[^3]。 --- ### 总结 通过以上步骤应该能够有效解决因 `postgis-3.so` 缺失引发的一系列异常现象。务必按照顺序逐一排查直至恢复正常工作状态为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值