Çokgen koordinatlarından KM cinsinden alan


14

Ben (python biçimli) koordinatlarından çok benzeyen böyle görünüyor

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

Bu çokgenin alanını km ^ 2 cinsinden hesaplamak istiyorum. Python'da bunu yapmanın en iyi yolu ne olurdu?



Yukarıdaki çözümlerden birini uygularken aşağıdaki hatayı alıyorsanız, lat1 ve lat2'nin lat_1 ve lat_2 olması gerekir: pyproj.exceptions.CRSError: Geçersiz projeksiyon: + proj = aea + lat1 = 37.843975868971484 + lat2 = 37.844325658890924 + tip = crs: (Dahili Proj Hatası: proj_create: Hata -21: konik lat_1 = -lat_2)
Ramtin Kermani

Yanıtlar:


20

@Sgillies cevabını nasıl kullanacağımı kolayca anlayamadım, bu yüzden daha ayrıntılı bir sürüm:

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
Ortaya çıkan değer, geojson.io'da elde edilenle tam olarak aynı değildir . Neden?
astrojuanlu

16

Görünüşe göre koordinatlarınız boylam ve enlem gibi, değil mi? shapely.ops.transformÇokgeni yansıtılan eşit alan koordinatlarına dönüştürmek için Shapely işlevini kullanın ve ardından alanı alın.

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
Muhtemelen partialbunun yerleşik olmadığını belirtmelisiniz ; pyprojithal edilecek ve muhtemelen kurulacak vb.
kingledion

pyproj.Proj(proj='aea', lat1=lat1, lat2=lat2)Sonuçta fark ettim CRSError: Invalid projection: +proj=aea +lat1=5.0 +lat2=6.0 +type=crs. Değişen lat{1,2}içine lat_{1,2}ima ettiği proj4 belgeleri düzelttim: pyproj.Proj(proj='aea', lat1=lat1, lat2=lat2). Bu Yanıt doğru mu, yoksa güncellenmeli mi?
Herbert

1
Ben kullanmak için gerekli lat_1ve lat_2yerine lat1ve lat2. Bunun PROJ 6.0.0 sonrası uygulanacağından şüpheleniyorum
oortCloud

3

Yukarıdaki yanıtlar doğru gibi görünüyor, ancak son zamanlarda bir noktada pyproj kodundaki lat1 ve lat2 parametrelerinin alt çizgi ile yeniden adlandırılması hariç: lat_1 ve lat_2 (bkz. Https://stackoverflow.com/a/55259718/1538758 ). Yorum yapmak için yeterli temsilcim yok, bu yüzden yeni bir cevap veriyorum (özür dilerim özür dilerim)

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

Ben kullanımı daha basit gibi görünüyor "alan" tökezledi:

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

Örneğin:

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

... İadeler:

alan m2: 1082979.880942425

Yüzölçümü2: 1.082979880942425

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.