Düzgün Poligon ve MultiPolygon nesnelerini dönüştürme


26

Shapely nesnelerini (yani, Çokgenler ve Çok Poligonlar) bir projeksiyondan diğerine dönüştürmek ve elle koordinat kazmak zorunda kalmadan dönüştürmenin kolay bir yolu var mı?

Aslında, onların bu noktada Düzgün nesneler olup olmadıklarını bile umursamıyorum, sadece özellikleri ve bir projeksiyonu geçmek ve yeniden tasarlanmış bir dizi özelliği geri almak istiyorum.

Bu tür bir işlevsellik var mı, yoksa elle kodlanmalı mı?


2
Bunun Shapely'nin kapsamı dışında olduğuna inanıyorum, Fiona'ya bakmak isteyebilirsiniz. fiona.transformneye ihtiyacın var gibi görünüyor.
Jason Scheirer

Yanıtlar:


50

Düzenli olarak koordinat sistemlerini doğal olarak anlamamasına rağmen shapely.ops.transform(), bunu birlikte de yapabilir pyproj. Her pyproj.Projiki koordinat sisteminizi de anlayabiliyorsanız, o zaman düzgün biçimde dönüştürebilecek bir fonksiyon haline getirilebilir.

Düzgün belgelerde :

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
itertoolsModülü kullanmak istemiyorsanız project = lambda x, y: pyproj.transform(pyproj.Proj(init='epsg:4326'), pyproj.Proj(init='epsg:26913'), x, y)ve sonra yapabilirsiniz g2 = transform(project, g1).
Elmex80s

1
Bu önerilen cevap pyproj1 içindir, oysa şimdi pyproj2 kullanımı için tercih edilen bir dönüşüm vardır Transformer. Buraya bakın: pyproj4.github.io/pyproj/stable/gotchas.html
Bilgi için Susuzluk

11

Düzgün bir çözüm olmasa da, GeoPanda'ların kullanılması göreceli olarak basit projeksiyona izin verir. Örneğin, bir biçim dosyasını ESPG 4326'ya dönüştürmek istiyorsak:

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 kullanır (örneğin, geodataframe.py'ye bakın)
gen,

0

Eğer pyproj2 kullanıyorsanız, Transformer kullanmak çok daha kolaydır. İşte bir örnek:

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

Bu da çok daha hızlı, çünkü pyproj projeksiyonun her nokta için yeniden oluşturulması gerekmiyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.