摘要: 标签 PostgreSQL , PostGIS , operator , ops , knn 背景 PostgreSQL GiST索引支持排序接口,可以支撑空间、标准、数组、文本向量、文本等类型的排序。

标签

PostgreSQL , PostGIS , operator , ops , knn


背景

PostgreSQL GiST索引支持排序接口,可以支撑空间、标准、数组、文本向量、文本等类型的排序。

分别表示:

1、给定一空间位置,按空间距离排序输出

2、给定一数组、全文检索值、字符串,按数组、全文检索、字符串相似度排序输出

3、给定一标准类型的值,按标准类型的距离排序

数据库目前支持哪些排序操作符,可以参考:《PostgreSQL 如何确定某个opclass支持哪些操作符(支持索引),JOIN方法,排序》

postgres=# select oprleft::regtype,oprright::regtype,oprresult::regtype,oprname,oprkind,oprcode from pg_operator where oid in (select amopopr  from pg_amop where amopsortfamily<>0);    oprleft           |          oprright           |    oprresult     | oprname | oprkind |              oprcode
-----------------------------+-----------------------------+------------------+---------+---------+------------------------------------  point                       | point                       | double precision | <->     | b       | point_distance  circle                      | point                       | double precision | <->     | b       | dist_cpoint  polygon                     | point                       | double precision | <->     | b       | dist_polyp  geometry                    | geometry                    | double precision | <->     | b       | geometry_distance_centroid  geometry                    | geometry                    | double precision | <#>     | b       | geometry_distance_box  geometry                    | geometry                    | double precision | <<->>   | b       | geometry_distance_centroid_nd  geometry                    | geometry                    | double precision | |=|     | b       | geometry_distance_cpa  geography                   | geography                   | double precision | <->     | b       | geography_distance_knn  oprcode是这个操作符对应的函数,要知道操作符的算法,可以下载postgis源码根据函数找到其C代码。

安装了PostGIS后,对于空间排序,目前支持5种算法

PostGIS 空间排序算法

1、2D平面,两个对象实际距离

<-> — Returns the 2D distance between A and B.

2、计算两条有效轨迹类型的距离(如果两个轨迹没有交集, 返回空)

|=| — Returns the distance between A and B trajectories at their closest point of approach.

3、2D平面,两个对象bound box实面的距离(所以如果BOUND BOX与另一对象 相交,包含,说明距离为0)

<#> — Returns the 2D distance between A and B bounding boxes.

4、与1类似,多维对象,返回两个bound box 中心点的距离

<<->> — Returns the n-D distance between the centroids of A and B bounding boxes.

5、与3类似,多维对象,返回两个bound box 实体的距离

<<#>> — Returns the n-D distance between A and B bounding boxes.

例子

1、点和线段的实际距离

postgres=# select st_setsrid(st_makepoint(1,2),4326) <-> st_setsrid(ST_MakeLine(ST_MakePoint(0,0.9),
ST_MakePoint(3,4)),4326);  ?column?
--------------------  0.0463614285010702
(1 row)

2、点和线段(BOUND BOX实体)的距离

postgres=# select st_setsrid(st_makepoint(1,2),4326) <#> st_setsrid(ST_MakeLine(ST_MakePoint(0,0.9),
ST_MakePoint(3,4)),4326);  ?column?
----------  0
(1 row)

3、两个不相交轨迹(范围没有相交)的距离

postgres=# WITH inp AS ( SELECT  ST_AddMeasure('LINESTRING Z (0 0 0, 10 0 5)'::geometry,  extract(epoch from '2015-05-26 10:01'::timestamptz),  extract(epoch from '2015-05-26 11:01'::timestamptz)  ) a,  ST_AddMeasure('LINESTRING Z (0 2 10, 12 1 2)'::geometry,  extract(epoch from '2015-05-25 01:00'::timestamptz),  extract(epoch from '2015-05-25 13:00'::timestamptz)  ) b
)
SELECT ST_DistanceCPA(a,b) distance FROM inp;  distance
----------  (1 row)

4、两个有相交(范围有交集)的距离 (lower1upper1 与 lower2upper2 有相交)

postgres=# WITH inp AS ( SELECT  ST_AddMeasure('LINESTRING Z (0 0 0, 10 0 5)'::geometry,  extract(epoch from '2015-05-26 10:01'::timestamptz),   -- lower  extract(epoch from '2015-05-26 11:01'::timestamptz)    -- upper  ) a,  ST_AddMeasure('LINESTRING Z (0 2 10, 12 1 2)'::geometry,  extract(epoch from '2015-05-25 01:00'::timestamptz),   -- lower  extract(epoch from '2015-05-26 13:00'::timestamptz)    -- upper  ) b
)
SELECT ST_DistanceCPA(a,b) distance FROM inp;  distance
------------------  3.07479618495659
(1 row)

5、两个有相交(范围有交集)的距离

postgres=# WITH inp AS ( SELECT  ST_AddMeasure('LINESTRING Z (0 0 0, 10 0 5)'::geometry,  extract(epoch from '2015-05-26 10:01'::timestamptz),  extract(epoch from '2015-05-26 11:01'::timestamptz)  ) a,  ST_AddMeasure('LINESTRING Z (0 2 10, 12 1 2)'::geometry,  extract(epoch from '2015-05-25 01:00'::timestamptz),  extract(epoch from '2015-05-26 10:10'::timestamptz)  ) b
)
SELECT ST_DistanceCPA(a,b) distance FROM inp;  distance
-----------------  10.621322893124
(1 row)

排序用法

select * from tbl order by geom <-> 某个空间对象常量;

参考

http://workshops.boundlessgeo.com/postgis-intro/knn.html

http://postgis.net/docs/manual-2.4/reference.html#Operators

http://postgis.net/docs/manual-2.4/geometry_distance_cpa.html

http://postgis.net/docs/manual-2.4/ST_DistanceCPA.html

《PostgreSQL 如何确定某个opclass支持哪些操作符(支持索引),JOIN方法,排序》

原文链接

本文为云栖社区原创内容,未经允许不得转载。

PostgreSQL PostGIS 的5种空间距离排序(knn)算法相关推荐

  1. PostgreSQL+PostGIS实现两坐标点之间最短路径查询算法函数(地图工具篇.12)

    听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 前置博客地址: 11.(地图工具篇)PostgreSQL+PostGIS实现最短路径分析 1.测试验证 select routi ...

  2. PostgreSql+PostGIS和uDig的安装

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 总体来说,这两款开源软件均是很好安装的,一般按照提示一步一步 ...

  3. 【空间数据库】Windows操作系统PostgreSQL+PostGIS环境搭建图文安装教程

    PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),PostgreSQL支持大部分的SQL标准并且提供了很多其他现代特性,如复杂查询.外键.触发器.视图.事务 ...

  4. PostgreSQL , PostGIS , 球坐标 , 平面坐标 , 球面距离 , 平面距离

    标签 PostgreSQL , PostGIS , 球坐标 , 平面坐标 , 球面距离 , 平面距离 背景 PostGIS中有两种常用的空间类型geometry和geography,这两种数据类型有什 ...

  5. 三种基本排序的实现及其效率对比:冒泡排序、选择排序和插入排序

    1 public class ThreeTypesOfBaseSort { 2 // ========================== 三种基本排序的效率对比 ================== ...

  6. 3分钟快速实现:9种经典排序算法的可视化

    作者 | 爱笑的眼睛 来源 | 恋习Python(ID:sldata2017) 最近在某网站上看到一个视频,是关于排序算法的可视化的,看着挺有意思的,也特别喜感. ▼ 6分钟演示15种排序算法 不知道 ...

  7. 3min利用Python实现9种经典排序算法可视化!(附源代码)

    来源:恋习Python 本文附视频,建议收藏. 本文为你分享实现9种经典排序算法可视化的方法,3分钟即可实现. [导 读]近在某网站上看到一个视频,是关于排序算法的可视化的,看着挺有意思的,也特别喜感 ...

  8. BCH到底该采用哪种交易排序规则?

    ​​目前BCH在选取哪种交易排序方面依旧没有达成共识.其实针对BCH到底该采用什么交易排序规则这一问题完全可以通过分析对比进行决定. 针对这个问题应该分几个步骤进行思考. 1.目前的TTOR需不需要被 ...

  9. 算法:三种简单排序算法

    排序算法比較常见的有:冒泡排序.简单选择排序.直接插入排序:希尔排序.堆排序.归并排序和高速排序算法等. 今天先学习一下前面三种比較简单的算法.排序的相关概念: ①排序的稳定性:两个或多个元素相等.排 ...

最新文章

  1. 2022-2028年中国安防行业研究及前瞻分析报告
  2. Mysql实现非程序控制读写分离
  3. 模拟器显示空白图片_Kawaks街机模拟器,还是小时候的味道!
  4. slf4j注解log报错_SpringBoot自定义日志注解,用于数据库记录操作日志,你用过吗?...
  5. 将本地代码备份到Github public repository
  6. innobackupex实现导出和导入单张表
  7. HBuilder Android真机调试
  8. 基于springboot断点续传或分片上传
  9. VS C++ vector结构体 增加元素 删除元素 获取第一个元素 最后一个元素 清空元素
  10. KITTI数据集介绍
  11. AutoCAD的卸载后重新安装,删除注册表的详细过程
  12. sts4linux,STS3下载和安装,STS4升级
  13. 海森矩阵的特征值和特征向量的物理意义推导
  14. Linux服务器如何修改登录用户的密码
  15. vs2019(C语言) 使用教程
  16. 火车头采集的文件发布到服务器上,火车头采集器图片采集上传设置
  17. 科研写作之word技巧——首行缩进、图 表 公式 自动编号和引用、子标题细节
  18. 来看看一位阿里P9的年薪和资产
  19. android如何设置自适应大小的背景图片,如何调整背景图片大小以适应Android中的应用程序屏幕大小...
  20. 1+X 网络系统 建设与运维(中级)实验

热门文章

  1. php中删除文件夹内容吗,如何使用PHP删除包含内容的文件夹
  2. python 线程退出_python线程退出
  3. mysql编程语法_MYSQL语法(一)
  4. 双水泵轮换工作原理图_一用一备式冷凝水泵应急电源的设计与实现
  5. arm ubuntu 编译boost_为arm linux 交叉编译boost 1.33.1
  6. 计算机三级数据库上机怎么考,最新计算机三级数据库上机考试试题
  7. python 整数输出 d f_pythn print格式化输出---------%s 和 % d 都是什么意思?
  8. 的使用go_使用 Go 开发 Prometheus Exporter
  9. 一院士给博士生的一封信:每天工作12小时,这仅是一个下限!
  10. 基金委通报科研诚信违规违纪案件查处情况