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