12. 空间关系练习¶
以下是对上一节中我们所见函数的回顾。它们应该对练习很有帮助!
sum(expression) 聚合以返回一组记录的总和
count(expression) 聚合以返回一组记录的大小
ST_Contains(geometry A, geometry B) 如果几何 A 包含几何 B,则返回 true
ST_Crosses(geometry A, geometry B) 如果几何 A 与几何 B 相交,则返回 true
ST_Disjoint(geometry A , geometry B) 如果几何体不“空间相交”,则返回 true
ST_Distance(geometry A, geometry B) 返回几何 A 和几何 B 之间的最小距离
ST_DWithin(geometry A, geometry B, radius) 如果几何 A 与几何 B 的距离小于或等于半径,则返回 true
ST_Equals(geometry A, geometry B) 如果几何 A 与几何 B 相同,则返回 true
ST_Intersects(geometry A, geometry B) 如果几何 A 与几何 B 相交,则返回 true
ST_Overlaps(geometry A, geometry B) 如果几何 A 和几何 B 共享空间,但彼此不完全包含,则返回 true。
ST_Touches(geometry A, geometry B) 如果几何 A 的边界与几何 B 相切,则返回 true
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() 谓词来找出哪些道路与大西洋公地相连,因为坐标不再完全相同。
大西洋公地与哪些街道相连?
SELECT name FROM nyc_streets WHERE ST_DWithin( geom, ST_GeomFromText('LINESTRING(586782 4504202,586864 4504216)', 26918), 0.1 );
name ------------------ Cumberland St 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