พื้นที่ใน KM จากรูปหลายเหลี่ยมของพิกัด


14

ฉันมีรูปหลายเหลี่ยมจากพิกัดใน (python shapely) ที่มีลักษณะเช่นนี้

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

ฉันต้องการคำนวณพื้นที่ของรูปหลายเหลี่ยมนี้ใน km ^ 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 + type = crs: (ข้อผิดพลาดภายในโครงการ: proj_create: ข้อผิดพลาด -21: conic lat_1 = -lat_2)
Ramtin Kermani

คำตอบ:


20

ฉันไม่เข้าใจวิธีใช้ @sgillies คำตอบอย่างชัดเจนดังนั้นนี่เป็นเวอร์ชัน verbose เพิ่มเติม:

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}เป็นนัยโดยเอกสาร proj4pyproj.Proj(proj='aea', lat1=lat1, lat2=lat2)คงได้: คำตอบนี้ถูกต้องหรือควรปรับปรุง?
Herbert

1
ฉันต้องการที่จะใช้lat_1และlat_2แทนและlat1 lat2ฉันสงสัยว่าสิ่งนี้ใช้โพสต์ PROJ 6.0.0
oortCloud

3

คำตอบข้างต้นดูเหมือนจะถูกต้องยกเว้นว่าในบางจุดเมื่อเร็ว ๆ นี้พารามิเตอร์ lat1 และ lat2 ในรหัส pyproj ถูกเปลี่ยนชื่อด้วยเครื่องหมายขีดล่าง: 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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.