Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 13 additions & 3 deletions docs/api/crs/datum.rst
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,20 @@ CustomDatum


Ellipsoid
---------
----------

.. autoclass:: pyproj.crs.Ellipsoid
:members:
:inherited-members:


- :class:`pyproj.crs.Ellipsoid`
- :class:`pyproj.crs.ellipsoid.CustomEllipsoid`
CustomEllipsoid
----------------

.. autoclass:: pyproj.crs.datum.CustomEllipsoid
:members:
:show-inheritance:
:special-members: __new__


Prime Meridian
Expand Down
19 changes: 0 additions & 19 deletions docs/api/crs/ellipsoid.rst

This file was deleted.

14 changes: 2 additions & 12 deletions docs/build_crs.rst
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ Here are links to the API docs for the pieces you need to get started:
- :ref:`crs`
- :ref:`coordinate_operation`
- :ref:`datum`
- :ref:`ellipsoid`
- :ref:`coordinate_system`


Expand Down Expand Up @@ -100,8 +99,7 @@ PROJ string::

from pyproj.crs import GeographicCRS, ProjectedCRS
from pyproj.crs.coordinate_operation import UTMConversion
from pyproj.crs.datum import CustomDatum
from pyproj.crs.ellipsoid import CustomEllipsoid
from pyproj.crs.datum import CustomDatum, CustomEllipsoid

ell = CustomEllipsoid(
semi_major_axis=6378137,
Expand Down Expand Up @@ -142,15 +140,7 @@ PROJ string::
scale_factor_natural_origin=0.9996,
),
geodetic_crs=GeographicCRS(
datum=CustomDatum(
ellipsoid={
"$schema": "https://proj.org/schemas/v0.2/projjson.schema.json",
"type": "Ellipsoid",
"name": "International 1909 (Hayford)",
"semi_major_axis": 6378388,
"inverse_flattening": 297,
}
)
datum=CustomDatum(ellipsoid="International 1909 (Hayford)")
),
)
bound_crs = BoundCRS(
Expand Down
2 changes: 1 addition & 1 deletion pyproj/_crs.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ from collections import OrderedDict

from pyproj._datadir cimport pyproj_context_initialize
from pyproj.compat import cstrencode, pystrdecode
from pyproj.crs.ellipsoid import CustomEllipsoid
from pyproj.crs.datum import CustomEllipsoid
from pyproj.crs.enums import CoordinateOperationType, DatumType
from pyproj.enums import ProjVersion, WktVersion
from pyproj.exceptions import CRSError
Expand Down
50 changes: 49 additions & 1 deletion pyproj/crs/datum.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ def __new__(cls, ellipsoid="WGS 84", prime_meridian="Greenwich"):
----------
ellipsoid: Any, optional
Anything accepted by :meth:`pyproj.crs.Ellipsoid.from_user_input`
or a :class:`pyproj.crs.ellipsoid.CustomEllipsoid`.
or a :class:`pyproj.crs.datum.CustomEllipsoid`.
prime_meridian: Any, optional
Anything accepted by :meth:`pyproj.crs.PrimeMeridian.from_user_input`.
"""
Expand All @@ -27,3 +27,51 @@ def __new__(cls, ellipsoid="WGS 84", prime_meridian="Greenwich"):
).to_json_dict(),
}
return cls.from_json_dict(datum_json)


class CustomEllipsoid(Ellipsoid):
"""
.. versionadded:: 2.5.0

Class to build a custom ellipsoid.
"""

def __new__(
cls,
name="undefined",
semi_major_axis=None,
inverse_flattening=None,
semi_minor_axis=None,
radius=None,
):
"""
Parameters
----------
name: str, optional
Name of the ellipsoid. Default is 'undefined'.
semi_major_axis: float, optional
The semi major axis in meters. Required if missing radius.
inverse_flattening: float, optional
The inverse flattening in meters.
Required if missing semi_minor_axis and radius.
semi_minor_axis: float, optional
The semi minor axis in meters.
Required if missing inverse_flattening and radius.
radius: float, optional
The radius in meters. Can only be used alone.
Cannot be mixed with other parameters.
"""
ellipsoid_json = {
"$schema": "https://proj.org/schemas/v0.2/projjson.schema.json",
"type": "Ellipsoid",
"name": name,
}
if semi_major_axis is not None:
ellipsoid_json["semi_major_axis"] = semi_major_axis
if inverse_flattening is not None:
ellipsoid_json["inverse_flattening"] = inverse_flattening
if semi_minor_axis is not None:
ellipsoid_json["semi_minor_axis"] = semi_minor_axis
if radius is not None:
ellipsoid_json["radius"] = radius
return cls.from_json_dict(ellipsoid_json)
49 changes: 0 additions & 49 deletions pyproj/crs/ellipsoid.py

This file was deleted.

45 changes: 44 additions & 1 deletion test/crs/test_crs_datum.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
from pyproj.crs.datum import CustomDatum, Ellipsoid, PrimeMeridian
from numpy.testing import assert_almost_equal

from pyproj.crs.datum import CustomDatum, CustomEllipsoid, Ellipsoid, PrimeMeridian


def test_custom_datum():
Expand All @@ -14,3 +16,44 @@ def test_custom_datum__input():
)
assert cd.ellipsoid.name == "Airy 1830"
assert cd.prime_meridian.name == "Lisbon"


def test_custom_ellipsoid():
ce = CustomEllipsoid(semi_major_axis=6378137, inverse_flattening=298.257222101)
assert ce.name == "undefined"
assert ce.semi_major_metre == 6378137
assert ce.semi_minor_metre == 6356752.314140356
assert_almost_equal(ce.inverse_flattening, 298.257222101)
assert sorted(ce.to_json_dict()) == [
"$schema",
"inverse_flattening",
"name",
"semi_major_axis",
"type",
]


def test_custom_ellipsoid__minor():
ce = CustomEllipsoid(
name="test", semi_major_axis=6378137, semi_minor_axis=6356752.314
)
assert ce.name == "test"
assert ce.semi_major_metre == 6378137
assert ce.semi_minor_metre == 6356752.314
assert_almost_equal(ce.inverse_flattening, 298.25722014)
assert sorted(ce.to_json_dict()) == [
"$schema",
"name",
"semi_major_axis",
"semi_minor_axis",
"type",
]


def test_custom_ellipsoid__radius():
ce = CustomEllipsoid(radius=6378137)
assert ce.name == "undefined"
assert ce.semi_major_metre == 6378137
assert ce.semi_minor_metre == 6378137
assert ce.inverse_flattening == 0
assert sorted(ce.to_json_dict()) == ["$schema", "name", "radius", "type"]
44 changes: 0 additions & 44 deletions test/crs/test_crs_ellipsoid.py

This file was deleted.

10 changes: 1 addition & 9 deletions test/crs/test_crs_maker.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,15 +125,7 @@ def test_bound_crs__example():
scale_factor_natural_origin=0.9996,
),
geodetic_crs=GeographicCRS(
datum=CustomDatum(
ellipsoid={
"$schema": "https://proj.org/schemas/v0.2/projjson.schema.json",
"type": "Ellipsoid",
"name": "International 1909 (Hayford)",
"semi_major_axis": 6378388,
"inverse_flattening": 297,
}
)
datum=CustomDatum(ellipsoid="International 1909 (Hayford)")
),
)
bound_crs = BoundCRS(
Expand Down