Shapely: parallel_offset ๋ฐ buffer๊ฐ€ ์œค๊ณฝ์„ ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋‹ซ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2018๋…„ 02์›” 06์ผ  ยท  4์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: Toblerity/Shapely

์˜ˆ์ƒ๋˜๋Š” ํ–‰๋™๊ณผ ์‹ค์ œ ํ–‰๋™.

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

์šด์˜ ์ฒด์ œ

Windows 7, Python 3.6.2

๋งค๋ˆํ•œ ๋ฒ„์ „๊ณผ ์ถœ์ฒ˜

Shapely 1.6.3 (PyPI์—์„œ ์„ค์น˜)

geos upstream bug

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@ doctor-ian ์ด๊ฒƒ์€ ํฅ๋ฏธ๋กœ์šด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด๋ฉฐ ์‹ค์ œ๋กœ Python๊ณผ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ GEOS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ‰ํ–‰ ์˜คํ”„์…‹์€ ๋‹ซํžŒ ๋ง์šฉ์œผ๋กœ ์„ค๊ณ„๋˜์ง€ ์•Š์•˜์ง€๋งŒ ๋” ์šฐ์•„ํ•˜๊ฒŒ ์‹คํŒจํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ๋‹ค๊ฐํ˜•์˜ ์Œ์ˆ˜ ๋ฒ„ํผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

untitled

๋ชจ๋“  4 ๋Œ“๊ธ€

@ doctor-ian ์ด๊ฒƒ์€ ํฅ๋ฏธ๋กœ์šด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด๋ฉฐ ์‹ค์ œ๋กœ Python๊ณผ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ GEOS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ‰ํ–‰ ์˜คํ”„์…‹์€ ๋‹ซํžŒ ๋ง์šฉ์œผ๋กœ ์„ค๊ณ„๋˜์ง€ ์•Š์•˜์ง€๋งŒ ๋” ์šฐ์•„ํ•˜๊ฒŒ ์‹คํŒจํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ๋‹ค๊ฐํ˜•์˜ ์Œ์ˆ˜ ๋ฒ„ํผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

untitled

@sgillies ๋‚˜๋Š” ์ด๋ฏธ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๊ฐ€ ๋งค๋ˆํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๋‘๋ ค์›Œํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„ํผ์™€ ๊ด€๋ จํ•˜์—ฌ : ๊ฐ’์ด ํŠน์ • ์Œ์ˆ˜ ๊ฐ’์„ ์ดˆ๊ณผํ•˜๋Š” ๊ฒฝ์šฐ, ์ฆ‰ ์ž๊ธฐ ๊ต์ฐจ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋„ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ๋„ ๋ฒ„๊ทธ์ž…๋‹ˆ๊นŒ?

๋ฒ„๊ทธ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

C-API์—์„œ GEOSOffsetCurve_r ์€ LINESTRING ๋งŒ ํ—ˆ์šฉํ•˜๋„๋ก ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. LinearRing๋„ ํ—ˆ์šฉํ•˜๋ ค๋ฉด ํ•ด๋‹น ์ง€์›์„ ์–ด๋–ป๊ฒŒ ๋“  ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰