21. Ejercicios de Construcción de Geometrías¶
Aquí tienes un recordatorio de algunas de las funciones que hemos visto. Pista: ¡serán útiles para los ejercicios!
sum(expresión) función de agregación para devolver una suma de un conjunto de registros
ST_Area(geometry) devuelve el área de la geometría
ST_Centroid(geometry) devuelve el centroide de la
geometry
ST_Transform(geometry, srid) convierte las geometrías a un determinado SRID
ST_Buffer(geometry, radius) devuelve una forma de
geometry
expandidaST_Contains(geometry1, geometry2) returns true if geometry1 contains geometry2
ST_Union(geometry[]) devuelve la unión agregada de todas las geometrías en el grupo
ST_GeometryType(geometry) devuelve el tipo de geometría
ST_NumGeometries(geometry) devuelve el número de geometrías en una colección o 1 para geometrías simples
ST_Intersection(geometry, geometry) devuelve el área que las dos geometrías de entrada comparten en común
Recuerda las tablas que tenemos disponibles:
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. Ejercicios¶
¿Cuántos bloques censales no contienen su propio centroide?
SELECT Count(*) FROM nyc_census_blocks WHERE NOT ST_Contains( geom, ST_Centroid(geom) );
481
Une todos los bloques censales en una sola salida. ¿Qué tipo de geometría es? ¿Cuántas partes tiene?
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
¿Cuál es el área de un buffer de una unidad alrededor del origen? ¿Qué tan diferente es de lo que esperarías? ¿Por qué?
SELECT ST_Area(ST_Buffer('POINT(0 0)', 1));
3.121445152258052
Nota
Un círculo unitario (círculo con radio de uno) debería tener un área de pi, 3.1415926… La diferencia se debe al trazado lineal de los bordes del buffer. El buffer tiene un número finito de bordes. Aumentar el número de bordes en el buffer hará que el valor se acerque a pi, pero siempre será menor debido a la linearización.
¡Los vecindarios de Brooklyn ‘Park Slope’ y ‘Carroll Gardens’ van a la guerra! Construye un polígono que delimite una DMZ de 100 metros de ancho en la frontera entre los vecindarios. ¿Cuál es el área de la DMZ?
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;
Nota
Es fácil crear un buffer de ambos vecindarios de interés, pero para obtener la intersección se requiere un self-join de la tabla, creando una relación (
ps
) con solo el registro de «Park Slope» y otra (cg
) con solo el registro de «Carroll Gardens». Observa que el área de la intersección está en metros cuadrados porque todavía estamos trabajando en UTM 18 (EPSG:26918).180990.964207547