Трансформація об'єктивних об'єктів багатокутника та мультиполігону


26

Чи є простий спосіб перетворення об'єктивних об'єктів (а саме багатокутників та мультиполігонів) з однієї проекції в іншу, без необхідності копати та витягувати координати вручну?

Насправді мені навіть байдуже, чи є вони в цей момент об'єктивними формами, я просто хочу передати функції та проекцію та отримати перепроектований набір функцій назад.

Чи існує така функціональність, чи її потрібно кодувати вручну?


2
Я вважаю, що це виходить за рамки Shapely, можливо, ви захочете заглянути в Фіону. fiona.transformвиглядає, щоб мати те, що тобі потрібно.
Jason Scheirer

Відповіді:


50

У той час як витончено не розуміє системи координат, це 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
Geopandas використовує Shapely (подивіться, наприклад, geodataframe.py)
ген

0

Якщо ви використовуєте pyproj2, набагато простіше використовувати Трансформатор. Ось приклад:

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

Це також набагато швидше, тому що піпрой не потребує відтворення проекції для кожної точки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.