21. Övningar för geometrikonstruktion

Här är en påminnelse om några av de funktioner vi har sett. Tips: de bör vara användbara för övningarna!

  • sum(uttryck) aggregat för att returnera en summa för en uppsättning poster

  • ST_Area(geometry) returnerar geometrins area

  • ST_Centroid(geometry) returnerar geometrins centroid

  • ST_Transform(geometry, srid) konverterar geometrier till olika spatiala referenssystem

  • ST_Buffer(geometry, radius) returnerar en utökad geometry-form

  • ST_Contains(geometry1, geometry2) returns true if geometry1 contains geometry2

  • ST_Union(geometry[]) returnerar den aggregerade unionen av alla geometrier i gruppen

  • ST_GeometryType(geometry) returnerar typen av geometri

  • ST_NumGeometries(geometry) returnerar antalet geometrier i en samling eller 1 för enkla geometrier

  • ST_Intersection(geometry, geometry) returnerar den yta som de två inmatade geometrierna har gemensamt

Kom ihåg de tabeller vi har tillgängliga:

  • nyc_census_blocks

    • name, popn_total, boroname, geom

  • nyc_streets

    • name, type, geom

  • nyc_subway_stations

    • name, geom

  • nyc_neighborhoods

    • name, boroname, geom

21.1. Övningar

  • Hur många folkbokföringsblock innehåller inte sin egen centroid?

    SELECT Count(*)
      FROM nyc_census_blocks
      WHERE NOT
        ST_Contains(
          geom,
          ST_Centroid(geom)
        );
    
    481
    
  • Sammanfoga alla folkbokföringsblock till en enda utmatning. Vilken typ av geometri är det? Hur många delar har den?

    CREATE TABLE nyc_census_blocks_merge AS
      SELECT ST_Union(geom) AS geom
      FROM nyc_census_blocks;
    
    SELECT ST_GeometryType(geom)
      FROM nyc_census_blocks_merge;
    
    ST_MultiPolygon
    
    SELECT ST_NumGeometries(geom)
      FROM nyc_census_blocks_merge;
    
    63
    
  • Vad är arean av en buffert på en enhet runt origo? Hur mycket skiljer den sig från vad du skulle förvänta dig? Varför?

    SELECT ST_Area(ST_Buffer('POINT(0 0)', 1));
    
    3.121445152258052
    

    Observera

    En enhetscirkel (cirkel med radien ett) bör ha en area av pi, 3,1415926… Skillnaden beror på den linjära strykningen av buffertens kanter. Bufferten har ett ändligt antal kanter. Om man ökar antalet kanter i bufferten kommer värdet att närma sig pi, men det kommer alltid att vara mindre på grund av linjäriseringen.

  • Brooklynstadsdelarna ”Park Slope” och ”Carroll Gardens” går ut i krig! Konstruera en polygon som avgränsar en 100 meter bred DMZ på gränsen mellan stadsdelarna. Vad är DMZ:s area?

    CREATE TABLE brooklyn_dmz AS
      SELECT
        ST_Intersection(
          ST_Buffer(ps.geom, 50),
          ST_Buffer(cg.geom, 50))
        AS geom
      FROM
        nyc_neighborhoods ps,
        nyc_neighborhoods cg
      WHERE ps.name = 'Park Slope'
      AND cg.name = 'Carroll Gardens';
    
    SELECT ST_Area(geom) FROM brooklyn_dmz;
    

    Observera

    Det är lätt att buffra båda de intressanta stadsdelarna, men för att få fram korsningspunkten krävs en self-join av tabellen, vilket skapar en relation (ps) med bara ”Park Slope”-posten och en annan (cg) med bara ”Carroll Gardens”-posten. Observera att korsningspunktens yta är i kvadratmeter eftersom vi fortfarande arbetar i UTM 18 (EPSG:26918).

    180990.964207547