Shapely: paralelo_offset e buffer não fecham contornos corretamente

Criado em 6 fev. 2018  ·  4Comentários  ·  Fonte: Toblerity/Shapely

Comportamento esperado e comportamento real.

À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 .

Etapas para reproduzir o problema.

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()

Sistema operacional

Windows 7, Python 3.6.2

Versão Bem Formada e Proveniência

Shapely 1.6.3 (instalado a partir do PyPI)

geos upstream bug

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:

untitled

Todos 4 comentários

@ 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:

untitled

@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.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

LostFan123 picture LostFan123  ·  3Comentários

sgillies picture sgillies  ·  6Comentários

FuriousRococo picture FuriousRococo  ·  5Comentários

romainfontaine picture romainfontaine  ·  5Comentários

dopplershift picture dopplershift  ·  3Comentários