12. Ejercicios de relaciones espaciales

Aquí tienes un recordatorio de las funciones que vimos en la sección anterior. ¡Deberían ser útiles para los ejercicios!

  • sum(expresión) función de agregación para devolver una suma de un conjunto de registros

  • count(expression): devolver la cantidad de filas (registros) que retorna una consulta

  • ST_Contains(geometry A, geometry B) devuelve verdadero si la geometría A contiene a la geometría B

  • ST_Crosses(geometry A, geometry B) devuelve verdadero si la geometría A cruza a la geometría B

  • ST_Disjoint(geometry A , geometry B) devuelve verdadero si las geometrías no «intersectan espacialmente»

  • ST_Distance(geometría A, geometría B) devuelve la distancia mínima entre la geometría A y la geometría B

  • ST_DWithin(geometry A, geometry B, radius) devuelve verdadero si la geometría A está a una distancia igual o menor que radius de la geometría B

  • ST_Equals(geometry A, geometry B) devuelve verdadero si la geometría A es igual a la geometría B

  • ST_Intersects(geometry A, geometry B) devuelve verdadero si la geometría A intersecta la geometría B

  • ST_Overlaps(geometry A, geometry B) devuelve verdadero si la geometría A y la geometría B comparten espacio, pero no están completamente contenidas una en la otra.

  • ST_Touches(geometry A, geometry B) devuelve verdadero si el límite de la geometría A toca la geometría B

  • ST_Within(geometry A, geometry B) devuelve verdadero si la geometría A está dentro de la geometría B

También recuerde las tablas que tenemos disponibles:

  • 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. Ejercicios

  • ¿Cuál es el valor de geometría para la calle llamada “Atlantic Commons”?

    SELECT ST_AsText(geom)
      FROM nyc_streets
      WHERE name = 'Atlantic Commons';
    
    MULTILINESTRING((586781.701577724 4504202.15314339,586863.51964484 4504215.9881701))
    
  • ¿Qué vecindario y distrito (borough) contiene a Atlantic Commons?

    SELECT name, boroname
    FROM nyc_neighborhoods
    WHERE ST_Intersects(
      geom,
      ST_GeomFromText('LINESTRING(586782 4504202,586864 4504216)', 26918)
    );
    
        name    | boroname
    ------------+----------
     Fort Green | Brooklyn
    

    Nota

    «¿Por qué cambiaste de “MULTILINESTRING” a “LINESTRING”?» Espacialmente describen la misma forma, así que pasar de una geometría múltiple con un solo elemento a una geometría simple ahorra algunos caracteres.

    Más importante aún, redondeamos las coordenadas para que sean más fáciles de leer, lo cual sí cambia los resultados: no pudimos usar el predicado ST_Touches() para descubrir con qué calles se une Atlantic Commons, porque las coordenadas ya no son exactamente iguales.

  • ¿Con qué calles se une Atlantic Commons?

    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
  • Aproximadamente cuántas personas viven en (o dentro de 50 metros de) Atlantic Commons?

    SELECT Sum(popn_total)
      FROM nyc_census_blocks
      WHERE ST_DWithin(
       geom,
       ST_GeomFromText('LINESTRING(586782 4504202,586864 4504216)', 26918),
       50
      );
    
    1438