本节重点:数据库中利用SQL语句对职住数据进行分组汇总,shapefile文件导入数据库的两种方法,并在数据库中进行点层与面层的空间连接,然后基于行政区汇总数据

一、基于基站汇总

打开Navigat,连接数据库xian,找到之前导入的原始职住数据如下图

c683b5324ad7b6ad826ae28caa0d66ef.png

我们需要得到每个基站的居住和就业数据
在“查询”界面中执行以下语句,即可创建新表hsum,利用group by,将xian_homework2基于home字段分组汇总,其中SUM表示结果是同类数值的相加总和。同理,再次基于work汇总,得到表wsum。

CREATE TABLE jizhan_h AS

SELECT home, SUM(sum) AS hsum

FROM xian_homework2

GROUP BY home

CREATE TABLE jizhan_w AS

SELECT work, SUM(sum) AS hsum

FROM xian_homework2

GROUP BY work

成功后得到两个新表如下图

db9b223caf4aca5563d80e4eaf598545.png

b02ad22f9e1a53467a9df8f9c14d8a2e.png

二、shapefile导入数据库

方法一:PostGis

1、扩展template_postgis模版

template_postgis模版是创建空间数据库的必要手段,没有这个模版没办法导入shp文件,对于每个数据库执行一次即可
在Navicat的查询面板中执行以下代码(官网可找到这几条扩展语句)

-- Enable PostGIS (includes raster)

CREATE EXTENSION postgis;

-- Enable Topology

CREATE EXTENSION postgis_topology;

-- fuzzy matching needed for Tiger

CREATE EXTENSION fuzzystrmatch;

-- Enable US Tiger Geocoder

CREATE EXTENSION postgis_tiger_geocoder;

2、shapefile文件导入数据库

从电脑程序中找到postgis插件并打开(若安装postgre时没有顺带安装,则需单独安装postgis)

96988353b98791718ee6efd10608179d.png

连接数据库

8af79a5bf82b1d3419d528bc25e057ce.png

连接成功后如下图

3963fc3adaed272dbe77192f3019aefc.png

点击Add File,选择西安的基站点、区县面和街道面这三个shapefile注意shapefile的存储路径不能出现中文,否则导入失败

27d49482ac097d6da48876a6a43a4ef2.png

5b3d4d15f7631e6aa819398ff4071bf8.png

注意
坐标系SRID将0改为与原shp文件的地理坐标系一致(坐标系编号可在GIS目录列表中该shp上右键属性查看,这里的4326代表地理坐标GCS_WGS_1984),否则计算结果可能不对
在Schema中设置导入的模式

67d7159517186497a76bd91715804532.png

点击Import,成功后如下图

3f1a21ff502e6801cb8c46eaca195129.png

在数据库中选择的模式下的表右键刷新后,可以找到这三个shp的属性表

523d5d6ab19face4a6562c2aac2fe3d4.png

方法二:Qgis

该方法导入的结果不易出错,因此更推荐使用

1、软件下载安装

在Qgis官网上下载适合版本的软件并安装,注意过程中要全部勾选扩展选项https://www.qgis.org/en/site/forusers/download.html

87f12149f330b83fc7ccd92a8343a1d9.png

2、Qgis连接数据库

先扩展postgis模板,在程序中打开Qgis,在PostGIS上右键New Connection,依次输入连接的信息

a8e908ff0efed0b6148ae872dbd534ea.png

533b1faa48fe286c7bb99f7653edd171.png

7d3bfdac02b6cf8a2bf56976dfa527c6.png

连接成功后可在下拉中找到该连接

0cc0f46e9a2ceb693276e8c3707945a6.png

3、shapefile文件导入数据库

在菜单栏中选择Database——DB Manager

0da55bbfe5d1f3749ed33ff7613b4d45.png

再次连接数据库

3d9061531ed94deee8facc4c4c513ae0.png

点击Import Layer/File,选择基站的shp文件

1d3eb893547fad73bd6729fb1e8ca6fa.png

选择要导入的模式,输入表的名称,其他设置如下图所示:

3caa8eaa5bb16645ff2284507f5007cd.png

3f4596865966d414d363731219f74036.png

导入成功后,打开Navicat,在该数据库和模式的表上右键刷新,即可找到导入的shp表
同理,将区县、街道面层的shp导入

99e1fe2763979c80b96bf1053090d9f6.png

三、基于区县、街道层面汇总数据

1、点与面层的空间连接

在查询界面执行该语句,
其中jizhan为手机基站分布点层, xian_qx为区县分区面层,xzqmc为区县名称字段,该语句判断点是在哪个面上,并将所在面层的字段赋值在点层
成功后刷新得到下表

SELECT jizhan.*, xian_qx.xzqmc

into jizhan1

FROM jizhan, xian_qx

WHERE st_intersects ( jizhan.geom, xian_qx.geom ) = 'True';

2f42ae0c6e4ec0a973b6ab76692ddaf1.png

同理,可联结街道的面层信息

95bab55c33a321f4191c327f63b62294.png

2、职住数据联结后分组汇总

将表hsum和wsum中的职住数据联结到带有区县信息的基站表,方法如下:
依次执行以下语句,运用LEFT JOIN(左联结),即可将之前汇总的职住人数表的数据连接上去,其中jzbm = home表示两个表中进行连接的字段

CREATE TABLE jizhan_hw1 AS

SELECT jzbm,xzqmc AS qx,hsum

FROM jizhan1 LEFT JOIN jizhan_h on jzbm = home

CREATE TABLE jizhan_hw2 AS

SELECT "jizhan_hw1".*,wsum

FROM jizhan_hw1 LEFT JOIN jizhan_w on jzbm = work

于是可以得到带有职住数据的基站属性表如下图

be2139ad204b4e92b4771ac3dcd09227.png

接着运用group by语句基于区县字段分组汇总,得到每个区县居住和就业岗位的总数:

CREATE TABLE qx_hsumwsum AS

SELECT qx, SUM(hsum) AS qx_hsum,SUM(wsum) AS qx_wsum

FROM jizhan_hw2

GROUP BY qx

51c286ef4da157dbd0c8f77da6375415.png

同理,可以将职住数据连接到带有街道信息的基站表中,基于街道名称分组汇总后,就能得到每个街道居住和就业岗位的总数

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐