12. 空間關係練習

以下是關於我們在上一節看到的函數的提醒。它們對於這些練習題應該會很有用!

  • sum(expression) aggregate 可回傳一組記錄的總和

  • count(expression) aggregate 可回傳一組記錄的大小

  • 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 之間的距離小於等於半徑,則會傳回 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」?」在空間上,它們描述相同的形狀,所以從單項目多重幾何轉換為單例可以減少幾次擊鍵。

    更重要的是,我們也四捨五入坐標以使其更容易閱讀,這實際上會改變結果:我們無法使用 ST_Touches() 謂詞來找出連接 Atlantic Commons 的道路,因為坐標現在已經不完全相同了。

  • 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
  • 距離大西洋公園(50 公尺以內)大約住著多少人?

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