当前位置: 首页 > news >正文

PostGIS学习教程九:空间连接

PostGIS学习教程九:空间连接

空间连接(spatial joins)是空间数据库的主要组成部分,它们允许你使用空间关系作为连接键(join key)来连接来自不同数据表的信息。我们认为“标准GIS分析”的大部分内容可以表示为空间连接。

在上一节中,我们通过两个步骤探索了空间关系:首先,我们提取了’Broad St(宽街)'的地铁站点;然后,我们用这个地铁站点来问更多的问题,如"'Broad St’站位于哪个社区?"

使用空间连接,我们可以只通过一个步骤来回答这个问题,检索有关地铁站及其所在社区的信息:

SELECTsubways.name AS subway_name,neighborhoods.name AS neighborhood_name,neighborhoods.boroname AS borough
FROM nyc_neighborhoods AS neighborhoods
JOIN nyc_subway_stations AS subways
ON ST_Contains(neighborhoods.geom, subways.geom)
WHERE subways.name = 'Broad St';

在这里插入图片描述

我们本可以把每个地铁站都连接到它所在的社区,但在这种情况下,我们只想知道其中一个地铁站的信息。

任何在两个表之间提供true/false关系的函数都可以用来驱动空间连接,但最常用的函数是:ST_Intersects、ST_Contains和ST_DWithin。

文章目录

  • PostGIS学习教程九:空间连接
  • 一、连接和汇总
  • 二、高级连接
  • 三、空间连接练习


一、连接和汇总

JOIN和GROUP BY的组合支持通常在GIS系统中的某些分析。

例如:“曼哈顿行政区的各个社区的人口和种族构成是什么?”,这个问题将人口普查中的人口信息与社区的几何信息结合在一起,社区信息只限制在曼哈顿的一个行政区中。

SELECTneighborhoods.name AS neighborhood_name,Sum(census.popn_total) AS population,100.0 * Sum(census.popn_white) / Sum(census.popn_total) AS white_pct,100.0 * Sum(census.popn_black) / Sum(census.popn_total) AS black_pct
FROM nyc_neighborhoods AS neighborhoods
JOIN nyc_census_blocks AS census
ON ST_Intersects(neighborhoods.geom, census.geom)
WHERE neighborhoods.boroname = 'Manhattan'
GROUP BY neighborhoods.name
ORDER BY white_pct DESC;

在这里插入图片描述
这里发生了什么?从理论上讲(数据库在内部对实际运行机制进行了优化)发生的情况如下:

1.JOIN子句创建了一个虚拟表,其中包含来自neighborhoods表和census表的列。
2.WHERE子句将我们的虚拟表筛选为仅保留有关曼哈顿行政区的记录。
3.结果记录按neighborhood name分组,并通过聚合函数Sum()计算人口数
4.在对最后的数字进行一些算术和格式化之后,我们的查询就会输出百分比。
注意:JOIN子句组合了两个FROM子句中的数据表,默认情况下,数据库使用的是INNER JOIN连接类型,但还有其他四种连接类型,有关详细信息,请参阅PostgreSQL文档中的join_type的定义。

我们还可以使用距离测试作为连接键,以创建汇总的“半径内所有项”查询。让我们使用距离查询来探索纽约的种族地理。

首先,让我们了解一下这个城市的基本种族构成。

SELECT100.0 * Sum(popn_white) / Sum(popn_total) AS white_pct,100.0 * Sum(popn_black) / Sum(popn_total) AS black_pct,Sum(popn_total) AS popn_total
FROM nyc_census_blocks;

在这里插入图片描述
因此,在纽约的800万人口中,大约44%的人被记录为”白人“,26%的人被记录为”黑人“。

艾灵顿公爵曾经唱过这样一首歌:"你/必须乘A-train/去哈莱姆区(Harlem)的糖山(Sugar Hill)。"正如我们早些时候看到的,哈莱姆地区拥有曼哈顿(Manhattan)最多的非裔美国人(80.5%)。杜克(Duke)的A-train也是这样的吗?

首先,请注意,nyc_subway_stations表routes字段的内容是我们感兴趣的用于查找A-train的内容。里面的值有点复杂。

SELECT DISTINCT routes FROM nyc_subway_stations;

注意:DISTINCT关键字从结果中消除重复的行。如果没有DISTINCT关键字,上面的查询将标识491个结果,而不是73个。

所以,要找到A-train,我们需要在routes列中有’A’的所有行记录。我们可以通过多种方法来实现这一点,但今天我们将使用strpos(routes, ‘A’),它只有当’A’在routes列中才会返回非零数。

SELECT DISTINCT routes
FROM nyc_subway_stations AS subways
WHERE strpos(subways.routes,'A') > 0;

在这里插入图片描述
现在让我们计算一下距A-train线200米以内的种族构成:

SELECT100.0 * Sum(popn_white) / Sum(popn_total) AS white_pct,100.0 * Sum(popn_black) / Sum(popn_total) AS black_pct,Sum(popn_total) AS popn_total
FROM nyc_census_blocks AS census
JOIN nyc_subway_stations AS subways
ON ST_DWithin(census.geom, subways.geom, 200)
WHERE strpos(subways.routes,'A') > 0;

在这里插入图片描述

因此,可以得出结论:A-train服务的区域的种族构成与城市其他区域的种族构成并没有太大的不同。

二、高级连接

在上面的最后部分,我们看到A-train服务的区域的种族构成与城市其他区域的种族构成并没有太大的不同。有没有哪些地铁的服务区域的种族构成与纽约整个城市的种族构成差异较大?

为了回答这个问题,我们将在查询中添加另一个连接,以便可以同时计算多条地铁线路的构成。要做到这一点,我们需要创建一个新的表,遍历我们想要汇总的所有行。

CREATE TABLE subway_lines ( route char(1) );
INSERT INTO subway_lines (route) VALUES('A'),('B'),('C'),('D'),('E'),('F'),('G'),('J'),('L'),('M'),('N'),('Q'),('R'),('S'),('Z'),('1'),('2'),('3'),('4'),('5'),('6'),('7');

在这里插入图片描述
现在,我们可以将subway lines连接到原始查询中。

SELECTlines.route,100.0 * Sum(popn_white) / Sum(popn_total) AS white_pct,100.0 * Sum(popn_black) / Sum(popn_total) AS black_pct,Sum(popn_total) AS popn_total
FROM nyc_census_blocks AS census
JOIN nyc_subway_stations AS subways
ON ST_DWithin(census.geom, subways.geom, 200)
JOIN subway_lines AS lines
ON strpos(subways.routes, lines.route) > 0
GROUP BY lines.route
ORDER BY black_pct DESC;

在这里插入图片描述
如前所述,连接创建了一个虚拟表,其中包含在JOIN ON约束范围内可用的所有的连接的行记录,然后将这些行记录分组。ST_DWithin可确保计算中仅包括靠近地铁站的人口普查区块。

三、空间连接练习

下面是我们之前所看到的一些函数的汇总,它们应该对练习有用!
在这里插入图片描述
同时请记住我们的数据库中现有的数据表:

nyc_census_blocks
name, popn_total, boroname, geom
nyc_streets
name, type, geom
nyc_subway_stations
name, routes, geom
nyc_neighborhoods
name, boroname, geom
练习:

①"小意大利(Little Italy)社区"有什么地铁站?它在哪些地铁线路上?

SELECT s.name, s.routes
FROM nyc_subway_stations AS s
JOIN nyc_neighborhoods AS n
ON ST_Contains(n.geom, s.geom)
WHERE n.name = 'Little Italy';

在这里插入图片描述
②"6-train服务哪些社区?"(提示:nyc_subway_stations表中的routes列具有类似"B,D,6,V"和"C,6"的值)

SELECT DISTINCT n.name, n.boroname
FROM nyc_subway_stations AS s
JOIN nyc_neighborhoods AS n
ON ST_Contains(n.geom, s.geom)
WHERE strpos(s.routes,'6') > 0;

在这里插入图片描述
注意:我们使用DISTINCT关键字从结果集中删除在一个社区中的多个地铁站的重复记录。

③"9/11事件后,'Battery Park'社区附近将禁止入内几天,那么要疏散多少人呢?"

SELECT Sum(popn_total)
FROM nyc_neighborhoods AS n
JOIN nyc_census_blocks AS c
ON ST_Intersects(n.geom, c.geom)
WHERE n.name = 'Battery Park';

在这里插入图片描述
④"'Upper West Side'和'Upper East Side'的人口密度是多少"

SELECTn.name,Sum(c.popn_total) / (ST_Area(n.geom) / 1000000.0) AS popn_per_sqkm
FROM nyc_census_blocks AS c
JOIN nyc_neighborhoods AS n
ON ST_Intersects(c.geom, n.geom)
WHERE n.name = 'Upper West Side'
OR n.name = 'Upper East Side'
GROUP BY n.name, n.geom;

在这里插入图片描述

相关文章:

PostGIS学习教程九:空间连接

PostGIS学习教程九:空间连接 空间连接(spatial joins)是空间数据库的主要组成部分,它们允许你使用空间关系作为连接键(join key)来连接来自不同数据表的信息。我们认为“标准GIS分析”的大部分内容可以表示…...

C++ day56 两个字符串的删除操作 编辑距离

题目1:583 两个字符串的删除操作 题目链接:两个字符串的删除操作 对题目的理解 返回使两个单词word1和word2相同的最少删除多少个元素,两个单词至少包含一个字母,且仅包含小写字母 思路1:这道题与昨天的不同子序列…...

Android studio中如何生成jar包?

文章目录 需求背景目录结构gradle结构makeJar的语法解析 执行makeJar 任务拿到jar包 需求背景 别部门做C语言开发的同学开发了一个库,需要给我们Android端去调用。 我们拿到源码,首先需要做的是通过CMake去把C源码编译链接成动态库。 当然静态库也行&am…...

【2】基于多设计模式下的同步异步日志系统-设计模式

6. 相关技术知识补充 6.1 不定参函数 在初学C语⾔的时候,我们都⽤过printf函数进⾏打印。其中printf函数就是⼀个不定参函数,在函数内部可以根据格式化字符串中格式化字符分别获取不同的参数进⾏数据的格式化。 ⽽这种不定参函数在实际的使⽤中也⾮常…...

第十五届蓝桥杯模拟赛B组(第二期)C++

前言: 第一次做蓝桥模拟赛的博客记录,可能有很多不足的地方,现在将第十五届蓝桥杯模拟赛B组(第二期)的题目与代码与大家进行分享,我是用C做的,有好几道算法题当时自己做的也是一脸懵&#xff0c…...

企业ERP软件定制开发要注意|app小程序搭建

企业ERP软件定制开发要注意|app小程序搭建 企业ERP软件定制开发是一项复杂而且关键的任务,它需要深入理解企业的需求和流程,并且以此为基础进行设计和开发。以下是一些关于企业ERP软件定制开发的注意事项。 首先,我们必须确保在进行定制开发之…...

系统架构设计-权限模块的设计

系统架构-权限模块的设计 如何评估一个研发人员技术水平,在大部分的情况下不是看其完成业务代码的好坏,更多的时候还是需要看这个研发人员从零构建一个完整项目的能力,在大公司中这样的机会可能相对较少,大部分的时间里都是对现有…...

IDEA切换Python虚拟环境

前言 因为之前一直使用的IDEA开发,换到VSCODE之后各种不习惯,特别是DEBUG的操作,特别难受,因此决心换回IDEA 环境配置 已有项目调整 进入Project 选择SDKs,新建Python 配置Conda以及虚拟环境 有就选择一个虚拟环境…...

《opencv实用探索·十一》opencv之Prewitt算子边缘检测,Roberts算子边缘检测和Sobel算子边缘检测

1、前言 边缘检测: 图像边缘检测是指在图像中寻找灰度、颜色、纹理等变化比较剧烈的区域,它们可能代表着物体之间的边界或物体内部的特征。边缘检测是图像处理中的一项基本操作,可以用于人脸识别、物体识别、图像分割等多个领域。 边缘检测…...

prime靶机打靶记录

靶机下载地址 https://download.vulnhub.com/prime/Prime_Series_Level-1.rar nmap搜索目标 使用nmap -sn 192.168.41.0/24找到目标靶机192.168.41.136 扫描端口,因为是靶机,所以速率直接调了10000 扫出来两个端口22和80,进行详细的扫描 没…...

树莓派,linux换清华源

清华源网址 https://mirrors.tuna.tsinghua.edu.cn/help/raspbian/ 更换软件源 鉴于国内网络环境下载各大镜像,软件包速度慢的问题,需要更换软件源,以防下载慢,且在本教程中,统一更换为清华源。 2.3.1 更换树莓派软…...

公有云迁移研究——AWS DMS

大纲 1 什么是DMS2 DMS的作用3 DMS在迁移的时候都做些什么4 在使用DMS的时候我们需要做些什么5 操作5.1 创建两个数据库终端节点5.2 创建迁移任务 6 可能遇到的问题7 总结 在本地机房或其他云往AWS上做迁移时,往往会遇到数据库迁移的任务。如果数据量不是特别大&…...

一起学docker系列之十七Docker Compose 与手动操作的比较与优势分析

目录 1 前言2 不使用 Docker Compose2.1 启动 MySQL 容器2.2 启动 Redis 容器2.3 启动微服务容器 3 使用 Docker Compose4 使用 Docker Compose 的优势5 结语参考地址 1 前言 在当今容器化应用的开发与部署中,容器编排工具的选择对于简化流程、提高效率至关重要。本…...

IP地址定位不准确的情况研究

在互联网的浩瀚海洋中,每一台连接到网络的设备都被赋予了一个独特的标识符,这就是IP地址。它就像是我们在线身份的一部分,帮助我们与他人进行通信,获取信息,以及享受各种网络服务。然而,由于各种原因&#…...

武汉凯迪正大KDZD5289硫化曲线测试仪(电脑无转子硫化仪)

电脑无转子硫化仪 硫化时间测试仪 硫化曲线仪 硫化曲线测试仪 武汉凯迪正大KDZD5289产品概述 KDZD5289硫化曲线测试仪(电脑无转子硫化仪)采用电脑控制进口温控仪进行准确控温,计算机适时进行数据处理并可进行统计、分析、存储对比等&#xff…...

Topic和Partition

作用 主题作为消息的一级分类, 分区是对二级分类。分区是Kafka可伸缩性和水平扩展的关键, 也是多副本机制保证可用性的基础。分区可以有一到多个副本, 每个副本对应1个日志文件, 每个日志文件对应1到多个日志分段。每个日志分段又可以细分为日志文件, 索引文件和快照文件。 创…...

算法通关村第十四关|黄金挑战|数据流的中位数

数据流的中位数 原题:力扣295. 设计一种数据结构可以支持添加整数和返回中位数的操作。 之前写过找中间用两个堆,这道题就可以使用一个大顶堆和一个小顶堆。 大顶堆存储比较小的元素,小顶堆存储比较大的元素。 class MedianFinder {Prio…...

挑选数据可视化工具:图表类型、交互功能与数据安全

作为一名数据分析师,我经常需要使用各种数据可视化工具来将数据以直观、清晰的方式呈现出来,以便更好地理解和分析。在市面上的众多可视化工具中,我根据实际需求和项目特点进行选择。本文将从以下几个角度对市面上的数据可视化工具进行对比&a…...

华纳云:有效解决服务器宕机的办法

服务器宕机可能是由多种原因引起的,包括硬件故障、软件问题、网络问题等。以下是一些简单的解决服务器宕机问题的办法: 检查硬件连接: 确保服务器的所有硬件连接正常。检查电源线、网络连接、存储设备连接等,确保没有松动或断开的…...

坦克大战-部分

通过键盘操控坦克移动,转弯,射击 消灭所有敌人可以过关 23个类,3个gif图片 wsad控制移动 j射击 砖墙限制移动,可以打穿;铁墙,限制移动,不能打穿;水&#x…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘&#xf…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...

论文阅读:Matting by Generation

今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...

【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验

2024年初,人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目(一款融合大型语言模型能力的云端AI编程IDE)时,技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力,TRAE在WayToAGI等…...

【工具教程】多个条形码识别用条码内容对图片重命名,批量PDF条形码识别后用条码内容批量改名,使用教程及注意事项

一、条形码识别改名使用教程 打开软件并选择处理模式:打开软件后,根据要处理的文件类型,选择 “图片识别模式” 或 “PDF 识别模式”。如果是处理包含条形码的 PDF 文件,就选择 “PDF 识别模式”;若是处理图片文件&…...

可视化预警系统:如何实现生产风险的实时监控?

在生产环境中,风险无处不在,而传统的监控方式往往只能事后补救,难以做到提前预警。但如今,可视化预警系统正在改变这一切!它能够实时收集和分析生产数据,通过直观的图表和警报,让管理者第一时间…...