12. Övningar för spatiala relationer¶
Här kommer en påminnelse om de funktioner som vi såg i förra avsnittet. De bör vara användbara för övningarna!
sum(uttryck) aggregat för att returnera en summa för en uppsättning poster
count(uttryck) aggregat för att returnera storleken på en uppsättning poster
ST_Contains(geometry A, geometry B) returnerar sant om geometri A innehåller geometri B
ST_Crosses(geometry A, geometry B) returnerar sant om geometri A korsar geometri B
ST_Disjoint(geometri A , geometri B) returnerar sant om geometrierna inte ”korsar varandra spatialt”
ST_Distance(geometry A, geometry B) returnerar det minsta avståndet mellan geometri A och geometri B
ST_DWithin(geometry A, geometry B, radius) returnerar true om geometri A ligger på radieavstånd eller mindre från geometri B
ST_Equals(geometri A, geometri B) returnerar sant om geometri A är samma sak som geometri B
ST_Intersects(geometry A, geometry B) returnerar sant om geometri A skär geometri B
ST_Overlaps(geometry A, geometry B) returnerar true om geometri A och geometri B delar utrymme, men inte är helt inneslutna av varandra.
ST_Touches(geometry A, geometry B) returnerar sant om gränsen för geometri A berör geometri B
ST_Within(geometri A, geometri B) returnerar sant om geometri A ligger inom geometri B
Tänk också på de tabeller vi har tillgängliga:
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. Övningar¶
Vad är geometrivärdet för gatan med namnet ”Atlantic Commons”?
SELECT ST_AsText(geom) FROM nyc_streets WHERE name = 'Atlantic Commons';
MULTILINESTRING((586781.701577724 4504202.15314339,586863.51964484 4504215.9881701))
Vilket område och vilken stadsdel ligger Atlantic Commons i?
SELECT name, boroname FROM nyc_neighborhoods WHERE ST_Intersects( geom, ST_GeomFromText('LINESTRING(586782 4504202,586864 4504216)', 26918) );
name | boroname ------------+---------- Fort Green | Brooklyn
Observera
”Varför bytte du från en ’MULTILINESTRING’ till en ’LINESTRING’?” Spatialt beskriver de samma form, så att gå från en multi-geometri med ett objekt till en singleton sparar några tangenttryckningar.
Ännu viktigare är att vi också avrundade koordinaterna för att göra dem mer lättlästa, vilket faktiskt förändrar resultaten: vi kunde inte använda ST_Touches()-predikatet för att ta reda på vilka vägar som ansluter till Atlantic Commons, eftersom koordinaterna inte är exakt desamma längre.
Vilka gator ansluter Atlantic Commons till?
SELECT name FROM nyc_streets WHERE ST_DWithin( geom, ST_GeomFromText('LINESTRING(586782 4504202,586864 4504216)', 26918), 0.1 );
name ------------------ Cumberland St Atlantic Commons
Ungefär hur många människor bor på (inom 50 meter från) Atlantic Commons?
SELECT Sum(popn_total) FROM nyc_census_blocks WHERE ST_DWithin( geom, ST_GeomFromText('LINESTRING(586782 4504202,586864 4504216)', 26918), 50 );
1438