PostGIS学习教程十四:更多的空间连接

PostGIS学习教程十四:更多的空间连接

在上一节中,我们看到了ST_Centroid(geometry)和ST_Union([geometry])函数,以及一些简单的示例。在本节中,我们将用它们做一些更详细的事情。


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • PostGIS学习教程十四:更多的空间连接
  • 一、创建人口普查区域图表
    • 1.1、加载nyc_census_sociodata.sql
    • 1.2、创建人口普查区域空间表
    • 1.3、将属性数据连接到空间数据
    • 1.4、回答一个有趣的问题
    • 二、多边形 / 多边形连接
    • 2.1、那Flatbush呢?
  • 三、大的半径距离的连接


一、创建人口普查区域图表

在网盘中准备了nyc_census_sociodata.sql包含属性数据,但不包含几何图形数据。该表包含有关纽约的、有趣的社会经济数据:通勤时间、收入和教育程度。然而有一个问题:数据按"人口普查区域(census tract)"汇总,而我们没有普查区域的几何图形数据!

在本节中,我们将:

1、加载nyc_census_sociodata.sql表
2、创建人口普查区域空间表
3、将属性数据连接到几何图形数据
4、然后利用我们的新数据进行一些分析

1.1、加载nyc_census_sociodata.sql

1、在PgAdmin中打开SQL查询窗口
2、从菜单中选择File->Open,并浏览到nyc_census_sociodata.sql文件
3、按"Run Query"按钮
4、如果你在PgAdmin中按下"Refresh"按钮,那数据表的列表现在应该包含nyc_census_sociodata表。

1.2、创建人口普查区域空间表

正如我们在上一节中所看到的,我们可用通过对blkid键的子串进行汇总,从人口普查块(census block)中构建更高级别地理区划的几何图形。为了得到人口普查区域(census tract),我们需要对blkid的前11个字符进行汇总分组。

360610001001001 = 36 061 000100 1 00136     = State of New York
061    = New York County (Manhattan)
000100 = Census Tract
1      = Census Block Group
001    = Census Block

使用ST-Union创建新表:

-- Make the tracts table
CREATE TABLE nyc_census_tract_geoms AS
SELECTST_Union(geom) AS geom,SubStr(blkid,1,11) AS tractid
FROM nyc_census_blocks
GROUP BY tractid;-- Index the tractid
CREATE INDEX nyc_census_tract_geoms_tractid_idx
ON nyc_census_tract_geoms (tractid);

1.3、将属性数据连接到空间数据

使用标准属性连接将人口普查区域(census tract)几何图形表和普查区域属性表连接起来:

-- Make the tracts table
CREATE TABLE nyc_census_tracts AS
SELECTg.geom,a.*
FROM nyc_census_tract_geoms g
JOIN nyc_census_sociodata a
ON g.tractid = a.tractid;-- Index the geometries
CREATE INDEX nyc_census_tract_gidx
ON nyc_census_tracts 
USING GIST (geom);

1.4、回答一个有趣的问题

回答一个有趣的问题!“列出纽约拥有研究生学位的人所占比例排名前十的社区”。

SELECT100.0 * Sum(t.edu_graduate_dipl) / Sum(t.edu_total) AS graduate_pct,n.name, n.boroname
FROM nyc_neighborhoods n
JOIN nyc_census_tracts t
ON ST_Intersects(n.geom, t.geom)
WHERE t.edu_total > 0
GROUP BY n.name, n.boroname
ORDER BY graduate_pct DESC
LIMIT 10;

在这里插入图片描述

注意:纽约地理学家将会对Flatbush社区出现这份居民受教育程度较高社区的名单中感到惊讶。为什么呢?答案将在下一节讨论。

二、多边形 / 多边形连接

在我们上面的感兴趣查询中,我们使用ST_Intersects(geometry_a, geometry_b)函数来确定每个社区(neighborhood)包含哪些人口普查区域(census tract)多边形。这就引出了一个问题:如果一块人口普查区域位于两个社区之间的边界上,该怎么办?这块人口普查区域和这两个社区相交,因此都将会包含在这两个社区的汇总统计数据中。
为了避免这种重复计算,有两种方法:

简单的方法是确保每个区域只落在一个社区(使用ST_Centroid(geometry))
复杂的方法是在两个社区的边界处将相交的人口普查区域(census tracts)分割(使用ST_Intersection(geometry, geometry))
以下是在我们上面的研究生教育查询中使用简单方法避免人口普查区域重复计算的示例:

SELECT100.0 * Sum(t.edu_graduate_dipl) / Sum(t.edu_total) AS graduate_pct,n.name, n.boroname
FROM nyc_neighborhoods n
JOIN nyc_census_tracts t
ON ST_Contains(n.geom, ST_Centroid(t.geom))
WHERE t.edu_total > 0
GROUP BY n.name, n.boroname
ORDER BY graduate_pct DESC
LIMIT 10;

请注意,现在运行查询需要更长的时间,因为ST_Centroid函数必须在每个人口普查区域上运行。

避免人口普查区域的重复计算改变了查询结果!
在这里插入图片描述

2.1、那Flatbush呢?

特别的是,Flatbush社区已经从名单上消失了。在我们的数据表中,我们可以更仔细地看一看Flatbush社区的地图,就能看出原因所在。
正如我们的数据源所定义的那样,Flatbush并不是传统意义上的社区,因为它只覆盖了Prospect Park(展望公园)的面积。该地区的人口普查记录自然为零居民。然而,Flatbush社区确实"刮去"了公园北侧的一块"昂贵"的人口普查区域的人口数据(位于贵族化的Park Slope社区),进行多边形相交计算时,这个人口普查区域的人口统计数据被添加到Flatbush中,导致该查询的结果比例非常高。

三、大的半径距离的连接

一个有趣的问题是:“地铁站附近(500米以内)的居民的通勤时间与远离地铁站的居民的通勤时间有什么不同?”

然而,这个问题涉及到了重复计算的一些问题:许多人周围500米范围内有多个地铁站!

纽约市的总人口:

SELECT Sum(popn_total)
FROM nyc_census_blocks;

纽约市距离地铁站周围500米范围内的人口:

SELECT Sum(popn_total)
FROM nyc_census_blocks census
JOIN nyc_subway_stations subway
ON ST_DWithin(census.geom, subway.geom, 500);

在这里插入图片描述
查询结果比纽约市的总人口还要多!显然,我们的SQL语句产生了一个很大的重复计算的错误。你可以在地铁的缓冲区图片上看到这个问题。
解决方案是在将不同的人口普查块数据传递到查询操作之前,确保只有不同的人口普查数据块。我们可以通过将查询分解为查找不同普查块的子查询来实现这一点:

WITH distinct_blocks AS (SELECT DISTINCT ON (blkid) popn_totalFROM nyc_census_blocks censusJOIN nyc_subway_stations subwayON ST_DWithin(census.geom, subway.geom, 500)
)
SELECT Sum(popn_total)
FROM distinct_blocks;

在这里插入图片描述

好多了!因此,纽约一半以上的人口离地铁站不到500m(步行约5-7分钟)。

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

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

相关文章

[RK-Linux] 解决RK3399 M.2 NVMe SSD根文件系统分区容量无法扩展到最大问题

延续《[RK-Linux] RK3399支持M.2 NVMe SSD启动》 在检查分区与挂载情况的时候,根文件系统分区容量是有问题的: root@buildroot:/# df -h Filesystem Size Used Avail Use% Mounted on /dev/root 692M 430M 209M 68% / devtmpfs 1.9G 8.0K 1.9G 1%…

Jmeter 性能 —— 监控服务器!

Jmeter监控Linux需要三个文件 JMeterPlugins-Extras.jar (包:JMeterPlugins-Extras-1.4.0.zip)JMeterPlugins-Standard.jar (包:JMeterPlugins-Standard-1.4.0.zip)ServerAgent-2.2.3.zip 1、Jemter 安装插件 在插件管理中心的搜索Servers Performan…

MySQL运维实战(1.2)安装部署:使用二进制安装部署

作者:俊达 引言 上一篇我们使用了RPM进行安装部署,这是一种安装快速、简化部署和管理过程、与操作系统提供的包管理工具紧密集成的部署方法。此外,当你需要更高的灵活性和自定义性,并且愿意承担一些额外的手动配置和管理工作&am…

一套rk3588 rtsp服务器推流的 github 方案及记录 -02

整体方案参考上一篇博文 https://blog.csdn.net/qq_31764341/article/details/134810566 本篇博文主要介绍基于RK3588进行硬解码 还是之前的套路,我不生产代码,我只是代码的搬运工,今天我们搬运瑞芯微的官方代码,并记录下来整个调…

HBuilderX项目配置使用uview

配置uview,先安装再配置 如果没有package.json文件,先打开终端,执行命令 npm init -y 然后就会生成 package.json 安装 使用npm安装uview npm install uview-ui2.0.36 安装好之后,可以看到package.json里面已经显示版本了 查…

android studio位置相关

android studio自带一个版本的jdk,所以可以不用下载,配置jdk。 也可以自己再下载配置不同版本的jdk. SDK最好不要放在C盘,太占内存了。 .gradle,.android,.android Studio都最好移动到其他盘,占内存。 https://blog.csdn.net/Li…

Unity中Shader旋转矩阵(四维旋转矩阵)

文章目录 前言一、围绕X轴旋转1、可以使用上篇文章中,同样的方法推导得出围绕X轴旋转的点阵。2、求M~rotate~ 二、围绕Y轴旋转1、可以使用上篇文章中,同样的方法推导得出围绕Y轴旋转的点阵。2、求M~rotate~ 三、围绕Z轴旋转1、可以使用上篇文章中&#x…

2000+线下门店数字化转型,盘活近500+门店账号!

伴随着社交媒体的快速发展,消费者的注意力开始往线上转移。社交媒体在消费者购买决策过程中发挥着越来越重要的作用,逐渐成为大家获取信息、产品种草并购买下单的平台。 今年双十一期间,抖音商城多数品类销售额均呈现大幅增长趋势&#xff0c…

MPI安装与程序设计

MPI MPI(Message Passing Interface)是一种用于编写并行程序的标准和库,用于在分布式内存系统中进行消息传递和并行计算。MPI提供了一组函数和语义,用于在多个进程之间进行通信和同步,以实现并行计算和并行任务的协调…

ASP.Net实现姓名添加查询(三层架构)

目录 演示功能: 点击启动生成页面 点击搜索模糊查询 点击添加跳转新界面 点击Button添加姓名 步骤: 1、建文件 2、添加引用关系 3、根据数据库中的列写Models下的XueshengModels类 4、DAL下的DBHelper(对数据库进行操作)…

深入理解 Union 和 Union All 的区别及优化技巧

嗨,大家好,欢迎来到程序猿漠然公众号,我是漠然。 今天,我将和大家一起深入探讨数据库查询中的两个常用操作:Union 和 Union All。这两个操作虽然看起来相似,但在使用时却有一些需要注意的地方。希望通过我…

python pyinstaller打包exe 踩的坑

1.包的引用要用相对路径。 例: 我的项目架构是 G: └── PPP └── pythonProject ├── main.py └── res └── load_file.py └── calculation_function.py └── keywords_config.json 原…

现代 CPU 技术发展

介绍 这篇文章主要是介绍CPU技术的发展,包括最近几十年CPU性能提升和半导体工艺发展,当前技术发展方向。希望可以帮助软件开发者理解CPU指令集和组成运行原理、CPU性能提升的现状和瓶颈、CPU技术发展方向会如何影响软件开发/设计的框架和编程思想。 提示…

Java开发相关的技术框架,前端框架,数据库

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

AI大模型 | llama2微调手册查看ing

提示词说明 <s>[INST] <<SYS>> {{ system_prompt }} <</SYS>>{{ user_message }} [/INST]其中&#xff0c; <s> &#xff0c;<\s>&#xff0c;<<SYS>>&#xff0c;<</SYS>>&#xff0c;[INST]&#xff0c…

为什么使用手持式定向天线套装

平时基站建设的时候信号干扰排查&#xff0c;干扰定位都是常规项目。当时这些都离不开定向天线。定向天线对比全向天线对于信号的测向更加准确。当时定向天线没有频率范围特别广的&#xff0c;这时候就体现出套装的重要性了。 天线套装组成 W3系列手持定向天线手柄&#xff1…

HTML---盒子模型

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.盒子模型概述 HTML中的盒子模型是一种用于描述和布局元素的概念。每个 HTML 元素都可以被表示为一个矩形的盒子&#xff0c;这个盒子包括四个部分&#xff1a;内容区域、内边距、边框和外边距…

《2023全球IPv6支持度白皮书》近日发布

近日&#xff0c;全球IPv6论坛联合中国的下一代互联网国家工程中心面向全球发布《2023全球IPv6支持度白皮书》。白皮书显示&#xff0c;在过去一年&#xff0c;全球IPv6支持度大幅提升&#xff0c;部署应用成效显著。全球IPv6部署率超过40%的国家数量同比增长了30%&#xff0c;…

【计算机系统结构实验】实验5 多核编程(OpenMP编程)

5.1 实验目的 加深对多核处理器架构的理解&#xff1b; 掌握使用OpenMP进行多线程编程的基本方法&#xff1b; 学习Windows和OpenEuler环境下多核编程的过程和time命令&#xff1b; 5.2 实验平台 需要多核处理器的计算机和微软编程工具Visual Studio 2012。Taishan服务器&…

互联网加竞赛 python图像检索系统设计与实现

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; python图像检索系统设计与实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&#xff0c…