Geopandas kullanarak çokgen alanlar mı alıyorsunuz?


16

Çokgen geopandas GeoDataFrameiçeren bir dizi verildiğinde , listemdeki her özelliğin km km'sinde alanı elde etmek istiyorum.

Bu oldukça yaygın bir sorundur ve geçmişte her zaman önerilen çözüm kullanımı shapelyve pyprojdoğrudan kullanılması olmuştur (örneğin burada ve burada ).

Bunu saf olarak yapmanın bir yolu var mı geopandas?

Yanıtlar:


17

GeoDataFrame'in crs'leri biliniyorsa (EPSG: 4326 birim = derece, burada), GeoPandas bunları kullandığından komut dosyanızda Shapely'ye veya pyproj'a ihtiyacınız yoktur).

import geopandas as gpd
test = gpd.read_file("test_wgs84.shp")
print test.crs
test.head(2)

resim açıklamasını buraya girin

Şimdi GeoDataFrame'inizi kopyalayın ve projeksiyonu Kartezyen bir sistemle değiştirin (EPSG: 3857, ResMar'ın cevabındaki gibi birim = m)

tost = test.copy()
tost= tost.to_crs({'init': 'epsg:3857'})
print tost.crs
tost.head(2)

resim açıklamasını buraya girin

Şimdi kilometre kare

tost["area"] = tost['geometry'].area/ 10**6
tost.head(2)

resim açıklamasını buraya girin

Ancak Mercator projeksiyonundaki yüzeyler doğru değildir, bu nedenle metre cinsinden diğer projeksiyonlarla.

tost= tost.to_crs({'init': 'epsg:32633'})
tost["area"] = tost['geometry'].area/ 10**6
tost.head(2)

resim açıklamasını buraya girin


Metniniz epsg:3857, ancak kodunuz, epsg:3395ikisinden hangisi doğrudur?
Aleksey Bilogur

4
.to_crsFonksiyon geçirilen alır pyprojneyse. Eşit alanlı projeksiyon için iyi bir örnek: proj4.org/projections/cea.html aşağıdaki gibi aktarılabilir:.to_crs({'proj':'cea'})
Swier

En azından ABD Nüfus Sayımına ilişkin şekil dosyaları {'proj':'cea'}için, en yakın alan tahminlerini ürettiğini onaylayabilirim .
Polor Beer

4

Evet inanıyorum. Aşağıdakilerin çalışması gerekir:

gdf['geometry'].to_crs({'init': 'epsg:3395'})\
               .map(lambda p: p.area / 10**6)

Bu, geometriyi eşit alanlı bir projeksiyona dönüştürür, alanı getirir shapely(m ^ 2 olarak döndürülür) ve bunu bir km ^ 2 ile eşleştirir (bu son adım isteğe bağlıdır).


Bu doğru mu?
Aleksey Bilogur


Bu cevabı genin epsg:3395CRS'sine uyacak şekilde değiştirdim . Teşekkürler.
Aleksey Bilogur
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.