2 votos

Evitar este error de PostGIS: "Los valores de las coordenadas fueron coaccionados en el rango [-180 -90, 180 90] para GEOGRAPHY"

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.

3voto

BWW Puntos 302

Para ayudarle a entender y evitar

Los valores de las coordenadas se han coaccionado en el rango [-180 -90, 180 90] para GEOGRAPHY

Prueba con

-- Both 1st queries return
-- NOTICE:  Coordinate values were coerced into range [-180 -90, 180 90] for GEOGRAPHY
SELECT ST_MAKEPOINT(192.38, 18.34)::geography;
SELECT ST_MAKEPOINT(18.24, 192.38)::geography;

-- Third one does not
SELECT ST_MAKEPOINT(172.38, 18.34)::geography;

Significa que tus coordenadas de longitud son erróneas ya que x la longitud es inferior a -180 o superior a 180 o la y, la latitud es superior a 90 o inferior a -90.

Puede deberse a que no se utilice la longitud, la latitud o a que se cambie la longitud por la latitud

Para tener una visión general de dónde está el problema, haga

SELECT min(longitude) as min_x, min(latitude) as min_y,
       max(longitude) as max_x, max(latitude) as max_y
FROM crashes;

y

SELECT min(longitude) as min_x, min(latitude) as min_y,
       max(longitude) as max_x, max(latitude) as max_y
FROM location;

Quizá esté relacionado con el hecho de que hayas escogido unas coordenadas de Google Maps: si has insertado coordenadas lat, lon (y, x) en coordenadas de longitud, latitud (x, y), no esperes que funcione bien...

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X