Chuyển đổi các đối tượng Shapely Polygon và MultiPolygon


26

Có cách nào dễ dàng để chuyển đổi các đối tượng Shapely (cụ thể là Đa giác và MultiPolygons) từ phép chiếu này sang phép chiếu khác mà không phải đào xung quanh và trích xuất tọa độ bằng tay không?

Trên thực tế, tôi thậm chí không quan tâm nếu chúng là các đối tượng Shapely vào thời điểm này, tôi chỉ muốn truyền các tính năng và phép chiếu, và lấy lại một bộ các tính năng bị từ chối.

Là loại chức năng này tồn tại, hoặc nó phải được mã hóa bằng tay?


2
Tôi tin rằng đó là ngoài phạm vi của Shapely, bạn có thể muốn xem xét về Fiona. fiona.transformCó vẻ như có những gì bạn cần.
Jason Scheirer

Câu trả lời:


50

Mặc dù hoàn toàn không hiểu hệ thống tọa độ, nhưng shapely.ops.transform()có thể làm điều đó cùng với pyproj. Nếu pyproj.Projcó thể hiểu cả hai hệ tọa độ của bạn, thì nó có thể được tạo thành một hàm có thể biến đổi với.

Từ các tài liệu tạo hình :

from functools import partial
import pyproj
from shapely.ops import transform

project = partial(
    pyproj.transform,
    pyproj.Proj(init='epsg:4326'), # source coordinate system
    pyproj.Proj(init='epsg:26913')) # destination coordinate system

g2 = transform(project, g1)  # apply projection

4
Nếu bạn không muốn sử dụng itertoolsmô-đun, bạn có thể làm project = lambda x, y: pyproj.transform(pyproj.Proj(init='epsg:4326'), pyproj.Proj(init='epsg:26913'), x, y)và sau đó g2 = transform(project, g1).
Elmex80

1
Câu trả lời được đề xuất này là dành cho pyproj1 trong khi hiện tại đã có một chuyển đổi ưa thích cho pyproj2 bằng cách sử dụng Transformer. Xem tại đây: pyproj4.github.io/pyproj/urdy/gotchas.html
Khát khao kiến ​​thức

11

Mặc dù không phải là một giải pháp Shapely, sử dụng GeoPandas cho phép chiếu tương đối đơn giản. Ví dụ: nếu chúng tôi muốn chuyển đổi một shapefile thành ESPG 4326:

import geopandas as gpd

HabModelEnviro = gpd.GeoDataFrame.from_file('data/HabModelEnviro.shp').replace({-999: None})

HabModelEnviroWGS84 = HabModelEnviro.to_crs({'proj':'longlat', 'ellps':'WGS84', 'datum':'WGS84'})

6
Geopandas sử dụng Shapely (ví dụ: nhìn vào geodataframe.py)
gen

0

Nếu bạn đang sử dụng pyproj2, việc sử dụng Biến áp sẽ dễ dàng hơn nhiều. Đây là một ví dụ:

import pyproj
from shapely.ops import transform

project = pyproj.Transformer.from_proj(
    pyproj.Proj(init='epsg:4326'), # source coordinate system
    pyproj.Proj(init='epsg:26913')) # destination coordinate system

# g1 is a shapley Polygon

g2 = transform(project.transform, g1)  # apply projection

Điều này cũng nhanh hơn nhiều, vì pyasej không cần phải tạo lại hình chiếu cho mọi điểm.

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.