5 votos

Encontrar puntos dentro de un área elíptica utilizando PostGIS?

Usando PostGIS 2.0.0 necesito filtrar los resultados de una función, que devuelve muchos PUNTOS, para encontrar los que se encuentran dentro de un área elíptica (como una línea de gran círculo con un buffer alrededor) definida por dos puntos y una distancia (todos los parámetros pasados en la consulta).

Un filtro usando ST_Distance hace el truco, pero me pregunto si hay alguna manera de acelerarlo.

Consulta simplificada:

SELECT candidate_point
FROM my_function(some, params)
WHERE
    ST_Distance(candidate_point, 'SRID=4326;POINT(1 2)'::geography) +
    ST_Distance(candidate_point, 'SRID=4326;POINT(3 4)'::geography) <= 60000

Intenté usar ST_DWithin como filtro adicional, pero eso lo hace diez veces más lento. Dado que candidate_point proviene de una función, no de una tabla, no hay ningún índice que utilizar.

1 votos

No entiendo tu respuesta, Reality: en el fondo, esta pregunta no parece tener nada que ver con ningún polígono. Al igual que antes, pide seleccionar puntos relativos a dos focos de una elipse. Parece que ambas preguntas se refieren a posibles soluciones para un criterio de selección que aún no has articulado. ¿Por qué no empiezas de nuevo y haces la pregunta que realmente debe preguntarse: ¿cuál es exactamente el criterio de selección que quiere aplicar? Deje que sus encuestados utilicen su creatividad y experiencia para sugerir soluciones en lugar de centrarse en hacer que sus soluciones tengan éxito.

0 votos

Esta pregunta sí tiene un polígono: el creado por ST_Buffer. Esa forma no es una elipse, como antes (los requisitos han cambiado). El contexto es que necesito encontrar filas coincidentes para las características que se encuentran en el camino entre dos puntos. Los criterios completos de la trayectoria que se debe utilizar son muy complejos y la mayor parte del trabajo se realiza fuera de la DB (por otra persona). Mi tarea es hacer un filtro preliminar para eliminar las características que están definitivamente demasiado lejos para ser relevantes. Primero me pidieron que encontrara características dentro de una elipse, pero ahora se ha reducido a un "corredor", es decir, una línea expandida.

0 votos

Así que en realidad se trata de la misma cuestión, como ha sospechado @underdark: quieres seleccionar puntos que estén "cerca" de la geodésica entre dos puntos dados. El enfoque del buffer aquí y el enfoque de la elipse en la pregunta anterior son sólo dos formas posibles de resolver el mismo problema.

1voto

Uncle Philster Puntos 1

Si sus datos están en una proyección de área equidistante, podría hacer esto:

SELECT gid,the_geog FROM mytable WHERE ST_DWithIn(the_geog,ST_MakeLine(point1,point2),corridor_width_m);

ST_DWithIn también funciona con los tipos de geografía, pero incluso si usted lanza a la geometría todavía será lento porque usted no tiene índices de geometría.

Si quieres velocidad, tienes que usar tipos de geometría.

0 votos

Gracias. Probé con ST_DWithin, pero sí, también era demasiado lento en la geografía. +1 de todos modos.

1voto

Adam Ernst Puntos 6939

No he probado esto pero podría ayudar algo así:

SELECT candidate_point
FROM my_function(some, params)
WHERE
    ST_Distance(candidate_point, 'SRID=4326;POINT(1 2)'::geography) <= 60000 &&
    ST_Distance(candidate_point, 'SRID=4326;POINT(3 4)'::geography) <= 60000 &&
    ST_Distance(candidate_point, 'SRID=4326;POINT(1 2)'::geography) +
    ST_Distance(candidate_point, 'SRID=4326;POINT(3 4)'::geography) <= 60000

Alternativamente, si pudieras calcular el cuadro delimitador de la elipse antes y usar eso para filtrar los puntos antes de hacer las llamadas a ST_Distance, esperaría un aumento de velocidad.

0 votos

He probado las comprobaciones adicionales de ST_Distance y parece que lo aceleran, aunque sólo un 10%. ¿Podría sugerir cómo calcular el cuadro delimitador de la elipse?

0 votos

2 votos

La siguiente es la fórmula más sencilla que he podido elaborar. Sea la distancia total r y los focos estén en (x0,y0) y (x1,y1) con y1>=y0. El vector entre ellos es (x,y)=(x1-x0,y1-y0). Calcula eta=(Sqrt(r^2-x^2)-y)/2. Los límites en y de la caja delimitadora de la elipse son y0-eta e y1+eta. Para encontrar los límites en x, intercambia todas las coordenadas y repite estos cálculos.

0voto

int_ua Puntos 78

Prueba a eliminar ::geografía. Eso podría ayudar

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