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
注意
單位圓(半徑為 1 的圓)的面積應為 pi,即 3.1415926… 差異是由於緩衝區邊緣的線性筆劃造成的。緩衝區具有有限數量的邊緣。增加緩衝區中的邊緣數量將使該值更接近 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
)和另一個只包含「卡羅爾花園」記錄的關係(cg
)。請注意,交集的面積以平方公尺為單位,因為我們仍然在 UTM 18 (EPSG:26918) 中工作。180990.964207547