[R-sig-Geo] Verify units of distance between coordinates

Roger Bivand Roger.Bivand at nhh.no
Thu Aug 28 16:58:29 CEST 2014


On Thu, 28 Aug 2014, Sarah Goslee wrote:

> On Thu, Aug 28, 2014 at 9:32 AM, Michael Sumner <mdsumner at gmail.com> wrote:
>> On Thu, Aug 28, 2014 at 10:50 PM, Sarah Goslee <sarah.goslee at gmail.com> wrote:
>>> 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.
>>
>> 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.
>
> 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!).

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

>
>> Cheers, Mike.
>>
>>
>>>
>>> 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:
>>>> 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
>>>>
>>>>
>
>
>

-- 
Roger Bivand
Department of Economics, Norwegian School of Economics,
Helleveien 30, N-5045 Bergen, Norway.
voice: +47 55 95 93 55; fax +47 55 95 91 00
e-mail: Roger.Bivand at nhh.no



More information about the R-sig-Geo mailing list