Compute the Tissot indicatrix at given longitude/latitude locations for a map projection. Returns scale factors, angular deformation, convergence, and related distortion properties.

tissot(
  x,
  target,
  ...,
  source = "EPSG:4326",
  A = 6378137,
  f.inv = 298.257223563,
  dx = 1e-04
)

Arguments

x

input coordinates — any xy-ish object: a two-column matrix, data.frame, tibble, list with x/y or lon/lat components, or a length-2 numeric vector for a single point

target

target projection CRS string (required)

...

ignored

source

source CRS (default "EPSG:4326")

A

semi-major axis of the ellipsoid (default WGS84)

f.inv

inverse flattening (default WGS84)

dx

finite difference step in degrees (default 1e-4)

Value

A tissot_tbl tibble with columns: x (lon), y (lat), dx_dlam, dy_dlam, dx_dphi, dy_dphi, scale_h, scale_k, scale_omega, scale_a, scale_b, scale_area, angle_deformation, convergence. The source and target CRS strings are stored as attributes.

Details

The Jacobian of the projection is computed via finite differences, projecting all base and offset points in a single batched call to gdalraster::transform_xy(). All subsequent calculations (SVD, distortion metrics) are fully vectorized.

Input 'x' is assumed to be longitude,latitude values, with default 'EPSG:4326'. Set 'source' for a different 'geographic' coordinate reference system.

Examples

tissot(c(0, 45), "+proj=robin")
#> Tissot indicatrix: 1 point, +proj=robin
#> # A tibble: 1 × 14
#>       x     y dx_dlam dy_dlam dx_dphi dy_dphi scale_h scale_k scale_omega
#>   <dbl> <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>       <dbl>
#> 1     0    45    1.07       0       0   0.946   0.946    1.07        7.25
#> # ℹ 5 more variables: scale_a <dbl>, scale_b <dbl>, scale_area <dbl>,
#> #   angle_deformation <dbl>, convergence <dbl>
tissot(cbind(seq(-180, 180, by = 30), 0), "+proj=robin")
#> Tissot indicatrix: 13 points, +proj=robin
#> # A tibble: 13 × 14
#>        x     y      dx_dlam dy_dlam  dx_dphi dy_dphi scale_h scale_k scale_omega
#>    <dbl> <dbl>        <dbl>   <dbl>    <dbl>   <dbl>   <dbl>   <dbl>       <dbl>
#>  1  -180     0        0.849       0  1.10e-6   0.967   0.967 8.49e-1        7.49
#>  2  -150     0        0.849       0  9.17e-7   0.967   0.967 8.49e-1        7.49
#>  3  -120     0        0.849       0  7.34e-7   0.967   0.967 8.49e-1        7.49
#>  4   -90     0        0.849       0  5.50e-7   0.967   0.967 8.49e-1        7.49
#>  5   -60     0        0.849       0  3.67e-7   0.967   0.967 8.49e-1        7.49
#>  6   -30     0        0.849       0  1.83e-7   0.967   0.967 8.49e-1        7.49
#>  7     0     0        0.849       0  0         0.967   0.967 8.49e-1        7.49
#>  8    30     0        0.849       0 -1.83e-7   0.967   0.967 8.49e-1        7.49
#>  9    60     0        0.849       0 -3.67e-7   0.967   0.967 8.49e-1        7.49
#> 10    90     0        0.849       0 -5.50e-7   0.967   0.967 8.49e-1        7.49
#> 11   120     0        0.849       0 -7.34e-7   0.967   0.967 8.49e-1        7.49
#> 12   150     0        0.849       0 -9.17e-7   0.967   0.967 8.49e-1        7.49
#> 13   180     0 -3055319.          0 -1.10e-6   0.967   0.967 3.06e+6      180.  
#> # ℹ 5 more variables: scale_a <dbl>, scale_b <dbl>, scale_area <dbl>,
#> #   angle_deformation <dbl>, convergence <dbl>