рдХрднреА-рдХрднреА parallel_offset
рдпрд╛ buffer
, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕рдореЛрдЪреНрдЪ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдмрдВрдж рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╣ рдмрд┐рдВрджреБ рдЬрд╣рд╛рдВ рд╕рдореЛрдЪреНрдЪ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдмрдВрдж рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдореЗрд╢рд╛ рд╕рдореЛрдЪреНрдЪ рдХрд╛ рдкрд╣рд▓рд╛ / рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдХ рдореБрджреНрджрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рд╢реБрд░реВ рдореЗрдВ StackExchange рдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛
рдпрд╣рд╛рдВ рдПрдХ рдиреНрдпреВрдирддрдо рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рдПрдХ рд╕рдореЛрдЪреНрдЪ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИ рдЬреЛ parallel_offset
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдмрдВрдж рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред buffer
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдПрдХ рдЧреЛрд▓ рдХрд┐рдирд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ( mitred
рд╢реИрд▓реА рдХреЗ рдмрд╛рд╡рдЬреВрдж)ред
рдордЬреЗ рдХреА рдмрд╛рдд рд╣реИ, рдореЗрд░реЗ рдмрдбрд╝реЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдореЗрдВ рдЕрдиреНрдп рдмрд╣реБрдд рд╣реА рд╕рдорд╛рди рдХрдВрдЯреНрд░реЛрд╡рд░реНрд╕ рд╣реИрдВ рдЬреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдмрдВрдж рд╣реЛрддреЗ рд╣реИрдВред
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()
рд╡рд┐рдВрдбреЛрдЬ 7, рдкрд╛рдпрдерди 3.6.2
рд╢реЗрдкрд▓реА 1.6.3 (PyPI рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд)
@ рдбреЙрдХреНрдЯрд░-рдЗрдпрд╛рди рдпрд╣ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдПрдкреНрд▓реАрдХреЗрд╢рди рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реЗ рдкрд╛рдпрдерди рдХреЛ рдХреНрд░реИрд╢ рдХрд░ рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдБ GEOS рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдПрдХ рдмрдЧ рд╣реИред рд╕рдорд╛рдирд╛рдВрддрд░ рдСрдлрд╝рд╕реЗрдЯ рдХреЛ рдмрдВрдж рд░рд┐рдВрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рддрд░реАрдХреЗ рд╕реЗ рд╡рд┐рдлрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдмрд╣реБрднреБрдЬ рдХрд╛ рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдмрдлрд░, рджреВрд╕рд░реА рдУрд░, рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
@ рд╕реЗрдЧрд┐рд▓рд┐рдЬ рдореБрдЭреЗ рдкрд╣рд▓реЗ рд╣реА рдЖрд╢рдВрдХрд╛ рдереА рдХрд┐ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдорд╕реНрдпрд╛ рдЖрдХрд╛рд░ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рдмрдлрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ: рдпрд╣ рддрдм рднреА рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдореВрд▓реНрдп рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдирдХрд╛рд░рд╛рддреНрдордХ рдореВрд▓реНрдп рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдЬрдм рдЖрддреНрдо-рдЪреМрд░рд╛рд╣реЗ рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣ рднреА рдПрдХ рдмрдЧ рдпрд╛ рдЗрд░рд╛рджрд╛ рд╣реИ?
рдПрдХ рдмрдЧ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИред
C-API рдореЗрдВ, GEOSOffsetCurve_r рдХреЛ рдХреЗрд╡рд▓ LINESTRINGs рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рд░реЗрдЦреАрдпрд┐рдВрдЧ рдХреЛ рднреА рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЙрд╕ рд╕рдорд░реНрдерди рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
@ рдбреЙрдХреНрдЯрд░-рдЗрдпрд╛рди рдпрд╣ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдПрдкреНрд▓реАрдХреЗрд╢рди рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реЗ рдкрд╛рдпрдерди рдХреЛ рдХреНрд░реИрд╢ рдХрд░ рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдБ GEOS рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдПрдХ рдмрдЧ рд╣реИред рд╕рдорд╛рдирд╛рдВрддрд░ рдСрдлрд╝рд╕реЗрдЯ рдХреЛ рдмрдВрдж рд░рд┐рдВрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рддрд░реАрдХреЗ рд╕реЗ рд╡рд┐рдлрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдмрд╣реБрднреБрдЬ рдХрд╛ рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдмрдлрд░, рджреВрд╕рд░реА рдУрд░, рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: