125 lines
4.1 KiB
Python
125 lines
4.1 KiB
Python
"""Coordinate and geometry warping and reprojection"""
|
|
|
|
from warnings import warn
|
|
|
|
from fiona._transform import _transform, _transform_geom
|
|
from fiona.compat import DICT_TYPES
|
|
from fiona.errors import FionaDeprecationWarning
|
|
from fiona.model import decode_object, Geometry
|
|
|
|
|
|
def transform(src_crs, dst_crs, xs, ys):
|
|
"""Transform coordinates from one reference system to another.
|
|
|
|
Parameters
|
|
----------
|
|
src_crs: str or dict
|
|
A string like 'EPSG:4326' or a dict of proj4 parameters like
|
|
{'proj': 'lcc', 'lat_0': 18.0, 'lat_1': 18.0, 'lon_0': -77.0}
|
|
representing the coordinate reference system on the "source"
|
|
or "from" side of the transformation.
|
|
dst_crs: str or dict
|
|
A string or dict representing the coordinate reference system
|
|
on the "destination" or "to" side of the transformation.
|
|
xs: sequence of float
|
|
A list or tuple of x coordinate values. Must have the same
|
|
length as the ``ys`` parameter.
|
|
ys: sequence of float
|
|
A list or tuple of y coordinate values. Must have the same
|
|
length as the ``xs`` parameter.
|
|
|
|
Returns
|
|
-------
|
|
xp, yp: list of float
|
|
A pair of transformed coordinate sequences. The elements of
|
|
``xp`` and ``yp`` correspond exactly to the elements of the
|
|
``xs`` and ``ys`` input parameters.
|
|
|
|
Examples
|
|
--------
|
|
|
|
>>> transform('EPSG:4326', 'EPSG:26953', [-105.0], [40.0])
|
|
([957097.0952383667], [378940.8419189212])
|
|
|
|
"""
|
|
# Function is implemented in the _transform C extension module.
|
|
return _transform(src_crs, dst_crs, xs, ys)
|
|
|
|
|
|
def transform_geom(
|
|
src_crs,
|
|
dst_crs,
|
|
geom,
|
|
antimeridian_cutting=False,
|
|
antimeridian_offset=10.0,
|
|
precision=-1,
|
|
):
|
|
"""Transform a geometry obj from one reference system to another.
|
|
|
|
Parameters
|
|
----------
|
|
src_crs: str or dict
|
|
A string like 'EPSG:4326' or a dict of proj4 parameters like
|
|
{'proj': 'lcc', 'lat_0': 18.0, 'lat_1': 18.0, 'lon_0': -77.0}
|
|
representing the coordinate reference system on the "source"
|
|
or "from" side of the transformation.
|
|
dst_crs: str or dict
|
|
A string or dict representing the coordinate reference system
|
|
on the "destination" or "to" side of the transformation.
|
|
geom: obj
|
|
A GeoJSON-like geometry object with 'type' and 'coordinates'
|
|
members or an iterable of GeoJSON-like geometry objects.
|
|
antimeridian_cutting: bool, optional
|
|
``True`` to cut output geometries in two at the antimeridian,
|
|
the default is ``False`.
|
|
antimeridian_offset: float, optional
|
|
A distance in decimal degrees from the antimeridian, outside of
|
|
which geometries will not be cut.
|
|
precision: int, optional
|
|
Round geometry coordinates to this number of decimal places.
|
|
This parameter is deprecated and will be removed in 2.0.
|
|
|
|
Returns
|
|
-------
|
|
obj
|
|
A new GeoJSON-like geometry (or a list of GeoJSON-like geometries
|
|
if an iterable was given as input) with transformed coordinates. Note
|
|
that if the output is at the antimeridian, it may be cut and
|
|
of a different geometry ``type`` than the input, e.g., a
|
|
polygon input may result in multi-polygon output.
|
|
|
|
Examples
|
|
--------
|
|
|
|
>>> transform_geom(
|
|
... 'EPSG:4326', 'EPSG:26953',
|
|
... {'type': 'Point', 'coordinates': [-105.0, 40.0]})
|
|
{'type': 'Point', 'coordinates': (957097.0952383667, 378940.8419189212)}
|
|
|
|
"""
|
|
if precision >= 0:
|
|
warn(
|
|
"The precision keyword argument is deprecated and will be removed in 2.0",
|
|
FionaDeprecationWarning,
|
|
)
|
|
|
|
# Function is implemented in the _transform C extension module.
|
|
if isinstance(geom, (Geometry,) + DICT_TYPES):
|
|
return _transform_geom(
|
|
src_crs,
|
|
dst_crs,
|
|
decode_object(geom),
|
|
antimeridian_cutting,
|
|
antimeridian_offset,
|
|
precision,
|
|
)
|
|
else:
|
|
return _transform_geom(
|
|
src_crs,
|
|
dst_crs,
|
|
(decode_object(g) for g in geom),
|
|
antimeridian_cutting,
|
|
antimeridian_offset,
|
|
precision,
|
|
)
|