Bắt các khu vực đa giác bằng cách sử dụng geopandas?


16

Đưa ra geopandas GeoDataFramemột loạt các đa giác, tôi muốn có được diện tích tính bằng km vuông của mỗi tính năng trong danh sách của tôi.

Đây là một vấn đề khá phổ biến và giải pháp được đề xuất thông thường trong quá khứ là sử dụng shapelypyprojtrực tiếp (ví dụ ở đâyđây ).

Có cách nào để làm điều này trong sạch geopandas?

Câu trả lời:


17

Nếu các crs của GeoDataFrame được biết đến (EPSG: 4326 đơn vị = độ, ở đây), bạn không cần Shapely, cũng không phải pyproj trong tập lệnh của mình vì GeoPandas sử dụng chúng).

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

nhập mô tả hình ảnh ở đây

Bây giờ hãy sao chép GeoDataFrame của bạn và thay đổi phép chiếu sang hệ thống Cartesian (EPSG: 3857, unit = m như trong câu trả lời của ResMar)

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

nhập mô tả hình ảnh ở đây

Bây giờ diện tích bằng km vuông

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

nhập mô tả hình ảnh ở đây

Nhưng các bề mặt trong phép chiếu Mercator là không chính xác, do đó, với các phép chiếu khác tính bằng mét.

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

nhập mô tả hình ảnh ở đây


Văn bản của bạn là epsg:3857, nhưng mã của bạn là epsg:3395, cái nào trong hai cái này là đúng?
Aleksey Bilogur

4
Các .to_crschức năng được truyền đến pyprojdù sao. Một ví dụ điển hình về phép chiếu diện tích bằng nhau: proj4.org/projections/cea.html có thể được thông qua như sau:.to_crs({'proj':'cea'})
Swier

Đối với các cuộc điều tra dân số ở Hoa Kỳ ít nhất, tôi có thể xác nhận rằng {'proj':'cea'}tạo ra các ước tính khu vực gần nhất.
Bia Polor

4

Tôi tin là có. Sau đây nên làm việc:

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

Điều này chuyển đổi hình học thành hình chiếu có diện tích bằng nhau, tìm nạp shapelykhu vực (được trả về trong m ^ 2) và ánh xạ tới km ^ 2 (bước cuối cùng này là tùy chọn).


Điều này có đúng không?
Aleksey Bilogur

1
EPSG 3857 không bằng diện tích. en.wikipedia.org/wiki/Map_projection#Equal-area
alphabetasoup

Tôi đã sửa đổi câu trả lời này để phù hợp với epsg:3395CRS của gen . Cảm ơn.
Aleksey Bilogur
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.