PostGIS学习教程二十一:最近领域搜索

PostGIS学习教程二十一:最近领域搜索

注意:本节涉及的功能只在PostGIS2.0及更高的版本可用。

文章目录

  • PostGIS学习教程二十一:最近领域搜索
  • 一、什么是最近邻域搜索?
  • 二、基于索引的KNN


一、什么是最近邻域搜索?

一个常见的空间查询是:“距离一个要素最近的是哪些要素?”

与距离查询不同,最近邻域搜索(Nearest Neighbour Search)没有限制候选几何图形在什么范围之内,任何距离的要素都将被接受,只要它们是最近的。这引出了关于传统的索引辅助查询的一个问题,这些查询需要一个搜索框,因此需要某种测量值来限定这个框。

执行最近邻域搜索的简单方法是按与要查询的几何图形的距离对候选表进行排序,然后获取最小距离对应的表记录。

SELECT streets.gid, streets.name
FROMnyc_streets streets,nyc_subway_stations subways
WHERE subways.name = 'Broad St'
ORDER BY ST_Distance(streets.geom, subways.geom) ASC
LIMIT 1;

在这里插入图片描述
这种方法的问题是,它强制数据库计算查询几何图形和候选要素表中每个要素之间的距离,然后对它们进行排序。对于一个庞大的候选要素表,这不是一个合理的方法。

提高性能的一种方法是向搜索添加空间索引约束。这需要一个神奇的数字:我们可以在查询几何图形周围搜索的最小方框是什么?并且仍然可以找到至少一个候选几何图形?

如果启用计时,可以看到下面的方框辅助查询和上面的简单查询之间的性能差异。

-- Closest street to Broad Street station is Wall St
SELECT streets.gid, streets.name
FROMnyc_streets streets,nyc_subway_stations subways
WHERE subways.name = 'Broad St'
AND streets.geom && ST_Expand(subways.geom, 200) -- Magic number: 200m
ORDER BY ST_Distance(streets.geom, subways.geom) ASC
LIMIT 1;

在这里插入图片描述
这种方法的问题在于200米这个神奇的数字,如果在200米内没有道路呢?我们可能不会得出结果:因为虽然总会有一个近邻要素,但它可能不在200米之内。

二、基于索引的KNN

“KNN"代表"K nearest neighbours(K近邻)”,其中"K"是要寻找的结果的数量。

KNN是一种基于纯空间索引的近邻搜索方法。通过在索引中上下移动,搜索可以在不指定任何半径的情况下找到最近的候选几何图形,因此该技术适用于具有高度变量数据密度的大表,并且具有很高的性能。

注意:KNN功能仅在PostgreSQL 9.1和PostGIS 2.0或更高版本上可用。

KNN系统的工作原理是评估PostGIS的R-Tree索引中几何图形边界框之间的距离。

由于索引是使用几何图形的边界框构建的,因此任何不是点的几何图形之间的距离都将不精确:它们将是几何图形边界框之间的距离,而不是几何图形之间的距离。

基于索引的KNN查询的语法在查询的ORDER BY子句中放置了一个特殊的"基于索引的距离运算符",在本例中使用了"<->"运算符。有两种基于索引的距离运算符:

<-> —— 表示边界框中心之间的距离
<#> —— 表示边界框边界之间的距离
基于索引的距离运算符的一侧必须是字面几何值。可以使用返回为单个几何图形的子查询代替,也可以使用一个WKT几何图形代替。

-- Closest 10 streets to Broad Street station are ?
SELECTstreets.gid,streets.name
FROMnyc_streets streets
ORDER BYstreets.geom <->(SELECT geom FROM nyc_subway_stations WHERE name = 'Broad St')
LIMIT 10;-- Same query using a geometry EWKT literalSELECT ST_AsEWKT(geom)
FROM nyc_subway_stations
WHERE name = 'Broad St';
-- SRID=26918;POINT(583571 4506714)SELECTstreets.gid,streets.name,ST_Distance(streets.geom,'SRID=26918;POINT(583571.905921312 4506714.34119218)'::geometry) AS distance
FROMnyc_streets streets
ORDER BYstreets.geom <->'SRID=26918;POINT(583571.905921312 4506714.34119218)'::geometry
LIMIT 10;

在这里插入图片描述
在这里插入图片描述
第二个查询的结果显示了对非点几何图形的基于空间索引的查询看上去有多奇怪。Wall St(华尔街)在我们的结果集中仅排名第三,尽管从Broad St车站到Wall St的绝对距离仅仅只有0.714米!
请记住,所有计算都是在边界框上完成的。地铁站点的边界框就是该点本身,因此是准确的。但是街道的边界框和街道线串几何图形本身是不一样的,最近的前十条街道的边界框是这样的:
在这里插入图片描述
我们可以看到车站正好落在华尔街的线串上,并且在华尔街的边界框中。但是这个索引顺序是由"<->"操作符控制的,它计算边界框中心之间的距离。边界框中心如下:
在这里插入图片描述
现在很清楚为什么华尔街没有作为我们搜索结果的第一个记录出现了。因为华尔街边界框的中心确实比Exchange Place(交易所)的边界框的中心离Broad St车站更远。

那么"<#>"运算符呢?如果我们计算边界框边界之间的距离,车站就会落在华尔街边界框内,车站与华尔街的边界框之间的距离为0,所以它作为返回结果的第一个条目返回对吗?

-- Closest 10 streets to Broad Street station are ?
SELECTstreets.gid,streets.name
FROMnyc_streets streets
ORDER BYstreets.geom <#>'SRID=26918;POINT(583571.905921312 4506714.34119218)'::geometry
LIMIT 10;

在这里插入图片描述
很遗憾,并不是。
有许多带有大的边界框的要素,这些边界框也与车站重叠,所以车站与它们的边界框的距离也为0。。。那到底该怎么搞?
在这里插入图片描述
要获得高性能但精确的近邻计算,正确的方法是使用一个子查询提取前100个可能的结果(或者,如果你认为你的数据在分布上更均匀,则可以选择一个较小的数字),然后再计算所有这些结果与车站(Broad St)的真实距离,并从该结果集合返回最近的记录。

-- "Closest" 100 streets to Broad Street station are?
WITH closest_candidates AS (SELECTstreets.gid,streets.name,streets.geomFROMnyc_streets streetsORDER BYstreets.geom <->'SRID=26918;POINT(583571.905921312 4506714.34119218)'::geometryLIMIT 100
)
SELECT gid, name
FROM closest_candidates
ORDER BYST_Distance(geom,'SRID=26918;POINT(583571.905921312 4506714.34119218)'::geometry)
LIMIT 1;

在这里插入图片描述
请注意,在查询点表时,由于边界框与点完全相同,因此可以直接使用按空间索引排序的结果,而不必使用子查询。
– The 10 nearest stations to Broad St station
SELECT gid, name
FROM nyc_subway_stations
ORDER BY geom <-> ‘SRID=26918;POINT(583571.905921312 4506714.34119218)’::geometry
LIMIT 10;

在这里插入图片描述

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

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

相关文章

在java中获取excel的cell值的时候报错

在获取cell的时候&#xff0c;通常会有报错类型不匹配的问题&#xff0c;这是因为你的cell中存储的数据类型和使用的方法不匹配的原因&#xff0c;假如说cell中存储了一个数字&#xff0c;但是使用的cell.getStringCellValue()获取值&#xff0c;就会有如下错误 java.lang.Ill…

微信小程序checkbox多选

效果图 <view class"block"><view class"header"><view class"header-left"><text class"pu-title">数据</text><text class"pu-tip">至少选择一个指标</text></view>&l…

go-redis hash slot 之旅

搭建redis 集群 创建一个网桥 docker network create -d bridge --subnet192.168.148.0/24 --gateway192.168.148.1 -o parenteno1 redis-net通过docker 文件创建redis 集群&#xff0c; 这里注意要不要使用redis 7以上的版本&#xff0c;不然会出问题 version: "3&quo…

Tomcat组件架构与数据流

一、背景与简介 Tomcat我们都知道是一个开源的、实现了大部分Java EE、Servlet、JSP规范的Servlet容器, 允许我们将实现了Serlvet接口的Web程序war包进行部署运行。 但是你有对Tomcat做过细致的学习么? 我相信大部分同学和我一样&#xff0c;之前也是只会进行简单使用&#x…

django线上教育学习平台大数据分析系统python

随着互联网技术不断地发展&#xff0c;网络与大数据成为了人们生活的一部分&#xff0c;而线上教育平台大数据分析作为网上应用的一个全新的体现&#xff0c;由于其特有的便捷性&#xff0c;已经被人们所接受。目前主流的线上教育平台大数据分析服务不仅不明确并且管理盈利较低…

专业课130+总分420+南京大学851信号与系统考研经验南大电子信息与通信系统

经过一年的复习&#xff0c;顺利上岸&#xff0c;被南京大学录取&#xff0c;今年专业课130&#xff0c;总分420&#xff0c;回忆这一年的复习还是有很多经验分享&#xff0c;希望对大家复习有帮助。 专业课&#xff1a; 南京大学851信号与系统难度这几年无论是范围还是难度都…

【MySQL】学习并使用DQL实现排序查询和分页查询

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-SP91zTA41FlGU0Ce {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

计算机服务器中了DevicData勒索病毒如何解密,DevicData勒索病毒解密流程

网络数据安全一直是企业关心的主要话题&#xff0c;近期&#xff0c;云天数据恢复中心接到很多企业的求助&#xff0c;企业的计算机服务器遭到了DevicData勒索病毒攻击&#xff0c;导致企业计算机服务器瘫痪无法正常工作&#xff0c;严重影响了工作业务开展。经过云天数据恢复中…

【已解决】c++ qt选中该行为什么该列部分变色

笔者开启了QTableView中交替行改变颜色&#xff0c;发现笔者自定义绘制的水平滚动条&#xff0c;在选中后不发生颜色改变&#xff0c;这让笔者很疑惑。笔者查阅资料后发现&#xff0c;自定义绘制的控件&#xff0c;要自身设置颜色。当笔者解决了这个问题时&#xff0c;顺手就将…

【SAR成像】基于RD、CS和ωk算法的合成孔径雷达成像算法原理与实现

基于RD、CS和ωk算法的合成孔径雷达成像算法实现 前言SAR基本概念雷达获取数据的几何关系低斜视角下的回波信号模型 RADARSAT-1主要参数数据预处理数据读取与再封装数据补零 成像算法坐标轴的产生RD算法距离压缩距离徙动矫正方位压缩 CS算法第一次相位相乘 变标后的信号第二次相…

基于若依的ruoyi-nbcio流程管理系统自定义业务实现一种简单的动态任务标题需求

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbacheng/n…

[Android] 240204批量生成联系人,短信,通话记录的APK

平常在做测试的时候&#xff0c;需要批量生成很多测试数据&#xff1b; 陌生人 联系人名字的生成支持随机生成&#xff0c;也可以自定义生成&#xff0c;自定义生成陌生人的数据&#xff0c;联系人的名字是否带索引&#xff1b; 通话记录 随机生成通话记录&#xff0c;在生…

free5GC+UERANSIM

使用arp、ifconfig、docker inspect及网桥brctl 相关命令&#xff0c;收集容器IP及Mac地址相关信息&#xff0c;可以梳理出UERANSIMfree5GC模拟环境组网&#xff0c;如下图所示&#xff1a; 如上图所示&#xff1a;环境基于ubuntu 18.04 VMware虚机部署&#xff0c;5GC网元分别…

【Python】Unindent does not match any outer indentation level

这个问题一般是代码缩进问题导致的&#xff0c;规范代码缩进格式即可&#xff0c;如图&#xff1a; 这个问题是因为报异常的那行代码下的方法缩进问题导致&#xff0c;def calendar_f(): 方法名前面多了一个空格。 删除空格即可解决此问题。

【python】python爱心代码【附源码】

一、实现效果&#xff1a; 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 二、完整代码&#xff1a; import math import random import threading import time from math import sin, cos, pi, log from tkinter import * import re# 烟花相关设置 Fireworks [] m…

Fink CDC数据同步(五)Kafka数据同步Hive

6、Kafka同步到Hive 6.1 建映射表 通过flink sql client 建Kafka topic的映射表 CREATE TABLE kafka_user_topic(id int,name string,birth string,gender string ) WITH (connector kafka,topic flink-cdc-user,properties.bootstrap.servers 192.168.0.4:6668…

天拓四方:边缘计算网关功能、特点与应用举例

传统的数据处理方式面临网络延迟、带宽限制和安全风险等问题。为了解决这些问题&#xff0c;边缘计算技术应运而生&#xff0c;而边缘计算网关作为其核心组件&#xff0c;正发挥着越来越重要的作用。边缘计算网关位于数据源和云数据中心之间。它具备数据采集、协议转换、数据处…

视觉SLAM十四讲学习笔记(一)初识SLAM

目录 前言 一、传感器 1 传感器分类 2 相机 二、经典视觉 SLAM 框架 1 视觉里程计 2 后端优化 3 回环检测 4 建图 5 SLAM系统 三、SLAM 问题的数学表述 四、Ubuntu20.04配置SLAM十四讲 前言 SLAM: Simultaneous Localization and Mapping 同时定位与地图构建&#…

交友系统---让陌生人变成熟悉人的过程。APP小程序H5三端源码交付,支持二开。

随着社交网络的发展和普及&#xff0c;人们之间的社交模式正在发生着深刻的变革。传统的线下交友方式已经逐渐被线上交友取而代之。而同城交友正是这一趋势的产物&#xff0c;它利用移动互联网的便利性&#xff0c;将同城内的人们连接在一起&#xff0c;打破了时空的限制&#…

机器视觉系统设计:视觉系统中的成像基准

开发视觉系统的一个重要活动是验证其部署是否符合工程规范。一个成功的视觉应用程序的两个特点是它无需工程师干涉情况下正常工作了多长时间&#xff0c;以及它的维护和复制部署是多么简易。实现所有如上所述目标的一个关键步骤是确定视觉系统的基准。 在这里使用的上下文中&a…