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

摘要: 标签 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.    

pic

pic

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

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

pic

pic

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

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

pic

pic

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方法,排序》

原文链接

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/521322.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员为什么爱穿格子衫和卫衣?

点击上方蓝色字关注我们~兢兢业业宵衣旰食写代码造福网友承受着发际线后退和眼神涣散的双重折磨这就是程 序 员为什么这么多的程序员都爱连帽卫衣呢&#xff1f;在我们的卫衣上市之前&#xff0c;我们调查了一下&#xff0c;小编认为也许有以下四点原因——01小肚腩连帽卫衣的宽…

Alios Things的Flash划分规则

摘要&#xff1a; 为了方便大家移植Alios Things,本文给出了关于Alios Things Flash划分规则&#xff0c;及注意事项。 Alios Things简介 AliOS Things发布于2017年杭州云栖大会&#xff0c; 是 AliOS 家族旗下的、面向IoT领域的、高可伸缩的物联网操作系统&#xff0c;于201…

如何解决数组下标越界异常

如何解决数组下标越界异常 今天在写接口的时候运行发现有一个数组的下标越界异常了&#xff0c; 检查了一下发现实在上面的数组中有一些字符串没有大写&#xff0c;造成跟下面的数组字符串不一样&#xff0c;所以导致了数组下标越界异常。

centos7 yum安装ifconfig

centos7 yum安装ifconfig yum install net-tools

华为表示年内没有推出搭载鸿蒙操作系统手机的计划;OpenStack或被抛弃?iPhone至少还要三年可苹果自研5G调制解调器……...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 每周三次&#xff0c;打卡即…

获取控件enable状态_Android自定义组合控件数字加减(适用于购物车)

大家好&#xff0c;我是小黑&#xff0c;一个还没秃头的程序员~~~独学而无友&#xff0c;则孤陋而寡闻--《礼记学记》今天的内容是自定义一个数组加减的控件&#xff0c;可以应用于购物车的数量选择&#xff0c;效果如下&#xff1a;自定义实现了控件的默认值、最大值、最小值、…

IPv6转换服务正式发布

摘要&#xff1a; IPv6时代已来&#xff0c;阿里云IPv6转换服务帮忙您使现有IPv4业务快速提供IPv6访问能力 什么是IPv6转换服务 IPv6转换服务&#xff08;IPv6 Translation Service&#xff09;是阿里云提供的一种有状态的IPv6和IPv4网络地址和协议转换服务。 通过IPv6转换服…

【角度刁钻】如果把线程当作一个人来对待,秒懂

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 编程新说李新杰责编 | 阿秃多线程的问题都曾经困扰过每个开发人员&#xff0c;今天将从全新视角来解说&#xff0c;希望读者都能明白。强烈建议去运行下文章中的示例代码&#xff0c;自己体会下。问题究竟出在哪里&#xff…

时间序列数据卡尔曼滤波_使用Highcharts和InfluxDB可视化时间序列数据

实时绘制大量带时间戳的数据往往是一项棘手的任务&#xff0c;需要相当多的技巧和过多的耐心。幸运的是&#xff0c;我们已经有了InfluxData平台来为我们提供开箱即用的许多困难。我们可以高效&#xff0c;安全地收集和存储数据&#xff0c;构建可视化&#xff0c;甚至设置警报…

AI又破案!衢州城市大脑这回抓了一个抢劫犯

摘要&#xff1a; 浙江衢州再次上演AI破案的神迹&#xff1a;两周时间内&#xff0c;衢化西路、巨化西路连续发生两起金项链抢劫案。受案发现场条件限制&#xff0c;视频侦查问题重重。在衢州城市大脑的帮助下&#xff0c;警方最终锁定犯罪嫌疑人马某并进行逮捕。经查&#xff…

用javascript进行一个简单的机器学习小实例

摘要&#xff1a; 本篇文章教你如何使用JavaScript在浏览器中完整地定义、训练和部署机器学习算法。 虽然它可能不是机器学习传统选择的开发语言&#xff0c;但是JavaScript正在证明有能力完成这样的工作——即使它目前还不能与主要的机器学习语言Python竞争。在进一步学习之前…

梳子刻字刻什么好_校园石阶上被人刻了1700多个字?!这次网友却说好

在公共场合刻字&#xff0c;是不是听上去不太文明&#xff1f;但凡事都有例外&#xff01;在云南怒江的一个小学&#xff0c;一个支教老师在学校的石砖上刻下了上千个字&#xff0c;他为的不是“到此一游”&#xff0c;而是将汉字知识永远传承下去...△视频来源&#xff1a;看看…

腾讯Blade Team发现云虚拟化平台逃逸漏洞 积极护航云生态安全

随着云技术的快速发展和迭代更新&#xff0c;各行各业都在“云”中快速成长&#xff0c;安全性显得尤为重要。而云时代软硬件的“云交互”&#xff0c;对安全来说也意味着新的挑战。 近日&#xff0c;腾讯Blade Team团队在针对云上虚拟化安全研究中&#xff0c;发现了主流虚拟…

机器学习应用中的UI个性化

摘要&#xff1a; 在这篇文章中&#xff0c;我们看看关于机器学习应用中的UI个性化问题&#xff0c;谈一谈为什么在应用程序开发的过程中交流和沟通是成功的关键。 EdgVerve推出了基于AI的业务应用平台的新一代集成人工智能平台-Infosys Nia使你的企业能够管理特定的业务领域&a…

zookeeper集群部署 精简版本

文章目录1. zookeeper下载2. 解压3. 重命名4. 创建dataDir目录和dataLogDir日志目录5. 更新备份配置文件6. 添加数据目录和日志文件目录7. 添加集群信息7.1. ip配置 方式017.2. 域名配置 方式02&#xff08;推荐使用&#xff09;8. 在服务器上分别创建myid&#xff0c;各自写入…

物联网火爆,入门却太难了!

近几年来&#xff0c;物联网发展迅速&#xff1a;据中商产业研究院《2016——2021年中国物联网产业市场研究报告》显示&#xff0c;预计到2020年&#xff0c;中国物联网的整体规模将达2.2万亿元&#xff0c;产业规模比互联网大30倍。我们可以看到&#xff0c;物联网的前景广阔。…

感知器算法的基本原理和步骤_很多情况下,深度学习算法和人脑相似

人脑模拟  深度学习背后的主要原因是人工智能应该从人脑中汲取灵感。此观点引出了“神经网络”这一术语。人 脑中 包含 数 十亿个神经元&#xff0c;它 们 之间有 数 万个 连 接。很多情况下&#xff0c;深度学习算法和人脑相似&#xff0c;因为人脑和深度学习模型都拥有大量…

打印时候复选框勾选不见了_checkbox 选中未显示对号勾选的问题

今天同事 让帮忙调试一个checkbox只选中一个的方法&#xff0c;代码如下&#xff1a;ID平台代码平台名称选项2选项2选项3选项4varEleInput$("[name ptcode]:checkbox")//;$("#table_platform input") ;EleInput.each(function(index, element) {$(element…

工程师如何解决穿衣搭配烦恼?——滴搭平台与算法

摘要&#xff1a; 阿里工程师们推出了一个滴搭平台&#xff0c;基于千万时尚达人的优质搭配&#xff0c;已经学习出了一套比较成熟的算法&#xff0c;帮你找到最合适的穿搭。不信&#xff1f;下面一起来深入了解“滴搭”背后的算法。 作为一名工程师&#xff0c;每天与代码打交…