Преобразование объектов Shapely Polygon и MultiPolygon

26

Существует ли простой способ преобразования объектов Shapely (а именно, Polygons и MultiPolygons) из одной проекции в другую без необходимости копаться и извлекать координаты вручную?

На самом деле, мне даже не важно, являются ли они объектами Shapely, я просто хочу передать объекты и проекцию и вернуть перепроектированный набор объектов обратно.

Существует ли такая функциональность или она должна быть закодирована вручную?

Крис Фоннесбек
источник
2
Я полагаю, что это выходит за рамки Shapely, вы можете посмотреть на Фионе. fiona.transformвыглядит, чтобы иметь то, что вам нужно.
Джейсон Шайрер,

Ответы:

50

Хотя shapely изначально не понимает системы координат, он shapely.ops.transform()может делать это вместе с pyproj. Если вы pyproj.Projможете понять обе ваши системы координат, то это можно превратить в функцию, с помощью которой вы сможете преобразовать форму.

Из красивых документов :

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
Если вы не хотите использовать itertoolsмодуль, вы можете сделать, project = lambda x, y: pyproj.transform(pyproj.Proj(init='epsg:4326'), pyproj.Proj(init='epsg:26913'), x, y)а затем g2 = transform(project, g1).
Elmex80s
1
Этот предложенный ответ для pyproj1, тогда как теперь есть предпочтительное преобразование для pyproj2 с использованием Transformer. Смотрите здесь: pyproj4.github.io/pyproj/stable/gotchas.html
Жажда знаний
11

Хотя это и не решение Shapely, использование GeoPandas обеспечивает относительно простую проекцию. Например, если мы хотим преобразовать шейп-файл в 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
Геопандас использует Shapely (например, посмотрите на geodataframe.py)
ген
0

Если вы используете pyproj2, гораздо проще использовать Transformer. Вот пример:

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

Это также намного быстрее, потому что pyproj не нужно воссоздавать проекцию для каждой точки.

Ник Оделл
источник