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