Estoy usando la biblioteca GEOS/OGR en Python. Tengo archivos llenos de geometrías que se superponen, y quiero convertirlos en archivos de geometrías que no se superponen.
La forma en que he estado abordando esto es simplemente leer todas las geometrías de un archivo, y luego hacer un bucle sobre cada geometría y tomar la Unión() de esa con todas las geometrías anteriores. Así que algo como:
def dedup(geometries):
"""Return a geometry that is the union of all geometries."""
if not geometries: return None
current_union = geometries[0].Clone()
for g in geometries:
current_union = current_union.Union(g).Clone()
return current_union
La mayoría de las veces parece que esto funciona, pero ocasionalmente Union() no devuelve ninguna. Mi depuración revela que en estos casos:
- IsValid() devuelve verdadero tanto para g como para current_union
- Intersects() return true between g and current_union
- GetGeometryCount() para current_union típicamente devuelve un número sobre 100.
- Sospecho que el error puede ser algún tipo de problema de memoria porque parece que el error "se mueve" dependiendo del contexto. Es decir, si digo que lo ejecute en los archivos 1-100, podría fallar en el archivo 20, pero si digo que lo ejecute en los archivos 20-100, podría fallar en el archivo 40. Nunca uso Destroy() en ninguna geometría. Sin embargo, el Administrador de Tareas no muestra que me esté quedando sin memoria.
De todos modos, tal vez haya una forma más fácil de hacer esto. ¿O alguien tiene alguna idea de por qué se está estrellando aquí?
¡Muchas gracias de antemano!