PostGIS之空间连接
1. 概述
PostGIS 是PostgreSQL数据库一个空间数据库扩展,它添加了对地理对象的支持,允许在 SQL 中运行空间查询
PostGIS官网:About PostGIS | PostGIS
PostGIS官方教程:PostGIS 简介 — Introduction to PostGIS
PostGIS相关教程:文章目录汇总 - 知乎 (zhihu.com)
本文基于官方教程描述PostGIS中的空间连接
数据准备可参考:
数据介绍可参考:
2. 空间连接
空间连接是基于空间关系进行表连接的数据表连接操作
在简单的空间关系中我们查询Broad St地铁站所在的社区使用的sql语句为:
-- 1. 查询Broad St的位置
SELECT ST_AsEWKT(geom) FROM nyc_subway_stations WHERE name = 'Broad St';
-- 空间位置为 SRID=26918;POINT(583571.9059213118 4506714.341192182)
-- 2. 查询包含这个位置的社区
SELECT name FROM nyc_neighborhoods WHERE ST_Contains(geom, ST_GeomFromText('SRID=26918;POINT(583571.9059213118 4506714.341192182)'));
使用空间连接,将表连接起来,只需一次查询即可:
SELECT nyc_subway_stations.name, nyc_neighborhoods.name
FROM nyc_subway_stations
JOIN nyc_neighborhoods
ON ST_Contains(nyc_neighborhoods.geom, nyc_subway_stations.geom)
WHERE nyc_subway_stations.name = 'Broad St';

2.1 连接与汇总
使用JOIN和GROUP BY实现空间表的连接与汇总
比如:查询Manhattan各个社区的人口和种族构成?
使用简单查询,可以这样实现:
-- 1. 查询Manhattan的社区和空间位置
SELECT name, geom FROM nyc_neighborhoods WHERE boroname = 'Manhattan';
-- 结果:East Village...
-- 2. 查询每个社区的人口
SELECT SUM(nyc_census_blocks.popn_total) FROM nyc_census_blocks WHERE ST_Intersects(nyc_census_blocks.geom, '0106000020266900000100000001030000000100000008000000E94FC98149DE214196EF19D1FE3351414271D0B694E821416A36040C4E33514144C142A7CDE721410BCEE0D1A63251412D3D82D36FE72141C6594A6E713251414DA687822AE621415F9731007932514177DB296DE4DA2141B7FDD828003351412DB80BB38EDB2141C844CE8054335141E94FC98149DE214196EF19D1FE335141');
-- 结果:82266
-- 3. 查询每个社区的黑人与白人数量计算比例
SELECT SUM(nyc_census_blocks.popn_white)/82266, SUM(nyc_census_blocks.popn_black)/82266 FROM nyc_census_blocks WHERE ST_Intersects(nyc_census_blocks.geom, '0106000020266900000100000001030000000100000008000000E94FC98149DE214196EF19D1FE3351414271D0B694E821416A36040C4E33514144C142A7CDE721410BCEE0D1A63251412D3D82D36FE72141C6594A6E713251414DA687822AE621415F9731007932514177DB296DE4DA2141B7FDD828003351412DB80BB38EDB2141C844CE8054335141E94FC98149DE214196EF19D1FE335141');
-- 结果:0.63, 0.08
使用空间连接和汇总,只需查询一次即可:
SELECT nyc_neighborhoods.name, SUM(nyc_census_blocks.popn_white)/SUM(nyc_census_blocks.popn_total),
SUM(nyc_census_blocks.popn_black)/SUM(nyc_census_blocks.popn_total)
FROM nyc_census_blocks
JOIN nyc_neighborhoods
ON ST_Intersects(nyc_census_blocks.geom, nyc_neighborhoods.geom)
WHERE nyc_neighborhoods.boroname = 'Manhattan'
GROUP BY nyc_neighborhoods.name;

3. 参考资料
[1]13. Spatial Joins — Introduction to PostGIS
[2]PostGIS教程九:空间连接 - 知乎 (zhihu.com)
PostGIS之空间连接的更多相关文章
- 建议入门-用ArcMap进行空间查询与空间连接
1.打开arcmap并导入数据(如本图导入美国地图(usa.mxd)): 2.空间查询操作,在地图上的某片区域点击右键,得到下图,点击identify,此时我在阿拉斯加上面点击的 地图会闪现一下被查询 ...
- 简述ArcGIS的空间连接(Spatial Join)与字段映射(Field Map)操作
插个广告,制作ArcGIS的Tool工具学习下面的教程就对了:零基础学习Python制作ArcGIS自定义工具 牢骚一下 在使用ArcMap进行空间连接操作的时候,往往会有两种特殊需求,其一是连接重叠 ...
- ArcGis面要素空间连接,取相交面积最大者 C#
核心代码: #region JoinWork_IntersectMax private void CreateNewFields_IntersectMax(IFeatureClass destFeat ...
- Arcgis 10.1中空间连接功能
空间链接的作用:将面上的所有点的值加起来取平均值.赋值给面属性.(我们可以定义右击——定义合并规则 连接要素的字段映射参数中指定的合并规则仅适用于连接要素中的属性,且仅适用于多个要素与目标要素匹配 ( ...
- Arcmap 空间连接,在通过面包含面的空间关系做属性关联的时候,发生关联冗余的问题。
处理过程: (1)用 空间关联 工具实现 面与面的 空间和属性关联. (2) 问题描述: 一个子面要素对应多个父面要素,出现数据冗余. 问题根源: 解决办法: 取子面要素的 中心点,在用中心点和 ...
- QSQL导出mapfile和mapfile中PostGIS连接的一点心得
昨天弄QSQL导出mapfile,一直遇到下图的错误 原因是QGIS在渲染图层时候使用了新的符号,在图层上右键-属性,如下图将符号修改就OK了 然后我尝试使用QGIS连接本机PostGIS数据,结果老 ...
- MongoDB的地埋空间数据存储、空间索引以及空间查询
一.关于MongoDB 在众多NoSQL数据库,MongoDB是一个优秀的产品.其官方介绍如下: MongoDB (from "humongous") is a scalable, ...
- geotrellis使用(三十)使用geotrellis读取PostGIS空间数据
前言 最近事情很多,各种你想不到的事情--such as singing and dancing--再加上最近又研究docker上瘾,所以geotrellis看上去似乎没有关注,其实我一直在脑中思考着 ...
- 超图supermap sdx数据库用sql实现空间查询
在此介绍用sql对超图的空间数据库(sdx)进行空间查询,优点如下: 1.超图推荐的方式是用iobject,此方法要引入iobject 2.超图另一个推荐的方式是用iserver的REST接口,但we ...
- (数据科学学习手札74)基于geopandas的空间数据分析——数据结构篇
本文对应代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 geopandas是建立在GEOS.GDAL.P ...
随机推荐
- kestrel网络编程--开发redis服务器
1 文章目的 本文讲解基于kestrel开发实现了部分redis命令的redis伪服务器的过程,让读者了解kestrel网络编程的完整步骤,其中redis通讯协议需要读者自行查阅,文章里不做具体解析. ...
- python前言
目录 一.typora软件以及markdown语法介绍 1.输入标题的两种方法 2.无序列表 3.有序列表 4.在typora里插入多行代码块 5.制作表格 6.表情包 7.链接 8.Typora查看 ...
- QT+VS 调用基于Google Breakpad的跨平台Qt崩溃异常捕获调用方案
方案一.基于Google Breakpad的跨平台Qt崩溃异常捕获调用方案 首先上博客:Windows下Qt生成dump文件并定位bug(基于qBreakpad) 这个地方使用的是一个叫qBreakP ...
- SQLMap入门——获取数据库的所有用户
列出数据库中的所有用户 在当前用户有权读取包含所有用户的表的权限时,使用该命令列出所有管理用户 python sqlmap.py -u http://localhost/sqli-labs-maste ...
- LeetCode HOT 100:最大子数组和
题目:53. 最大子数组和 题目描述: 给你一个整数数组,在该数组的所有子数组中,找到一个子数组中所有元素相加和最大,返回这个最大的和.子数组就是一个数组中,由一个或几个下标连续的元素,组成的小数组, ...
- python循环结构之while循环
在python中,除了for循环,还有一个while循环 for循环:循环次数是明确了的 while循环:循环次数不确定,循环停止条件由用户自定义 # while语句结构 while 判断条件: 执行 ...
- Error: Could not get apiVersions from Kubernetes
问题 部署pod时遇到问题 # helm install chart.tgz Error: Could not get apiVersions from Kubernetes: unable to r ...
- 1_使用swiper数组对象循环图片遇到的问题
今天在练习微信小程序的swiper组件时,想用列表循环出图片,发现图片一直没出来,控制台也没有报错,后来仔细一看,原来是语法格式写错了. 以下是我列表循环踩过的坑: 一:微信小程序的列表循环和vue的 ...
- [cocos2d-x]关于3.x的触摸机制
触摸机制的概念 通过对要监听触摸的节点进行注册,然后自定义相应的触摸函数,由事件监听器实现对触摸的监听并且实现相应的响应动作. 触摸的分类 单点触摸 下面是实现单点触摸监听的步骤: //第一步:先创建 ...
- 小项目中vuex使用频率不太多我们完全可以用provide inject 来代替可以让项目小不少
在一般小型项目中vuex实在是太浪费了所以我们可以用到 vue中的provide inject 代替 1.在vue3中我们先另起一个 文件创建一个全局的状态和方法的地方(如果你的全局状态特别的多记得要 ...