8 votos

La mejor manera de encontrar los polígonos atravesado por una línea

Estoy tratando de encontrar todos los polígonos cruzado por una sola línea (un track de GPS). Estoy usando la librería OGR (de python) para el cómputo de este, pero en la actualidad está un poco 'fuerza bruta' (y lento). Para cada punto de mi pista, que yo llamo el método intersect con todos los polígonos. La obvia es la optimización para comprobar sólo con polígonos adyacentes. Pero supongo que esto es un problema clásico, con una ya conocida solución (que no puedo encontrar...).

Me gustaría evitar el uso de una base de datos dedicada, como estoy tratando de escribir un software independientes (spatialite es una opción si el DB es el camino a seguir).

(FYI, el actual código fuente está disponible aquí: https://github.com/dkm/airspace-checker )

7voto

Josh Puntos 569

Para una solución Python, es posible que desee ver en Shapely http://gispython.org/shapely/docs/1.2/ y RTree http://pypi.python.org/pypi/Rtree/

Rtree le ayudará a crear los índices espaciales.

5voto

Ron Tuffin Puntos 8286

En lugar de expansiva se cruzan, se puede realizar la pre-selección de polígonos que se basa en la comparación de las cajas de contorno. En otras palabras, encontrar todos los polígonos superpuestos / adyacente a MBR de los segmentos de su pista. Luego de realizar el análisis detallado de la prueba en el subconjunto de los polígonos.

3voto

Mohit Jain Puntos 145

Las propuestas de mloskot y Nicklas para comparar los cuadros delimitadores son de hecho correcta.

Si usted está utilizando los archivos de forma que usted podría considerar también la posibilidad de llamar a esta saga módulo: http://www.saga-gis.org/saga_modules_doc/shapes_transect/index.html

2voto

Lars Mæhlum Puntos 4569

Lo que una base de datos como PostGIS hace a la velocidad de este es en primer lugar hacer un índice, cuadro delimitador comparar. Se busca en primer lugar todos los polígonos que tienen las cajas de contorno interersecting con el cuadro delimitador de la línea. El problema en tu caso, podría ser que la cadena de línea es larga y va a tener un gran cuadro delimitador de intersección de muchos polígonos que no es de ningún interés.

Si las líneas son muy largas probablemente también a trabajar con geodésico funciones que es mucho más complejo y lento que planar funciones.

Podría ser bastante complejo para que las cosas funcionen suave.

¿Por qué no quieren depender de una base de datos? Que no va a resolver todos sus problemas, pero hay un montón de optimizaciones en PostGIS, por ejemplo. Allí también tienes la geodésico cálculos de intersección si la necesita.

Actualización: He leído tu pregunta de nuevo y se dio cuenta de que no está utilizando el linestring el trac formas, pero cada vértice.

Creo que usted está en el mal trac ;)
Tanto porque le falta para comprobar si el borde entre la vertexpoints cruza el polígono y porque se mueven de la iteración entre los vértices los puntos a python en lugar de algunos implementación en C que creo que es mucho más rápido. Entonces usted tiene ese problema con los índices. Para hacer las cosas más rápido, usted tendrá que construir y manejar algún tipo de índice espacial.

En el otro lado, si usted está haciendo esto mucho de la obra en su propio código, ¿por qué no hacer la intersección de la prueba. Esa prueba es sólo un punto en el polígono de la prueba, si se trata de los puntos de vértice. Google por "punto en el polígono" y usted encontrará varios algoritmos.

Pero, yo iría a por un enfoque basado en la base de datos. Que le dará las posibilidades de uso de los índices espaciales.

/Nicklas

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