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
    
    _images/atlantic_commons.jpg
  • 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