diff --git a/src/coordinates.jl b/src/coordinates.jl index 92b780b8a..1890d03e4 100644 --- a/src/coordinates.jl +++ b/src/coordinates.jl @@ -46,24 +46,34 @@ Parent type of all coordinate types. """ abstract type Coordinates{N} end -Base.isapprox(c₁::C, c₂::C; kwargs...) where {C<:Coordinates} = - all(isapprox(getfield(c₁, n), getfield(c₂, n); kwargs...) for n in fieldnames(C)) +_fields(coords::Coordinates) = coords +_fnames(coords::Coordinates) = fieldnames(typeof(coords)) + +function Base.isapprox(coords₁::C, coords₂::C; kwargs...) where {N,C<:Coordinates{N}} + f₁ = _fields(coords₁) + f₂ = _fields(coords₂) + all(isapprox(getfield(f₁, i), getfield(f₂, i); kwargs...) for i in 1:N) +end # ----------- # IO METHODS # ----------- function Base.show(io::IO, coords::Coordinates) - name = nameof(typeof(coords)) + name = prettyname(coords) print(io, "$name(") - printfields(io, coords, compact=true) + fields = _fields(coords) + fnames = _fnames(coords) + printfields(io, fields, fnames, compact=true) print(io, ")") end function Base.show(io::IO, ::MIME"text/plain", coords::Coordinates) - name = nameof(typeof(coords)) + name = prettyname(coords) print(io, "$name coordinates") - printfields(io, coords) + fields = _fields(coords) + fnames = _fnames(coords) + printfields(io, fields, fnames) end # ---------------- diff --git a/src/coordinates/basic.jl b/src/coordinates/basic.jl index 72975e2c1..93d04db51 100644 --- a/src/coordinates/basic.jl +++ b/src/coordinates/basic.jl @@ -30,23 +30,8 @@ Cartesian(coords::Vararg{L,N}) where {N,L<:Len} = Cartesian{N,L}(coords) Cartesian(coords::Len...) = Cartesian(promote(coords...)...) Cartesian(coords::Number...) = Cartesian(addunit.(coords, u"m")...) -Base.isapprox(c₁::Cartesian{N}, c₂::Cartesian{N}; kwargs...) where {N} = - all(isapprox(x₁, x₂; kwargs...) for (x₁, x₂) in zip(c₁.coords, c₂.coords)) - -function Base.show(io::IO, (; coords)::Cartesian{N}) where {N} - print(io, "Cartesian(") - fnames = _cartfields(N) - printfields(io, coords, fnames, compact=true) - print(io, ")") -end - -function Base.show(io::IO, ::MIME"text/plain", (; coords)::Cartesian{N}) where {N} - print(io, "Cartesian coordinates") - fnames = _cartfields(N) - printfields(io, coords, fnames) -end - -function _cartfields(N) +_fields(coords::Cartesian) = coords.coords +function _fnames(::Cartesian{N}) where {N} if N == 1 ("x",) elseif N == 2 diff --git a/src/coordinates/gis.jl b/src/coordinates/gis.jl index de3d8399e..6e5e1584b 100644 --- a/src/coordinates/gis.jl +++ b/src/coordinates/gis.jl @@ -16,6 +16,9 @@ end EPSG{Code,N,Coords}(args...) where {Code,N,Coords} = EPSG{Code,N,Coords}(Coords(args)) +_fields(coords::EPSG) = coords.coords +_fnames(coords::EPSG) = keys(coords.coords) + """ typealias(::Type{EPSG{code}}) @@ -23,22 +26,6 @@ Returns a coordinate type that has the EPSG `code`. """ function typealias end -Base.isapprox(c₁::T, c₂::T; kwargs...) where {T<:EPSG} = - all(isapprox(x₁, x₂; kwargs...) for (x₁, x₂) in zip(c₁.coords, c₂.coords)) - -function Base.show(io::IO, coords::EPSG) - name = prettyname(coords) - print(io, "$name(") - printfields(io, coords.coords, compact=true) - print(io, ")") -end - -function Base.show(io::IO, ::MIME"text/plain", coords::EPSG) - name = prettyname(coords) - print(io, "$name coordinates") - printfields(io, coords.coords) -end - """ LatLon(lat, lon)