Skip to content

Commit

Permalink
Merge 7ca822e into 2a13add
Browse files Browse the repository at this point in the history
  • Loading branch information
snowman2 committed Jan 27, 2020
2 parents 2a13add + 7ca822e commit 194b99e
Show file tree
Hide file tree
Showing 9 changed files with 110 additions and 139 deletions.
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

0 comments on commit 194b99e

Please sign in to comment.