14. Вправи з просторових з’єднань (Spatial Joins)¶
Ось нагадування про деякі функції, які ми вже розглядали. Підказка: вони будуть корисні для виконання вправ!
:command:`sum(expression)`агрегатна функція, що повертає суму для набору записів
:command:`count(expression)`агрегатна функція, що повертає кількість записів у наборі
ST_Area(geometry) повертає площу полігону
ST_AsText(geometry) повертає WKT
text
ST_Contains(geometry A, geometry B) повертає true, якщо геометрія A містить геометрію B
:command:`ST_Distance(geometry A, geometry B)`повертає мінімальну відстань між геометрією A та геометрією B
ST_DWithin(geometry A, geometry B, radius) повертає true, якщо геометрія A знаходиться на відстані радіуса або ближче до геометрії B
ST_GeomFromText(text) повертає
geometry
ST_Intersects(geometry A, geometry B) повертає true, якщо геометрія A перетинається з геометрією B
ST_Length(linestring) повертає довжину лінії (linestring)
ST_Touches(geometry A, geometry B) повертає true, якщо межа геометрії A торкається геометрії B
ST_Within(geometry A, geometry B) повертає true, якщо геометрія A знаходиться всередині геометрії B
Також пам’ятайте про таблиці, які у нас є:
nyc_census_blocks
name, popn_total, boroname, geom
nyc_streets
name, type, geom
nyc_subway_stations
name, routes, geom
nyc_neighborhoods
name, boroname, geom
14.1. Вправи¶
Яка станція метро знаходиться в „Little Italy“? Яким маршрутом метро вона обслуговується?
SELECT s.name, s.routes FROM nyc_subway_stations AS s JOIN nyc_neighborhoods AS n ON ST_Contains(n.geom, s.geom) WHERE n.name = 'Little Italy';
name | routes -----------+-------- Spring St | 6
**Які райони обслуговує поїзд 6?**(Підказка: у стовпці ``routes `` таблиц `` nyc_subway_stations `` містяться значення типу „B,D,6,V“ та „C,6“)
SELECT DISTINCT n.name, n.boroname FROM nyc_subway_stations AS s JOIN nyc_neighborhoods AS n ON ST_Contains(n.geom, s.geom) WHERE strpos(s.routes,'6') > 0;
name | boroname --------------------+----------- Midtown | Manhattan Hunts Point | The Bronx Gramercy | Manhattan Little Italy | Manhattan Financial District | Manhattan South Bronx | The Bronx Yorkville | Manhattan Murray Hill | Manhattan Mott Haven | The Bronx Upper East Side | Manhattan Chinatown | Manhattan East Harlem | Manhattan Greenwich Village | Manhattan Parkchester | The Bronx Soundview | The Bronx
Примітка
Ми використали ключове слово DISTINCT, щоб видалити дублікати зі списку результатів, коли в одному районі було більше однієї станції метро.
Після подій 11 вересня район „Battery Park“ був закритий на кілька днів. Скільки людей довелося евакуювати?
SELECT Sum(popn_total) FROM nyc_neighborhoods AS n JOIN nyc_census_blocks AS c ON ST_Intersects(n.geom, c.geom) WHERE n.name = 'Battery Park';
17153
Який район має найвищу густоту населення (осіб/км²)?
SELECT n.name, Sum(c.popn_total) / (ST_Area(n.geom) / 1000000.0) AS popn_per_sqkm FROM nyc_census_blocks AS c JOIN nyc_neighborhoods AS n ON ST_Intersects(c.geom, n.geom) GROUP BY n.name, n.geom ORDER BY popn_per_sqkm DESC LIMIT 2;
name | popn_per_sqkm -------------------+------------------ North Sutton Area | 68435.13283772678 East Village | 50404.48341332535