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 expandida

  • ST_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