Shapely: ์œ ํ˜• ํžŒํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2019๋…„ 05์›” 25์ผ  ยท  5์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: Toblerity/Shapely

Shapely์—๋Š” ํ˜„์žฌ ์œ ํ˜• ํžŒํŠธ ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์œ ํ˜• ๊ฒ€์‚ฌ๊ธฐ์— ์˜ํ•ด ์ƒ์„ฑ๋œ ๊ฒฐ๊ณผ๋Š” ์™„๋ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์˜ˆ:

from shapely.geometry import Polygon, LineString, Point

area = Polygon().area  # Inferred type: Any. Should be: float
geom_type = LineString().geom_type  # Inferred type: Union[str, List[str]]
# Should be LineString in this case
representative_point = Polygon().representative_point()
# Inferred type: Union[Polygon, Any]. Should be: Point
x = Point(1, 1).x  # Inferred type: Union[object, Tuple[object, object, object], Tuple[object, object]]
# Should be: float

๋“ฑ๋“ฑ.

๊ทธ๋ ‡๋‹ค๋ฉด ์ ์–ด๋„ ๋ฌธ์„œ์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์œ ํ˜• ํžŒํŠธ๊ฐ€ ์žˆ๋Š” ์Šคํ… ํŒŒ์ผ ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?


Shapely ๋ฒ„์ „: 1.6.4.post1, conda์—์„œ ์„ค์น˜๋จ.

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

Shapely์—์„œ ์œ ํ˜• ์ฃผ์„์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ์Šคํ… ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์— ๋ฐ˜๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ €๋Š” (์•„์ง) mypy ์‚ฌ์šฉ์ž๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์ฃผ์„์„ ์ถ”๊ฐ€ํ•  ์ฝ”๋“œ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ์ฃผ์„ ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ PR์„ ๊ฒ€ํ† ํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

Shapely์—์„œ ์œ ํ˜• ์ฃผ์„์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ฃผ์„์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ 1.8 ๋งˆ์ผ์Šคํ†ค(?)

์ด ๊ธฐ๋Šฅ์„ ๊ณ„ํšํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•  ํ•œ ๊ฐ€์ง€๋Š” shapely์˜ ํ–ฅํ›„ ๋ฒ„์ „์— ๋Œ€ํ•œ Python 2.7 ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์Šคํ… ํŒŒ์ผ์— ์ฃผ์„์„ ๋„ฃ์„์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ๋˜๋Š” ๋‹ค์Œ ์ด์ •ํ‘œ(์˜ˆ: 1.8)๋ฅผ Python 3+๋งŒ ๋ฆด๋ฆฌ์Šคํ•˜๊ณ  Python 2.7 ๋ฒ„๊ทธ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ๋ถ„๊ธฐ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

Python 2.7์€ 2020๋…„( ์ง€๊ธˆ๋ถ€ํ„ฐ ์•ฝ 7๊ฐœ์›”) ์ดํ›„์—๋Š” ์œ ์ง€ ๊ด€๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ธ๋ผ์ธ ์œ ํ˜• ์ฃผ์„์€ ์•ž์œผ๋กœ ํ›จ์”ฌ ๋” ์‰ฝ๊ฒŒ ์œ ์ง€ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ ์ฃผ์„ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ตœ์†Œ ๋ฒ„์ „์œผ๋กœ 3.5๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ ํ˜„์žฌ 3.4๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์•„์ง ํ•ฉ์˜ํ–ˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค?

์œ ํ˜• ์ฃผ์„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

def nearest_points(g1: Geometry, g2: Geometry) -> Tuple[Geometry, Geometry]:

3.4๋ฅผ ์ง€์›ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด ์ฃผ์„์œผ๋กœ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋ณ„๋กœ ์ข‹์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค!).

def nearest_points(g1, g2): # type: (Geometry, Geometry) -> Tuple[Geometry, Geometry]

๋‚ด ์„ ํ˜ธ๋„๋Š” Shapely 1.8์— Python 3.5๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Python 3.4๋Š” 2019๋…„ 3์›”์— ๋‹จ์ข… ๋˜์—ˆ์œผ๋ฉฐ #680์€ Travis CI ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•ด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์œผ๋ฏ€๋กœ ๋‹ค์Œ ์ด์ •ํ‘œ(1.8?)๋ฅผ ์œ„ํ•ด Python 3.5+๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ Python 2.7 ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด 1.7 ๋ถ„๊ธฐ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค(๋˜ํ•œ <=3.4).

@sgillies ์ด์ œ Python 2.x ์‹œ๋Œ€์—์„œ ๋ฒ—์–ด๋‚  ๋•Œ์ž…๋‹ˆ๊นŒ?

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