좌표의 다각형에서 KM의 면적


14

다음과 같은 (파이썬 모양으로) 좌표의 다각형이 있습니다.

POLYGON ((24.8085317 46.8512821, 24.7986952 46.8574619, 24.8088238 46.8664741, 24.8155239 46.8576335, 24.8085317 46.8512821))

이 다각형의 면적을 km ^ 2 단위로 계산하고 싶습니다. 파이썬에서 이것을 수행하는 가장 좋은 방법은 무엇입니까?



위의 솔루션 중 하나를 구현하는 다음 오류가 발생하면 lat1 및 lat2가 lat_1 및 lat_2이어야하기 때문입니다. pyproj.exceptions.CRSError : Invalid projection : + proj = aea + lat1 = 37.843975868971484 + lat2 = 37.844325658890924 + type = crs : (내부 프로젝트 오류 : proj_create : 오류 -21 : conic lat_1 = -lat_2)
Ramtin Kermani

답변:


20

@sgillies 답변을 사용하는 방법은 나에게 분명하지 않았으므로 여기에 더 자세한 버전이 있습니다.

import pyproj    
import shapely
import shapely.ops as ops
from shapely.geometry.polygon import Polygon
from functools import partial


geom = Polygon([(0, 0), (0, 10), (10, 10), (10, 0), (0, 0)])
geom_area = ops.transform(
    partial(
        pyproj.transform,
        pyproj.Proj(init='EPSG:4326'),
        pyproj.Proj(
            proj='aea',
            lat1=geom.bounds[1],
            lat2=geom.bounds[3])),
    geom)

# Print the area in m^2
print geom_area.area 

1
결과 값은 geojson.io 에서 얻은 값과 정확히 동일하지 않습니다 . 왜?
astrojuanlu

16

좌표가 위도와 경도 인 것 같습니다 Shapely의 shapely.ops.transform함수를 사용 하여 다각형을 투영 된 동일한 면적 좌표 로 변환 한 다음 면적을 가져옵니다.

python
import pyproj
from functools import partial

geom_aea = transform(
partial(
    pyproj.transform,
    pyproj.Proj(init='EPSG:4326'),
    pyproj.Proj(
        proj='aea',
        lat1=geom.bounds[1],
        lat2=geom.bounds[3])),
geom)

print(geom_aea.area)
# Output in m^2: 1083461.9234313113 

1
아마도 partial이것이 내장되지 않았 음을 나타내야합니다 . pyproj가져 와서 설치해야 할 것입니다.
kingledion

pyproj.Proj(proj='aea', lat1=lat1, lat2=lat2)결과가 나타 났습니다 CRSError: Invalid projection: +proj=aea +lat1=5.0 +lat2=6.0 +type=crs. 변경 lat{1,2}lat_{1,2}의해 묵시적으로 proj4 문서는 그것을 고정 : pyproj.Proj(proj='aea', lat1=lat1, lat2=lat2). 이 답변이 정확합니까, 아니면 업데이트해야합니까?
Herbert

1
내가 사용하는 데 필요한 lat_1lat_2대신 lat1lat2. 나는 이것이 PROJ 6.0.0 이후에 적용된다고 생각한다
oortCloud

3

위의 답변은 pyproj 코드의 lat1 및 lat2 매개 변수가 밑줄로 이름이 바뀐 것을 제외하고는 최근에 올바른 것으로 보입니다 ( /programming//a/55259718/1538758 참조 ). 의견을 제시 할 담당자가 충분하지 않으므로 새 답변을 작성하고 있습니다 (죄송합니다).

import pyproj    
import shapely
import shapely.ops as ops
from shapely.geometry.polygon import Polygon
from functools import partial


geom = Polygon([(0, 0), (0, 10), (10, 10), (10, 0), (0, 0)])
geom_area = ops.transform(
    partial(
        pyproj.transform,
        pyproj.Proj(init='EPSG:4326'),
        pyproj.Proj(
            proj='aea',
            lat_1=geom.bounds[1],
            lat_2=geom.bounds[3])),
    geom)

# Print the area in m^2
print geom_area.area 

1

사용하기 더 단순한 "영역"을 우연히 발견했습니다.

https://pypi.org/project/area/

예를 들면 다음과 같습니다.

from area import area

obj = {'type':'Polygon','coordinates':[[[24.8085317,46.8512821], [24.7986952,46.8574619], [24.8088238,46.8664741], [24.8155239,46.8576335], [24.8085317,46.8512821]]]}

area_m2 = area(obj)

area_km2 = area_m2 / 1e+6
print ('area m2:' + str(area_m2))
print ('area km2:' + str(area_km2))

...은 다음을 반환합니다.

지역 m2 : 1082979.880942425

지역 km2 : 1.082979880942425

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.