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,一经查实,立即删除!

相关文章

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…

HBuilderX项目配置使用uview

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

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(对数据库进行操作)…

现代 CPU 技术发展

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

HTML---盒子模型

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

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

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

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

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

JDBC学习,从入门到入土

JDBC引入 JDBC概念: JDBC是使用Java语言操作关系型数据库的一套API。全称:(Java DataBase Connectivity)Java数据库连接 JDBC的本质: 官方定义的一套操作所有关系型数据库的规则,即接口。 各个数据库厂…

C# WPF上位机开发(业务主流程才是核心)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面我们说了很多的c# wpf编程技术,里面有控件,有绘图,有数据库,有多线程等技术。但是他们都属于实…

数据结构之进阶二叉树(二叉搜索树和AVL树、红黑树的实现)超详细解析,附实操图和搜索二叉树的实现过程图

绪论​ “生命有如铁砧,愈被敲打,愈能发出火花。——伽利略”;本章主要是数据结构 二叉树的进阶知识,若之前没学过二叉树建议看看这篇文章一篇掌握二叉树,本章的知识从浅到深的对搜索二叉树的使用进行了介绍和对其底层…

数据结构 | 查漏补缺

目录 数据的基本单位 冒泡排序 DFS和BFS中文 Prim 比较 中序线索二叉树 顺序栈 链栈 时间复杂度 循环队列 求第K个结点的值 数据的基本单位 数据元素 循环队列sq中,用数组elem[0‥25]存放数据元素,设当前sq->front为20,sq-&g…

MySQL——内置函数

目录 一.日期函数 1.current_date() 2.current_time() 3.current_stamp() 4.date_add() 5.date_sub() 6.datediff 7.date 8.now 二.字符串函数 1.charset() 2.concat() 3.length() 4.replace 5.substring(str,postion,length) 6.instr(string,substr…

零代码助力服装行业数字化转型

内容来自演讲:涂岳俊 | 广州市衣湛国际信息科技有限公司 | CEO 摘要 这篇文章讨论了为什么选择明道云零代码平台,以及它如何帮助服装企业解决各种问题。作者分享了自己的经验,并列举了一些成功的案例来证明零代码平台的优势。文章还提到了在…

[Unity错误解决]There are 2 audio listeners in the scene.

There are 2 audio listeners in the scene. Please ensure there is always exactly one audio listener in the scene. 从组件中找出包含 Audio Listener 的,只激活一个,其他的关掉

【Amazon 实验①】使用Amazon WAF做基础 Web Service 防护

文章目录 一、实验介绍二、实验环境准备三、验证实验环境四、Web ACLs 配置 & AWS 托管规则4.1 Web ACLs 介绍4.2 Managed Rules 托管规则4.3 防护常见威胁类型(sql注入,XSS)4.4 实验步骤4.4.1 创建Web ACL4.4.2 测试用例4.4.3 测试结果4…

融资项目——vue之路由实现

通俗来说&#xff0c;路由就是锚点<a>的升级版。下面举一个例子来了解&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><div id"list"><h1…