Khu vực trong KM từ Đa giác tọa độ


13

Tôi có đa giác từ tọa độ trong (python shapely) trông như thế này

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

Tôi muốn tính diện tích của đa giác này theo km ^ 2. Cách tốt nhất để làm điều này trong Python là gì?



Nếu bạn gặp phải lỗi sau khi thực hiện một trong các giải pháp trên, là do lat1 và lat2 phải là lat_1 và lat_2: pyproj.exceptions.CRSError: Phép chiếu không hợp lệ: + proj = aea + lat1 = 37.843975868971484 + lat2 = 37.8443258888 = crs: (Lỗi Proj nội bộ: proj_create: Lỗi -21: conic lat_1 = -lat_2)
Ramtin Kermani

Câu trả lời:


19

Tôi không rõ ràng về cách sử dụng câu trả lời @sgillies, vì vậy đây là phiên bản dài dòng hơn:

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
Giá trị kết quả không hoàn toàn giống với giá trị thu được trong Geojson.io . Tại sao?
astrojuanlu

15

Có vẻ như tọa độ của bạn là kinh độ và vĩ độ, đúng không? Sử dụng shapely.ops.transformchức năng của Shapely để biến đổi đa giác thành các tọa độ diện tích bằng nhau và sau đó lấy diện tích.

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
Bạn có thể nên chỉ ra rằng đó partialkhông phải là một tích hợp; pyprojsẽ phải được nhập khẩu và có thể được cài đặt, v.v.
kingledion

Tôi nhận thấy pyproj.Proj(proj='aea', lat1=lat1, lat2=lat2)kết quả trong CRSError: Invalid projection: +proj=aea +lat1=5.0 +lat2=6.0 +type=crs. Thay đổi lat{1,2}thành lat_{1,2}như ngụ ý bởi tài liệu proj4 đã sửa nó : pyproj.Proj(proj='aea', lat1=lat1, lat2=lat2). Là câu trả lời này chính xác, hay nó nên được cập nhật?
Herbert

1
Tôi cần phải sử dụng lat_1lat_2thay vì lat1lat2. Tôi nghi ngờ điều này áp dụng bài PROJ 6.0.0
oortCloud

2

Các câu trả lời trên dường như là chính xác, NGOẠI TRỪ rằng tại một số điểm gần đây, các tham số lat1 và lat2 trong mã pyproj đã được đổi tên với dấu gạch dưới: lat_1 và lat_2 (xem /programming//a/55259718/1538758 ). Tôi không có đủ đại diện để bình luận, vì vậy tôi đang đưa ra câu trả lời mới (xin lỗi không xin lỗi)

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

Tôi đã tình cờ tìm thấy "khu vực" có vẻ đơn giản hơn để sử dụng:

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

Ví dụ:

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

... trả về:

diện tích m2: 1082979.880942425

diện tích km2: 1.082979880942425

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.