12. 空间关系练习¶
这里是上一节我们学到的函数的提醒。它们应该对练习有用!
:command:`sum(expression)`聚合函数用于对一组记录进行求和并返回总和
:command:`sum(expression)`聚合函数用于返回一组记录的大小
:command:`ST_Contains(geometry A, geometry B)`如果几何图形 A 包含几何图形 B,则返回 true
:command:`ST_Crosses(geometry A, geometry B)`如果几何图形A与几何图形B交叉,则返回true
:command:`ST_Disjoint(geometry A , geometry B)`如果几何图形不“空间相交”,则返回true
:command:`ST_Distance(geometry A, geometry B)`返回几何图形A和几何图形B之间的最小距离
:command:`ST_DWithin(geometry A, geometry B, radius)`如果几何图形 A 与几何图形 B 的距离为‘radius’或更近,则返回 true
:command:`ST_Equals(geometry A, geometry B)`如果几何图形 A 与几何图形 B 相同,则返回 true
:command:`ST_Intersects(geometry A, geometry B)`如果几何图形 A 与几何图形 B 相交,则返回 true
:command:`ST_Overlaps(geometry A, geometry B)`如果几何体A和几何体B有公共空间,但不完全由彼此包含,则返回true。
:command:`ST_Touches(geometry A, geometry B)`如果几何体A的边界接触几何体B,则返回true
:command:`ST_Within(geometry A, geometry B)`如果几何图形 A 在几何图形 B 内部,则返回 true
当然!我们有以下表可用:
nyc_census_blocks
blkid, popn_total, boroname, geom
nyc_streets
name, type, geom
nyc_subway_stations
name, geom
nyc_neighborhoods
name, boroname, geom
12.1. 练习¶
名为“Atlantic Commons”的街道的几何值是多少?
SELECT ST_AsText(geom) FROM nyc_streets WHERE name = 'Atlantic Commons';
MULTILINESTRING((586781.701577724 4504202.15314339,586863.51964484 4504215.9881701))
“Atlantic Commons ”位于哪个街区和行政区?
SELECT name, boroname FROM nyc_neighborhoods WHERE ST_Intersects( geom, ST_GeomFromText('LINESTRING(586782 4504202,586864 4504216)', 26918) );
name | boroname ------------+---------- Fort Green | Brooklyn
注解
“嘿,为什么从‘MULTILINESTRING’更改为‘LINESTRING’?”它们在空间上描述相同的形状,因此从单项多几何图形到单项可以节省一些击键次数。
更重要的是,我们还对坐标进行了舍入,以使其更易读,这实际上改变了结果:我们无法使用 ST_Touches() 谓词来确定哪些道路连接到 Atlantic Commons,因为坐标不再完全相同。
“Atlantic Commons” 与哪些街道相连
SELECT name FROM nyc_streets WHERE ST_DWithin( geom, ST_GeomFromText('LINESTRING(586782 4504202,586864 4504216)', 26918), 0.1 );
name ------------------ Cumberland St Atlantic Commons
大约有多少人居住在 “Atlantic Commons”(50 米范围内)
SELECT Sum(popn_total) FROM nyc_census_blocks WHERE ST_DWithin( geom, ST_GeomFromText('LINESTRING(586782 4504202,586864 4504216)', 26918), 50 );
1438