mirror of
https://github.com/wassname/geopandas.git
synced 2026-09-20 12:50:47 +08:00
88 lines
2.8 KiB
ReStructuredText
88 lines
2.8 KiB
ReStructuredText
Re-projecting using GDAL with Rasterio and Fiona
|
|
================================================
|
|
|
|
The simplest method of re-projecting is :meth:`GeoDataFrame.to_crs`.
|
|
It uses ``pyproj`` as the engine and transforms the points within the geometries.
|
|
|
|
These examples demonstrate how to use ``Fiona`` or ``rasterio`` as the engine to re-project your data.
|
|
Fiona and rasterio are powered by GDAL and with algorithms that consider the geometry instead of
|
|
just the points the geometry contains. This is particularly useful for antimeridian cutting.
|
|
However, this also means the transformation is not as fast.
|
|
|
|
|
|
Fiona Example
|
|
-------------
|
|
|
|
.. code-block:: python
|
|
|
|
from functools import partial
|
|
|
|
import fiona
|
|
import geopandas
|
|
from fiona.transform import transform_geom
|
|
from packaging import version
|
|
from pyproj import CRS
|
|
from pyproj.enums import WktVersion
|
|
from shapely.geometry import mapping, shape
|
|
|
|
|
|
# set up Fiona transformer
|
|
def crs_to_fiona(proj_crs):
|
|
proj_crs = CRS.from_user_input(proj_crs)
|
|
if version.parse(fiona.__gdal_version__) < version.parse("3.0.0"):
|
|
fio_crs = proj_crs.to_wkt(WktVersion.WKT1_GDAL)
|
|
else:
|
|
# GDAL 3+ can use WKT2
|
|
fio_crs = proj_crs.to_wkt()
|
|
return fio_crs
|
|
|
|
def base_transformer(geom, src_crs, dst_crs):
|
|
return shape(
|
|
transform_geom(
|
|
src_crs=crs_to_fiona(src_crs),
|
|
dst_crs=crs_to_fiona(dst_crs),
|
|
geom=mapping(geom),
|
|
antimeridian_cutting=True,
|
|
)
|
|
)
|
|
|
|
# load example data
|
|
world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))
|
|
|
|
destination_crs = "EPSG:3395"
|
|
forward_transformer = partial(base_transformer, src_crs=world.crs, dst_crs=destination_crs)
|
|
|
|
# Reproject to Mercator (after dropping Antartica)
|
|
world = world[(world.name != "Antarctica") & (world.name != "Fr. S. Antarctic Lands")]
|
|
with fiona.Env(OGR_ENABLE_PARTIAL_REPROJECTION="YES"):
|
|
mercator_world = world.set_geometry(world.geometry.apply(forward_transformer), crs=destination_crs)
|
|
|
|
|
|
Rasterio Example
|
|
----------------
|
|
|
|
This example requires rasterio 1.2+ and GDAL 3+.
|
|
|
|
|
|
.. code-block:: python
|
|
|
|
import geopandas
|
|
import rasterio.warp
|
|
from shapely.geometry import shape
|
|
|
|
# load example data
|
|
world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))
|
|
# Reproject to Mercator (after dropping Antartica)
|
|
world = world[(world.name != "Antarctica") & (world.name != "Fr. S. Antarctic Lands")]
|
|
|
|
destination_crs = "EPSG:3395"
|
|
geometry = rasterio.warp.transform_geom(
|
|
src_crs=world.crs,
|
|
dst_crs=destination_crs,
|
|
geom=world.geometry.values,
|
|
)
|
|
mercator_world = world.set_geometry(
|
|
[shape(geom) for geom in geometry],
|
|
crs=destination_crs,
|
|
)
|