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
centroidST_Transform(geometry, srid) konverterar
geometrier
till olika spatiala referenssystemST_Buffer(geometry, radius) returnerar en utökad
geometry
-formST_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