Shapely: paralelo_desplazamiento y búfer no cierran los contornos correctamente

Creado en 6 feb. 2018  ·  4Comentarios  ·  Fuente: Toblerity/Shapely

Comportamiento esperado y comportamiento real.

A veces, cuando se usa parallel_offset o buffer , el contorno resultante no se cierra correctamente. El punto donde el contorno no se cierra correctamente siempre parece ser el primer / último punto del contorno.

El siguiente es un problema que publiqué inicialmente en

Pasos para reproducir el problema.

Aquí hay un ejemplo de trabajo mínimo que produce un contorno que no está cerrado cuando se usa parallel_offset . Cuando se usa buffer , se crea un borde redondeado (a pesar del estilo mitred ).
Curiosamente, en mi conjunto de datos más grande hay otros contornos muy similares que se cierran con éxito.

import matplotlib.pyplot as plt
from shapely.geometry.polygon import LinearRing

def plot_line(ax, ob, color):
    x, y = ob.xy
    ax.plot(x, y, color=color, alpha=0.7, linewidth=3, 
            solid_capstyle='round', zorder=2)

polygon = [[-29.675, -30.675],
           [-28.4094, -29.4094],
           [-28.325, -29.325],
           [-28.325, -29.764],
           [-28.325, -29.7933],
           [-28.4587, -29.8274],
           [-28.4676, -29.8297],
           [-28.5956, -29.8814],
           [-28.6041, -29.8848],
           [-28.724, -29.953],
           [-28.732, -29.9576],
           [-28.8417, -30.0413],
           [-28.849, -30.0469],
           [-28.9466, -30.1445],
           [-28.9531, -30.151],
           [-29.0368, -30.2607],
           [-29.0424, -30.268],
           [-29.1106, -30.3879],
           [-29.1152, -30.3959],
           [-29.1669, -30.5239],
           [-29.1703, -30.5324],
           [-29.2044, -30.6661],
           [-29.2067, -30.675],
           [-29.6457, -30.675],
           [-29.675, -30.675]]

poly_line = LinearRing(polygon)
poly_line_offset = poly_line.parallel_offset(0.05, side="left", resolution=16, 
                                             join_style=2, mitre_limit=1)
# Alternative:
# poly_line_offset = poly_line.buffer(0.05, resolution=16, join_style=2, mitre_limit=1).exterior

fig = plt.figure()
ax = fig.add_subplot(111)
plot_line(ax, poly_line, "blue")
plot_line(ax, poly_line_offset, "green")
plt.show()

Sistema operativo

Windows 7, Python 3.6.2

Procedencia y versión bien formada

Shapely 1.6.3 (instalado desde PyPI)

geos upstream bug

Comentario más útil

@ doctor-ian esta es una aplicación interesante y de hecho bloquea mi Python. Creo que hay un error en la biblioteca GEOS aquí. El desplazamiento paralelo no está diseñado para anillos cerrados, pero debería fallar con más gracia. Un búfer negativo de un polígono, por otro lado, funciona:

untitled

Todos 4 comentarios

@ doctor-ian esta es una aplicación interesante y de hecho bloquea mi Python. Creo que hay un error en la biblioteca GEOS aquí. El desplazamiento paralelo no está diseñado para anillos cerrados, pero debería fallar con más gracia. Un búfer negativo de un polígono, por otro lado, funciona:

untitled

@sgillies Ya temía que el problema de fondo no formado . Respecto al buffer: También falla cuando el valor excede un cierto valor negativo, es decir, cuando ocurren auto-intersecciones. ¿Es esto también un error o intencionado?

Un error, creo.

En C-API, GEOSOffsetCurve_r está documentado para aceptar solo LINESTRING. Si queremos aceptar LinearRings también, entonces ese soporte debería agregarse de alguna manera.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

mikedh picture mikedh  ·  6Comentarios

LostFan123 picture LostFan123  ·  5Comentarios

ispmarin picture ispmarin  ·  3Comentarios

kannes picture kannes  ·  4Comentarios

benediktbrandt picture benediktbrandt  ·  3Comentarios