从坐标多边形以KM为单位的面积


14

我在(python形状)的坐标中有多边形,看起来像这样

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

我想以km ^ 2计算此多边形的面积。用Python做到这一点的最佳方法是什么?



如果您在执行上述解决方案之一时遇到以下错误,是因为lat1和lat2应该分别为lat_1和lat_2:pyproj.exceptions.CRSError:无效的投影:+ proj = aea + lat1 = 37.843975868971484 + lat2 = 37.844325658890924 + type = crs :(内部项目错误:proj_create:错误-21:圆锥lat_1 = -lat_2)
Ramtin Kermani

Answers:


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)。这个答案是正确的,还是应该更新?
赫伯特

1
我需要使用lat_1lat_2而不是lat1lat2。我怀疑这适用于PROJ 6.0.0
oortCloud '19

3

上面的答案似乎是正确的,除了最近某个时候,pyproj代码中的lat1和lat2参数用下划线重命名:lat_1和lat_2(请参阅/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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.