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
距離大西洋公園(50 公尺以內)大約住著多少人?
SELECT Sum(popn_total) FROM nyc_census_blocks WHERE ST_DWithin( geom, ST_GeomFromText('LINESTRING(586782 4504202,586864 4504216)', 26918), 50 );
1438