Площа в КМ від багатокутника координат


14

У мене є багатокутники від координат в (пітон витончено), який виглядає приблизно так

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

Я б хотів обчислити площу цього многокутника в км ^ 2. Який найкращий спосіб зробити це в Python?


1
Ви можете подивитися на stackoverflow.com/questions/23697374 / ...
SIslam

Якщо ви отримуєте наступну помилку під час реалізації одного з вищезазначених рішень, це тому, що lat1 та lat2 повинні бути lat_1 та lat_2: pyproj.exceptions.CRSError: Неправильна проекція: + proj = aea + lat1 = 37.843975868971484 + lat2 = 37.844325658890924 + тип = crs: (Внутрішня помилка програми: proj_create: Помилка -21: conic lat_1 = -lat_2)
Рамтін Кермані

Відповіді:


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.ops.transformфункцію Shapely, щоб перетворити багатокутник на задані рівні координати площі, а потім взяти область.

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_1і lat_2замість lat1і lat2. Я підозрюю, що це стосується публікації PROJ 6.0.0
oortCloud

3

Наведені вище відповіді здаються правильними, ПРИКЛАДНО, що в якийсь момент нещодавно параметри lat1 та lat2 в коді pyproj були перейменовані на підкреслення: lat_1 та lat_2 (див. Https://stackoverflow.com/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))

... повертає:

площа м2: 1082979.880942425

площа км2: 1.082979880942425

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.