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์์ ์ค์น๋จ.
๋๋ ์คํ ํ์ผ์ ์ถ๊ฐํ๋ ๊ฒ์ ๋ฐ๋ํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ๋ (์์ง) 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 ์๋์์ ๋ฒ์ด๋ ๋์ ๋๊น?
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
Shapely์์ ์ ํ ์ฃผ์์ ๋ณด๊ณ ์ถ์ต๋๋ค.