Shapely: parallel_offset et buffer ne ferment pas correctement les contours

Créé le 6 févr. 2018  ·  4Commentaires  ·  Source: Toblerity/Shapely

Comportement attendu et comportement réel.

Parfois, lors de l'utilisation de parallel_offset ou buffer , le contour résultant n'est pas fermé correctement. Le point où le contour n'est pas fermé correctement semble toujours être le premier / dernier point du contour.

Ce qui suit est un problème que j'ai initialement publié sur StackExchange .

Étapes pour reproduire le problème.

Voici un exemple de travail minimal qui produit un contour qui n'est pas fermé lors de l'utilisation de parallel_offset . Lors de l'utilisation de buffer , un bord arrondi est créé (malgré le style mitred ).
Curieusement, dans mon plus grand ensemble de données, il existe d'autres contours très similaires qui se ferment avec succès.

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

Système opérateur

Windows 7, Python 3.6.2

Version galbée et provenance

Shapely 1.6.3 (installé à partir de PyPI)

geos upstream bug

Commentaire le plus utile

@ doctor-ian c'est une application intéressante et en fait plante mon Python. Je pense qu'il y a un bogue dans la bibliothèque GEOS ici. Le décalage parallèle n'est pas conçu pour les anneaux fermés, mais devrait échouer plus gracieusement. Un tampon négatif d'un polygone, par contre, fonctionne:

untitled

Tous les 4 commentaires

@ doctor-ian c'est une application intéressante et en fait plante mon Python. Je pense qu'il y a un bogue dans la bibliothèque GEOS ici. Le décalage parallèle n'est pas conçu pour les anneaux fermés, mais devrait échouer plus gracieusement. Un tampon négatif d'un polygone, par contre, fonctionne:

untitled

@sgillies Je craignais déjà que le problème sous-jacent ne soit pas en forme. Concernant le tampon: il échoue également lorsque la valeur dépasse une certaine valeur négative, c'est-à-dire lorsque des auto-intersections se produisent. Est-ce aussi un bug ou intentionnel?

Un bug, je pense.

Dans l'API C, GEOSOffsetCurve_r est documenté pour n'accepter que les LINESTRING. Si nous voulons également accepter les LinearRings, alors ce support devra être ajouté d'une manière ou d'une autre.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

LostFan123 picture LostFan123  ·  5Commentaires

ispmarin picture ispmarin  ·  3Commentaires

pvalsecc picture pvalsecc  ·  4Commentaires

akadouri picture akadouri  ·  4Commentaires

sgillies picture sgillies  ·  5Commentaires