Lo he hecho:
- una mesa
crashes
con datos sobre los accidentes de tráfico en nyc - una mesa
locations
con datos sobre la ubicación de las escuelas de NYC
Ambos tienen columnas de latitud y longitud.
Estoy tratando de generar una tabla con una fila para cualquiera de los dos: (a) cada accidente ocurrido a más de 400 pies de una escuela O (b) cada accidente ocurrido a menos de 400 pies de una escuela (con filas adicionales para cada accidente si ocurrió a menos de 400 pies de más de una escuela)
Esta es mi pregunta:
SELECT
cr.collision_id,
cr.crash_date,
cr.crash_time,
cr.borough,
l.location_code,
l.name1,
l.address,
cr.longitude,
cr.latitude,
ST_MAKEPOINT(cr.longitude, cr.latitude)::geography AS crash_point,
l.longitude,
l.latitude,
ST_MAKEPOINT(l.longitude, l.latitude)::geography AS school_point
FROM crashes AS cr
LEFT JOIN locations AS l
ON ST_DWithin(ST_MAKEPOINT(l.longitude, l.latitude)::geography,
ST_MAKEPOINT(cr.longitude, cr.latitude)::geography, 121.92)
WHERE cr.crash_date BETWEEN '2017-07-01' AND '2019-06-30'
AND ((cr.crash_date BETWEEN (l.year1-1||'/07/01')::date AND (l.year1||'/6/30')::date) OR l.year1 IS NULL)
AND cr.latitude IS NOT NULL
AND cr.latitude <> 0;
Está tardando mucho en ejecutarse, y mientras lo hace me aparece una y otra vez el siguiente mensaje de error:
Los valores de las coordenadas se han coaccionado en el rango [-180 -90, 180 90] para GEOGRAPHY
Cuando consulto sólo los puntos de lat/longs/makepoints para crashes
y, por separado, para locations
No me sale ese error y vuelven sin problemas. Eso sugiere que el problema está en el join, pero no sé qué tiene de malo.
He comprobado todas las lat/longs de esos choques en excel y están dentro de los rangos adecuados (excepto los que excluí en la cláusula WHERE). No hay latitudes en la columna de longitudes o viceversa.
Cuando ejecuto esto con otros rangos de fechas más pequeños (por ejemplo, 2021-06-30 a 2021-07-01), no obtengo el error y devuelve bien.
¿Alguna idea de por qué puede ocurrir esto?
Además, ¿tengo que preocuparme de especificar un SRID? He leído aquí que si no se especifica un SRID, se pone por defecto el 4326. Así que asumo que eso está ocurriendo con mi consulta, que espero que esté bien.
Un problema aquí es que no estoy seguro de qué SRID utilizó la agencia con el locations
lat/longs (he preguntado). Y 1/10 de las lat/longs en locations
Tuve que encontrarme en google maps, que aparentemente utiliza un SRID diferente. No estoy seguro de que esto sea un problema. (Sé que crashes
utiliza 4326.)
Intenté añadir ST_SetSRID( ... , 4326) alrededor de ST_MakePoints y ST_DWithin y obtuve el mismo resultado.
Algunas de las lat/longs tienen diferentes números de caracteres después de los puntos decimales. No sé si eso importa.