空间数据库学习(一)—— PostGIS 简单空间查询

105 阅读2分钟

文章同步更新于我的个人博客:松果猿的博客,欢迎访问获取更多技术分享。

同时,您也可以关注我的微信公众号:松果猿的代码工坊,获取最新文章推送和编程技巧。

首先创建数据库:

执行以下语句安装postgis扩展:

CREATE EXTENSION postgis;

或者右键点击数据库的扩展>创建扩展

数据库建好后,下面我们导入shp数据,在开始菜单找到PostGIS Shapefile and DBF Loader Exporter,打开它,准备将我们的数据导入数据库:

在弹窗中点击View connection details连接我们刚刚创建的数据库

输入用户名密码等等:

在日志中看到Connection succeeded即成功:

点击Add File将我们的数据添加进去:

注意这里的文件路径不能有中文,点击Import导入数据库

查看日志出现Shapefile import completed即导入成功

下面我们来到查询工具执行语句

(1) 找出江苏省的邻省;

SELECT p1.name FROM province p1,province p2 
WHERE ST_Touches(p1.geom,p2.geom) AND p2.name='江苏省

同理,以下是其他相关查询语句,熟悉不同类型的空间关系函数及使用方法:

(2) 找出京广线所经过的省份;

select railway.name, province.name from railway, province where
ST_Crosses(railway.geom,province.geom) and railway.name='京广线' 

(3) 找出距离每条铁路最近的省会城市

SELECT c1.name , r.name FROM city c1, railway r 
WHERE ST_Distance(c1.geom,r.geom)<ALL(SELECT ST_Distance(c2.geom,r.geom) 
FROM city C2 WHERE c1.name<>c2.name)  

(4) 距离京广线 100 公里之内的的省会城市

SELECT c.name FROM railway r,city c 
WHERE ST_Within(c.geom,ST_Buffer(r.geom,100000)) and r.name='京广线'

(5) 列出每个省份的名字和面积

SELECT p.name, ST_Area(p.geom) Area FROM province p

(6) 求出每条铁路经过的省份及在其境内的长度 intersects & intersection

SELECT r.name,p.name,ST_Length(ST_Intersection(r.geom,p.geom)) Length FROM 
railway r,province p WHERE ST_Crosses(r.geom,p.geom) and ST_IsValid(p.geom)=true

(7) 每个城市到北京的距离

SELECT c1.name,ST_Distance(c1.geom,c2.geom) Distance 
FROM city c1, city c2 WHERE c2.name='北京'

(8) 按照邻省数目列出所有省份;

SELECT p1.name, Count(p2.name) FROM province p1, province p2 
WHERE ST_Touches(p1.geom,p2.geom) 
GROUP BY p1.name ORDER BY Count(p2.name)

(9) 查询只有一个邻省的省份;

SELECT p1.name, Count(p2.name) FROM province p1, province p2 
WHERE ST_Touches(p1.geom,p2.geom) 
GROUP BY p1.name HAVING Count(p2.name)=1 

(10) 查询邻省最多的省份。

第 1 步:

CREATE VIEW Neighbor AS 
SELECT p1.name,Count(p2.name) num_neighbors FROM province p1, province p2 
WHERE ST_Touches(p1.geom, p2.geom) GROUP BY p1.name 

第 2 步:

SELECT name, num_neighbors FROM Neighbor WHERE 
num_neighbors=(SELECT Max(num_neighbors) FROM Neighbor)

本文的相关shp数据下载链接:github.com/songguo1/po…