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からの距離が radius 未満の場合には 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' に変更したのですか?」空間的に同じ形状を記述して、マルチ系ジオメトリ一つ分から単一ジオメトリに変更すると、若干のキーストロークの節約が可能です。

    さらに重要なことに、読みやすくするために座標値を丸めましたが、本当なら結果が変化します。座標値が確実には同じにならなかったので、Atlantic Commons に参加する道路がどれかを発見するために ST_Touches() を使うことができません。

  • Atlantic Commons はどのストリートに参加していますか?

    SELECT name
    FROM nyc_streets
    WHERE ST_DWithin(
      geom,
      ST_GeomFromText('LINESTRING(586782 4504202,586864 4504216)', 26918),
      0.1
    );
    
         name
    ------------------
     Cumberland St
     Atlantic Commons
    
    _images/atlantic_commons.jpg
  • Atlantic Commons (の 50m 以内) に住んでいる人は約何人ですか?

    SELECT Sum(popn_total)
      FROM nyc_census_blocks
      WHERE ST_DWithin(
       geom,
       ST_GeomFromText('LINESTRING(586782 4504202,586864 4504216)', 26918),
       50
      );
    
    1438