[R-sig-Geo] How to calculate the latlng of a point in a certain distance away from another?
Ashton Shortridge
ashton at msu.edu
Thu Apr 18 21:07:59 CEST 2013
Hi Endri,
I assumed your distances were in a planar coordinate system. "Distances" in
decimal degrees don't really make sense, as decimal degrees are a spherical
system and distances need to be calculated and handled differently.
The results you got with:
simCoords(p,500)
[1] 125.7413 512.6246
got you a location 500 units away (on a cartesian plane) from that initial
coordinate, but of course it's not a valid location on the earth's surface.
You could of course simulate a location "1 degree away" and get a coordinate
that wouldn't look unreasonable, but it wouldn't really be correct.
The second code you included looks pretty jumbled in email. I've attached the
original script rather than pasting the code inline this time. Maybe that will
work better. It works fine on my R install, pasted to the command line. Vanilla
R, no extensions needed.
Ashton
On 04/18/13, Endri Raco, wrote:
> Thanx Ashton,
>
> Experimenting on a starting point from Google maps
> p<-c(41.32217,19.802721)
>
> > simCoords(p,500)[1] 125.7413 512.6246.
>
> I suppose these are in radians and need to be converted?
>
> using
>
> > distances <- c(0.00000000, 0.02725136, 1.07634471, 1.15963225,+
> > 1.71421571, 2.54945626, 4.29135102, 4.53532958, 4.58512710,
> > 4.86466833,+ 5.24266630, 5.63505465)> > exampleCoords <-
> > lapply(distances, simCoords, origin=c(41.32217,19.802721))>
> > plot(41.32217,19.802721, xlim=c(-10,10), ylim=c(-10,10), pch=2,
> > col='blue', cex=2,+ main='Points near a bus stop')> for (p in
> > 1:length(exampleCoords)) {+
> > points(exampleCoords[p][[1]][1],exampleCoords[p][[1]][2])+ }
>
> I still dont get any results.
>
> What I am doing wrong?
>
> Please help me understand.
>
> Regards
>
> On Thu, Apr 18, 2013 at 8:28 PM, Ashton Shortridge <ashton at msu.edu>
wrote:
> > Dear Endri,
> >
> > do you simply wish to simulate coordinates for these locations? Because,
> > assuming you are working on a planar system and those distances are
> > euclidean,
> > each of those distances is a radius for an infinite number of locations
> > on a
> > circle around your bus stop.
> >
> > Code like this might then do what you want:
> >
> > simCoords <- function(origin, dist) {
> >
> > # 'origin' is a 2-element vector (x,y) of the starting coordinate
> > # 'dist' is the distance of the offset from this origin to simulate
> >
> > # simulate an angle in radians
> > alpha <- runif(1,-pi,pi)
> >
> > # Calculate x and y offsets
> > yoff <- dist * sin(alpha)
> > xoff <- dist * cos(alpha)
> >
> > # Add offsets to origin, return a vector coordinate
> > return (c(origin[1] + xoff, origin[2] + yoff))
> >
> > }
> >
> > # Simple function test
> > simCoords(c(0,0), 10)
> >
> > # Graphical test of the function
> > plot(0,0, xlim=c(-15,15), ylim=c(-15,15), main='This had better look like
> > a circle!')
> > for (i in 1:1000) {
> >
> > pt <- simCoords(c(0,0), 10)
> > points(pt[1], pt[2])
> >
> > }
> >
> > # Test using your distances
> > distances <- c(0.00000000, 0.02725136, 1.07634471, 1.15963225,
> > 1.71421571, 2.54945626, 4.29135102, 4.53532958, 4.58512710,
> > 4.86466833, 5.24266630, 5.63505465)
> >
> > exampleCoords <- lapply(distances, simCoords, origin=c(0,0))
> > plot(0,0, xlim=c(-10,10), ylim=c(-10,10), pch=2, col='blue', cex=2,
> > main='Points near a bus stop')
> > for (p in 1:length(exampleCoords)) {
> >
> > points(exampleCoords[p][[1]][1],exampleCoords[p][[1]][2])
> >
> > }
> >
> > # A final test: plotting many, many simulations should look like a map of
> > nested circles
> > plot(0,0, xlim=c(-10,10), ylim=c(-10,10), pch=2, col='blue', cex=2,
> > main='Points near a bus stop, nsim=200\nThis should look like a bunch of
> > nested circles!')
> > for (i in 1:200) {
> >
> > exampleCoords <- lapply(distances, simCoords, origin=c(0,0))
> > for (p in 1:length(exampleCoords)) {
> >
> > points(exampleCoords[p][[1]][1],exampleCoords[p][[1]][2],
> > cex=0.4)
> >
> > }
> >
> > }
> >
> >
> > Hope this helps,
> >
> > Ashton
> >
> > On 04/18/13, Endri Raco, wrote:
> > > Hi group,
> > > I am stacked in a problem like this.
> > > I have a bus stop with known coordinates.
> > > I generate in R language distances from this bus stop. Values of these
> > > distances are like below
> > > (in km)
> > >
> > >
> > > 0.00000000 0.02725136 1.07634471 1.15963225 1.71421571
2.54945626
> > > 4.29135102 4.53532958 4.58512710 4.86466833 5.24266630
5.63505465
> > >
> > > I need to convert this distances in coordinates in order to reflect
> > > points in map which are these distances far from starting bus stop.
> > >
> > >
> > >
> > > Any ideas about this?
> > >
> > > Please help
> > >
> > > Regards
> > >
> > > [[alternative HTML version deleted]]
> > >
> > > _______________________________________________
> > > R-sig-Geo mailing list
> > > R-sig-Geo at r-project.org
> > > https://stat.ethz.ch/mailman/listinfo/r-sig-geo
> >
> > -----
> > Ashton Shortridge
> > Associate Professor ashton at msu.edu
> > Dept of Geography http://www.msu.edu/~ashton
> > 235 Geography Building ph (517) 432-3561
> > Michigan State University fx (517) 432-1671
-----
Ashton Shortridge
Associate Professor ashton at msu.edu
Dept of Geography http://www.msu.edu/~ashton
235 Geography Building ph (517) 432-3561
Michigan State University fx (517) 432-1671
-------------- next part --------------
# simCoords.R
# Based on a response to the R spatial mailing list, asking
# for help generating coordinates from a vector of distances from an origin.
# written by A. Shortridge, 4/2013
simCoords <- function(origin, dist) {
# Origin is a 2-element vector (x,y) of the starting coordinate
# dist is the distance of the offset from this origin to simulate
# simulate an angle in radians
alpha <- runif(1,-pi,pi)
# Calculate x and y offsets
yoff <- dist * sin(alpha)
xoff <- dist * cos(alpha)
# Add offsets to origin, return a vector coordinate
return (c(origin[1] + xoff, origin[2] + yoff))
}
# Simple function test
simCoords(c(0,0), 10)
# Graphical test of the function
plot(0,0, xlim=c(-15,15), ylim=c(-15,15))
for (i in 1:1000) {
pt <- simCoords(c(0,0), 10)
points(pt[1], pt[2])
}
# Test of your distances
distances <- c(0.00000000, 0.02725136, 1.07634471, 1.15963225, 1.71421571, 2.54945626, 4.29135102, 4.53532958, 4.58512710, 4.86466833, 5.24266630, 5.63505465)
exampleCoords <- lapply(distances, simCoords, origin=c(0,0))
plot(0,0, xlim=c(-10,10), ylim=c(-10,10), pch=2, col='blue', cex=2, main='Points near a bus stop')
for (p in 1:length(exampleCoords)) {
points(exampleCoords[p][[1]][1],exampleCoords[p][[1]][2])
}
# A final test: plotting many, many simulations should look like a map of nested circles
plot(0,0, xlim=c(-10,10), ylim=c(-10,10), pch=2, col='blue', cex=2, main='Points near a bus stop, nsim=200\nThis should look like a bunch of nested circles!')
for (i in 1:200) {
exampleCoords <- lapply(distances, simCoords, origin=c(0,0))
for (p in 1:length(exampleCoords)) {
points(exampleCoords[p][[1]][1],exampleCoords[p][[1]][2], cex=0.4)
}
}
More information about the R-sig-Geo
mailing list