21. ジオメトリ構築演習¶
これまでに見た全ての関数のリマインダです。演習に役立つはずです!
sum(expression) はレコードの集合の合計を返す集約関数です
ST_Area(geometry) はジオメトリの面積を返します
ST_Centroid(geometry)
geometry
の重心を返しますST_Transform(geometry, srid) は
geometries
を異なる空間参照系に変換しますST_Buffer(geometry, radius) は
geometry
形状を拡張したものを返しますST_Contains(geometry1, geometry2) returns true if geometry1 contains geometry2
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
原点から周囲1単位の範囲内の面積はいくつでしょうか? 予想とどれぐらい違いましたか? また理由は何でしょう?
SELECT ST_Area(ST_Buffer('POINT(0 0)', 1));
3.121445152258052
注釈
単位円 (半径1単位の円) の面積は π (3.1415926...) となります。結果との差は、バッファのエッジの線形描画によるものです。バッファは有限数のエッジでできています。バッファ内のエッジ数の増加でπに近づいていきますが、線形化のため常に小さくなります。
ブルックリンの ‘Park Slope’ 地区と ‘Carroll Gardens’ 地区とが戦争を起こしました! 地区間の境界に100m幅のDMZ (中立地帯) を描くポリゴンを構築します。DMZ の面積はいくらでしょう?
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;
注釈
両方の対象地区のバッファを生成すると簡単ですが、共有領域の抽出にはテーブルの自己結合が必要です。"Park Slope" で一方のリレーション (
ps
) を作り、"Carroll Gardens" でもう一方のリレーション (cg
) を作ります。UTM 18 (EPSG:26918) を使っているので共有領域の面積は平方メートル単位であることにご注意下さい。180990.964207547