Convert between geographic coordinates and the Cassini-Soldner projection. This is a transverse cylindrical equidistant projection historically used for large-scale mapping.

cassini_fwd(x, lon0, lat0)

cassini_rev(x, y, lon0, lat0)

Arguments

x

For forward conversion: a two-column matrix or data frame of coordinates (longitude, latitude) in decimal degrees. For reverse conversion: numeric vector of x (easting) coordinates in meters.

lon0

Longitude of the central meridian in decimal degrees.

lat0

Latitude of the origin in decimal degrees.

y

Numeric vector of y (northing) coordinates in meters.

Value

Data frame with columns:

  • For forward conversion:

    • x: Easting in meters

    • y: Northing in meters

    • azi: Azimuth of the geodesic from the central point (degrees)

    • rk: Reciprocal of the azimuthal scale

    • lon, lat: Input coordinates (echoed)

  • For reverse conversion:

    • lon: Longitude in decimal degrees

    • lat: Latitude in decimal degrees

    • azi: Azimuth of the geodesic from the central point (degrees)

    • rk: Reciprocal of the azimuthal scale

    • x, y: Input coordinates (echoed)

Details

The Cassini-Soldner projection was historically used for large-scale topographic mapping before UTM became standard. It is still used in some countries and for historical map analysis.

Key properties:

  • Distances along the central meridian are preserved

  • Transverse cylindrical equidistant projection

  • Not conformal (angles are not preserved)

See also

utmups_fwd() for UTM projection, lcc_fwd() for Lambert Conformal Conic

Examples

# Project relative to a central meridian
pts <- cbind(lon = c(-100, -99, -101), lat = c(40, 41, 39))
cassini_fwd(pts, lon0 = -100, lat0 = 40)
#>           x             y      azi        rk  lon lat
#> 1      0.00  7.069289e-10 90.00000 1.0000000 -100  40
#> 2  84133.35  1.115260e+05 90.65610 0.9999129  -99  41
#> 3 -86624.66 -1.105493e+05 89.37064 0.9999076 -101  39

# Round-trip
fwd <- cassini_fwd(pts, lon0 = -100, lat0 = 40)
cassini_rev(fwd$x, fwd$y, lon0 = -100, lat0 = 40)
#>    lon lat      azi        rk         x             y
#> 1 -100  40 90.00000 1.0000000      0.00  7.069289e-10
#> 2  -99  41 90.65610 0.9999129  84133.35  1.115260e+05
#> 3 -101  39 89.37064 0.9999076 -86624.66 -1.105493e+05