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
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()
Windows 7, Python 3.6.2
Shapely 1.6.3 (instalado desde PyPI)
@ 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:
@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.
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: