Skip to content

Verify units of distance between coordinates

7 messages · Justin Michell, Sarah Goslee, Michael Sumner +2 more

#
Dear geo R group

I have a data frame like this:

df <- data.frame(Lon = c(29.6000,29.7333,30.3887,30.6667,30.6833,30.8667), Lat = c(-4.9000,-4.6000,-5.1280,-1.0667,-2.7500,-3.3833),  
                  LonWater = c(29.63333,29.63333,30.25000,30.65000,30.35444,30.83278), LatWater = c(-4.31667,-4.31667,-4.76667,-1.35000,-2.46667,-3.57000), DstClW = c(0.5842815,0.3004491,0.3870362,0.2837918,0.4340793,0.1897561) )

At these locations (Lon, Lat pairs) I calculated the shortest distance to a water source (DstClW) and where that source is (LonWater, LatWater).

I want to now determine what units DstClW is in, and also verify that these distances make sense and were calculated correctly. 

Any suggestions as to how this might be done?

Regards
Justin Michell
#
They don't make sense.

Best: convert them into a projection where the distances are in meters
already, like UTM. Then distances calculated on your new coordinates
are in meters.

Latitude and longitude don't translate neatly into distances on their own.

Second best: find and use a great circle distance function that can
determine the correct distances for where those lat/lon coordinates
are on the earth's surface. There's been discussion on this list
before about calculating distances from geographic coordinates; google
should find them.

Sarah
On Thu, Aug 28, 2014 at 8:44 AM, Justin Michell <jwm302 at gmail.com> wrote:
#
On Thu, Aug 28, 2014 at 10:50 PM, Sarah Goslee <sarah.goslee at gmail.com> wrote:
However great circle from lat/lon is arguably the best since you can
really do get distance along a great circle (on the ellipsoid or the
sphere). (There are several algorithms, and also other methods for
e.g. loxodromes, and even other definitions of "straight".)

No projection has the property that any straight line is a great
circle, and most certainly *not* any of UTM family.

Cheers, Mike.

  
    
#
On Thu, Aug 28, 2014 at 9:32 AM, Michael Sumner <mdsumner at gmail.com> wrote:
True, but as long as your points are reasonably close together,
something like UTM is a very useful approximation. And even great
circle is an approximation. The best answer depends on the data and
the objectives (as always!).

  
    
#
On Thu, 28 Aug 2014, Sarah Goslee wrote:

            
The OP didn't say how the distances were computed:

library(sp)
locs <- SpatialPoints(cbind(Lon = c(29.6000, 29.7333, 30.3887, 30.6667,
  30.6833, 30.8667), Lat = c(-4.9000, -4.6000, -5.1280, -1.0667, -2.7500,
  -3.3833)), proj4string=CRS("+proj=longlat +datum=WGS84") )
src <- SpatialPoints(cbind(LonWater = c(29.63333, 29.63333, 30.25000,
  30.65000, 30.35444, 30.83278), LatWater = c(-4.31667, -4.31667, -4.76667,
  -1.35000, -2.46667, -3.57000)),
  proj4string=CRS("+proj=longlat +datum=WGS84"))

plot(locs)
plot(src, add=TRUE, col="red")

Naively using spDistsN1 appears to replicate the distances the OP got:

D0 <- lapply(1:length(locs), function(i) spDistsN1(src, locs[i],
  longlat=FALSE))

which is wrong.

D0 <- lapply(1:length(locs), function(i) spDistsN1(src, locs[i],
  longlat=TRUE))

is in km, but the minimum criterion is met by multiple pairs of points:

D1 <- lapply(D, function(x) x-min(x))
D1

so finding out which source is closest still isn't well-defined. To get 
minimum distances by location:

D2 <- sapply(D, min)

The spDists* functions use GC distances on a WGS84 ellipsoid, so are 
closer than a spheroid (many online shortcuts use spheroids), and will be 
OK if the input coordinates are also WGS84.

Hope this helps,

Roger

  
    
#
On Thu, 28 Aug 2014, Roger Bivand wrote:

            
Sorry:

D <- lapply(1:length(locs), function(i) spDistsN1(src, locs[i],
  longlat=TRUE))

of course.

  
    
2 days later
#
library(geosphere)

d <- distCosine(df[, 1:2], df[,3:4])
On Thu, Aug 28, 2014 at 8:02 AM, Roger Bivand <Roger.Bivand at nhh.no> wrote: