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 .
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()
Windows 7, Python 3.6.2
Shapely 1.6.3 (installé à partir de PyPI)
@ 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:
@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.
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: