Às vezes, ao usar parallel_offset
ou buffer
, o contorno resultante não é fechado corretamente. O ponto onde o contorno não é fechado corretamente sempre parece ser o primeiro / último ponto do contorno.
A seguir, um problema que postei inicialmente no StackExchange .
Aqui está um exemplo de trabalho mínimo que produz um contorno que não é fechado ao usar parallel_offset
. Ao usar buffer
, uma borda arredondada é criada (apesar do estilo mitred
).
Curiosamente, no meu conjunto de dados maior, existem outros contornos muito semelhantes que fecham com sucesso.
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 a partir do PyPI)
@ doctor-ian, este é um aplicativo interessante e na verdade trava meu Python. Acho que há um bug na biblioteca GEOS aqui. O deslocamento paralelo não é projetado para anéis fechados, mas deve falhar com mais elegância. Um buffer negativo de um polígono, por outro lado, funciona:
@sgillies Eu já temia que o problema subjacente não fosse de boa forma. Em relação ao buffer: Também falha quando o valor ultrapassa um determinado valor negativo, ou seja, quando ocorrem autointerseções. Isso também é um bug ou intencional?
Um bug, eu acho.
No C-API, GEOSOffsetCurve_r está documentado para aceitar apenas LINESTRINGs. Se quisermos aceitar LinearRings também, esse suporte precisará ser adicionado de alguma forma.
Comentários muito úteis
@ doctor-ian, este é um aplicativo interessante e na verdade trava meu Python. Acho que há um bug na biblioteca GEOS aqui. O deslocamento paralelo não é projetado para anéis fechados, mas deve falhar com mais elegância. Um buffer negativo de um polígono, por outro lado, funciona: