21. 几何构造练习¶
以下是一些我们已经见过的函数的提醒。提示:它们应该对练习很有用!
sum(expression) 聚合以返回一组记录的总和
ST_Area(geometry) 返回几何图形的面积
ST_Centroid(geometry) 返回
geometry
形心ST_Transform(geometry, srid) 将
geometries
转换为不同的空间参考系统ST_Buffer(geometry, radius) 返回一个扩展的
geometry
形状ST_Contains(geometry1, geometry2) 如果 geometry1 包含 geometry2,则返回 true
ST_Union(geometry[]) 返回组中所有几何图形的聚合并集
ST_GeometryType(geometry) 返回几何图形的类型
ST_NumGeometries(geometry) 返回集合中的几何图形数量,或对于简单几何图形返回 1
ST_Intersection(geometry, geometry) 返回两个输入几何图形共有的区域
记住我们可用的表
nyc_census_blocks
name, popn_total, boroname, geom
nyc_streets
name, type, geom
nyc_subway_stations
name, geom
nyc_neighborhoods
name, boroname, geom
21.1. 练习¶
有多少个人口普查区块不包含它们自己的形心?
SELECT Count(*) FROM nyc_census_blocks WHERE NOT ST_Contains( geom, ST_Centroid(geom) );
481
将所有人口普查区块合并成一个输出。它是什么类型的几何图形?它有多少部分?
CREATE TABLE nyc_census_blocks_merge AS SELECT ST_Union(geom) AS geom FROM nyc_census_blocks; SELECT ST_GeometryType(geom) FROM nyc_census_blocks_merge;
ST_MultiPolygon
SELECT ST_NumGeometries(geom) FROM nyc_census_blocks_merge;
63
原点周围一个单位缓冲区的面积是多少?它与您的预期有多大差异?为什么?
SELECT ST_Area(ST_Buffer('POINT(0 0)', 1));
3.121445152258052
注意
一个单位圆(半径为一的圆)的面积应该是 pi,即 3.1415926… 差异是由于缓冲区边缘的线性描边。缓冲区具有有限数量的边缘。增加缓冲区中的边缘数量将使值更接近 pi,但由于线性化,它将始终小于 pi。
布鲁克林的“公园坡”和“卡罗尔花园”社区即将开战!构建一个多边形,描绘出这两个社区边界之间 100 米宽的非军事区。非军事区的面积是多少?
CREATE TABLE brooklyn_dmz AS SELECT ST_Intersection( ST_Buffer(ps.geom, 50), ST_Buffer(cg.geom, 50)) AS geom FROM nyc_neighborhoods ps, nyc_neighborhoods cg WHERE ps.name = 'Park Slope' AND cg.name = 'Carroll Gardens'; SELECT ST_Area(geom) FROM brooklyn_dmz;
注意
缓冲两个感兴趣的区域很容易,但要获得交集需要对表进行自连接,创建一个关系(
ps
)只包含“Park Slope”记录,另一个(cg
)只包含“Carroll Gardens”记录。请注意,交集的面积以平方米为单位,因为我们仍在使用 UTM 18(EPSG:26918)坐标系。180990.964207547