Area in KM dal poligono di coordinate


14

Ho dei poligoni dalle coordinate in (pitone ben fatto) che assomigliano a questo

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

Vorrei calcolare l'area di questo poligono in km ^ 2. Quale sarebbe il modo migliore per farlo in Python?



Se viene visualizzato il seguente errore durante l'implementazione di una delle soluzioni precedenti, è perché lat1 e lat2 devono essere lat_1 e lat_2: pyproj.exceptions.CRSError: proiezione non valida: + proj = aea + lat1 = 37.843975868971484 + lat2 = 37.844325658890924 + tipo = crs: (errore Proj interno: proj_create: errore -21: conic lat_1 = -lat_2)
Ramtin Kermani

Risposte:


20

Non mi è stato subito chiaro come usare la risposta di @sgillies, quindi ecco una versione più dettagliata:

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
Il valore risultante non è esattamente lo stesso di quello ottenuto in geojson.io . Perché?
astrojuanlu,

16

Sembra che le tue coordinate siano longitudine e latitudine, sì? Utilizzare la shapely.ops.transformfunzione di Shapely per trasformare il poligono in coordinate di area uguali proiettate e quindi prendere l'area.

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
Probabilmente dovresti indicare che partialnon è un built-in; pyprojdovrà essere importato e possibilmente installato, ecc.
kingledion il

Ho notato il pyproj.Proj(proj='aea', lat1=lat1, lat2=lat2)risultato CRSError: Invalid projection: +proj=aea +lat1=5.0 +lat2=6.0 +type=crs. La modifica lat{1,2}in lat_{1,2}quanto implicita documentazione Proj4 riparato: pyproj.Proj(proj='aea', lat1=lat1, lat2=lat2). Questa risposta è accurata o dovrebbe essere aggiornata?
Herbert,

1
Avevo bisogno di usare lat_1e lat_2invece di lat1e lat2. Sospetto che ciò si applichi dopo PROJ 6.0.0
oortCloud,

3

Le risposte di cui sopra sembrano essere corrette, TRANNE che a un certo punto di recente, i parametri lat1 e lat2 nel codice pyproj sono stati rinominati con caratteri di sottolineatura: lat_1 e lat_2 (vedi /programming//a/55259718/1538758 ). Non ho abbastanza rappresentante per commentare, quindi sto facendo una nuova risposta (scusa non scusa)

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

Mi sono imbattuto in "area" che sembra più semplice da usare:

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

Per esempio:

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))

... ritorna:

area m2: 1082979.880942425

area km2: 1.082979880942425

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.