R: Euclidean or Great Circle distance between points

spDistsN1 {sp} | R Documentation

## Euclidean or Great Circle distance between points

### Description

The function returns a vector of distances between a matrix of 2D points, first column longitude, second column latitude, and a single 2D point, using Euclidean or Great Circle distance (WGS84 ellipsoid) methods.

### Usage

    spDistsN1(pts, pt, longlat = FALSE)
    spDists(x, y = x, longlat = FALSE, segments = FALSE, diagonal = FALSE)

### Arguments

`pts` | A matrix of 2D points, first column x/longitude, second column y/latitude, or a SpatialPoints or SpatialPointsDataFrame object
`pt` | A single 2D point, first value x/longitude, second value y/latitude, or a SpatialPoints or SpatialPointsDataFrame object with one point only
`x` | A matrix of n-D points with row denoting points, first column x/longitude, second column y/latitude, or a Spatial object that has a coordinates method
`y` | A matrix of n-D points with row denoting points, first column x/longitude, second column y/latitude, or a Spatial object that has a coordinates method
`longlat` | logical; if FALSE, Euclidean distance, if TRUE Great Circle (WGS84 ellipsoid) distance; if `x` is a Spatial object, longlat should not be specified but will be derived from is.projected`(x)`
`segments` | logical; if `TRUE`, `y` must be missing; the vector of distances between consecutive points in `x` is returned.
`diagonal` | logical; if `TRUE`, `y` must be given and have the same number of points as `x`; the vector with distances between points with identical index is returned.

### Value

`spDistsN1` returns a numeric vector of distances in the metric of the points if longlat=FALSE, or in kilometers if longlat=TRUE.

`spDists` returns a full matrix of distances in the metric of the points if longlat=FALSE, or in kilometers if longlat=TRUE; it uses `spDistsN1` in case points are two-dimensional. In case of `spDists(x,x)`, it will compute all n x n distances, not the sufficient n x (n-1).

### Note

The function can also be used to find a local kilometer equivalent to a plot scaled in decimal degrees in order to draw a scale bar.

### Author(s)

Roger Bivand, Edzer Pebesma

### References

`http://www.abecedarical.com/javascript/script_greatcircle.html`

### See Also

`is.projected`

### Examples

    ll <- matrix(c(5, 6, 60, 60), ncol=2)
    km <- spDistsN1(ll, ll[1,], longlat=TRUE)
    zapsmall(km)
    utm32 <- matrix(c(276.9799, 332.7052, 6658.1572, 6655.2055), ncol=2)
    spDistsN1(utm32, utm32[1,])
    dg <- spDistsN1(ll, ll[1,])
    dg
    dg[2]/km[2]
    data(meuse)
    coordinates(meuse) <- c("x", "y")
    res <- spDistsN1(meuse, meuse[1,])
    summary(res)

    p1 = SpatialPoints(cbind(1:3, 1:3))
    spDists(p1)
    spDists(p1, p1)
    spDists(p1, p1, diagonal = TRUE)
    try(spDists(p1, p1, segments = TRUE))
    spDists(p1, segments = TRUE)
    p2 = SpatialPoints(cbind(5:2, 2:5))
    spDists(p1, p2)
    try(spDists(p1, p2, diagonal = TRUE)) # fails
    try(spDists(p1, p2, segments = TRUE)) # fails

    # longlat points:
    proj4string(p1) = "+proj=longlat +ellps=WGS84"
    proj4string(p2) = "+proj=longlat +ellps=WGS84"
    is.projected(p1)
    is.projected(p2)
    spDists(p1)
    spDists(p1, p1)
    spDists(p1, p1, diagonal = TRUE)
    spDists(p1, p2)
    try(spDists(p1, p2, diagonal = TRUE)) # fails
    spDists(p1, p2[1:length(p1),], diagonal = TRUE)
    spDists(p1, segments = TRUE)
    spDists(p1[0],p2[0],diagonal=TRUE)
    spDists(p1[0])

    p1 = SpatialPoints(cbind(1:3, 1:3, 1:3))
    spDists(p1)
    spDists(p1, p1)
    try(spDists(p1, p1, diagonal = TRUE))
    try(spDists(p1, p1, segments = TRUE))
    try(spDists(p1, segments = TRUE))
    p2 = SpatialPoints(cbind(5:2, 2:5, 3:6))
    spDists(p1, p2)
    try(spDists(p1, p2, diagonal = TRUE)) # fails
    try(spDists(p1, p2, segments = TRUE)) # fails

[Package sp version 1.4-5 Index]