[R-sig-Geo] [FORGED] Create a Spatial Weight Matrix based on road distance

Andres Diaz Loaiza m@d|@z| @end|ng |rom gm@||@com
Mon Jun 24 11:00:59 CEST 2019


Dear Rolando,


As previous members of the list asked you, it will be nice if you can
provide a reproducible example. Something like Roger has just done (with
command lines), but including your original data. In that way is always
easier to provide help.

 With the command: osrmTable, you are going to obtain the travel time
between points of your domain. In this case, I assume are the centroids of
your polygons. But no distances (what you were talking about). Since the
OSRM is only an interface, it only allows you to perform some few
calculations (since the algorithm to perform these calculations is on the
same web page). That is probably the reason why you are having this error
(I already warn you about this). If you have massive calculations, then I
will recommend you to download the app directly and run it on your
computer.

To get the distance in the manual says you should put as an argument the
distance, something like:

dists <- osrmTable(loc = muns13, measure = "distance")

You have to think this app is an emulator of google maps, that can give you
the shortest path and travel times according to different travel options,
although their primary goal is to cartography all
roads/ways/channels/railways etc., and make them freely available. please
visit
http://project-osrm.org/  (for the engine) and
https://www.openstreetmap.org/
<https://www.openstreetmap.org/#map=12/52.1710/5.2956> for the cartography.

 Andres D.
TU-Delft
Associate Researcher

El lun., 24 jun. 2019 a las 9:58, Roger Bivand (<Roger.Bivand using nhh.no>)
escribió:

> On Mon, 24 Jun 2019, Rolando Valdez wrote:
>
> > Dear Andres,
> >
> > I could follow an example provided with the package, it was a little bit
> > simple, however, I got this message:
> >
> >> dists <- osrmTable(loc = muns13, measure = "duration")
> > The OSRM server returned an error:
> > Error: The public OSRM API does not allow results with a number of
> > durations
> > higher than 10000. Ask for fewer durations or use your own server and set
> > its
> > --max-table-size option.
> >
> > My sample size is 2,457
>
> Were you asking for the whole nx(n-1)/2 set of durations in one run? You
> see that the API limits the number of interactions (possibly by time and
> by unique IP number). So you need to reduce the number of queries. If you
> are going to impose a distance threshold anyway, you can do that using the
> Great Circle (not Euclidean) distances between your geographical
> coordinates and dnearneigh(), and step through the nb list object with
> src= being the data frame of the observation coordinates, and dest= the
> data frame of the neighbours' coordinates.
>
> library(sf)
> nc <- st_read(system.file("shapes/sids.shp", package="spData")[1],
> quiet=TRUE)
> st_crs(nc) <- "+proj=longlat +datum=NAD27"
> nc1 <- st_transform(nc, 32019)
> nc2 <- st_centroid(nc1, of_largest_polygon=TRUE)
> nc3 <- st_transform(nc2, 4326)
> crds <- st_coordinates(st_geometry(nc3))
> df <- data.frame(id=nc3$FIPSNO, long=crds[,1], lat=crds[,2])
> library(spdep)
> nb <- dnearneigh(crds, 0, 50, longlat=TRUE)
> library(osrm)
> res <- vector(mode="list", length=nrow(df))
> for (i in seq(along=res)) res[[i]] <- osrmTable(src=df[i,],
>   dst=df[nb[[i]],], measure = "duration")
> res1 <- lapply(res, function(x) 10/x$duration)
> lw <- nb2listw(nb, glist=res1, style="B")
>
> gives general spatial weights based on 10/# minutes travel time between
> county centroids (centroids calculated from projected coordinates), for
> county centroids closer than 50 km measured by Great Circle.
>
> In your case, you may need to split the for() loop into portions of
> cumsum(card(nb)) of less than the limit. If durations are symmetric,
> you could also halve the query count by taking only neighbour ids > i,
> but you'd have to fold them back afterwards. You also wanted to categorise
> the durations into 0,1, which you could do with lapply() instead of using
> inverse durations.
>
> Hope this helps,
>
> Roger
>
> >
> > El vie., 21 de jun. de 2019 a la(s) 02:53, Andres Diaz Loaiza (
> > madiazl using gmail.com) escribió:
> >
> >> Dear Rolando,
> >>
> >> The advantage of using Open Street Maps engine is that you can give the
> >> travel option. This means you can select whether are you traveling by
> bike,
> >> car or walking. The previous approach didn't consider this topic. For
> this,
> >> you should have added a vector layer depending on your position of the
> >> street you can take (or not). Open Street Maps project allow you two
> >> options: a service in which you give your current position, the position
> >> you want to reach and your transport method (giving you back the fastest
> >> route). Or the option to download the engine/algorithm compile by
> yourself
> >> (if I am not wrong is made in C or python) and then you can make your
> own
> >> calculation at your own computer. For the first option, the package
> OSRM is
> >> an interface in which send a request to the OSM web page and wait for an
> >> answer. With this method, you can send a couple of request at the same
> time
> >> but no to many (you should read the manual for this). Of course, also
> will
> >> depend on whether the OSM server is down or not (or busy).
> >>
> >> I have to say that I used some years ago this app and nowadays I know
> that
> >> for some cities OSM has more streets reported than the same google maps.
> >> Also is an open project and they let you download their data for free,
> >> contrary to what google maps do.
> >>
> >> All the best,
> >>
> >>
> >> Andres
> >>
> >> El vie., 21 jun. 2019 a las 4:30, Adrian Baddeley (<
> >> adrian.baddeley using curtin.edu.au>) escribió:
> >>
> >>> Rather than converting an object of class 'SpatialLines' or
> >>> 'SpatialLinesDataFrame' to the spatstat class 'psp' and then
> converting it
> >>> to the spatstat class 'linnet', it is safer and more efficient to
> convert
> >>> the SpatialLines* object directly to class linnet using
> >>> as.linnet.SpatialLinesDataFrame() from the package 'maptools'.
> >>>
> >>>
> >>> Prof Adrian Baddeley DSc FAA
> >>>
> >>> John Curtin Distinguished Professor
> >>>
> >>> Department of Mathematics and Statistics
> >>>
> >>> Curtin University, Perth, Western Australia
> >>>
> >>>
> >>> ________________________________
> >>> From: Rolf Turner <r.turner using auckland.ac.nz>
> >>> Sent: Friday, 21 June 2019 10:08 AM
> >>> To: Rolando Valdez
> >>> Cc: r-sig-geo using r-project.org; Adrian Baddeley; Ege Rubak
> >>> Subject: Re: [FORGED] [R-sig-Geo] Create a Spatial Weight Matrix based
> on
> >>> road distance
> >>>
> >>>
> >>> On 21/06/19 12:26 PM, Rolando Valdez wrote:
> >>>
> >>>> Dear community,
> >>>>
> >>>> Is there any way to create a spatial weight matrix based on road
> >>> distance?
> >>>> I am trying to use the road distance between two points instead of
> >>>> euclidean distance.
> >>>>
> >>>> I've seen that there is a package named osrm. Can anyone give some
> >>> advice?
> >>>
> >>> I don't know anything about "osrm".  Calculating "road distances" can
> be
> >>> done in the spatstat package reasonably easily, if you take the trouble
> >>> to represent your collection of roads as a "linnet" object.
> >>>
> >>> Given that you have done so, suppose that your linnet object is "L" and
> >>> that you have vectors "x" and "y" specifying the points on L (i.e. on
> >>> your roads) between which you want to know the distances.
> >>>
> >>> Do:
> >>>
> >>>      X    <- lpp(data.frame(x=x,y=y),L)
> >>>      dMat <- pairdist(X)
> >>>
> >>> The object "dMat" is a (symmetric) square matrix; dMat[i,j] is the
> >>> distance between point i and point j.  (Of course the diagonal entries
> >>> are all 0.)
> >>>
> >>> If your collection of roads is specified by means of a shapefile,
> >>> vignette("shapefiles") will tell you how to turn this collection into a
> >>> "psp" ("planar segment pattern") object; the function (method)
> >>> as.linnet.psp() can then be used to turn the "psp" object into a
> >>> "linnet" object.
> >>>
> >>> HTH
> >>>
> >>> cheers,
> >>>
> >>> Rolf Turner
> >>>
> >>> --
> >>> Honorary Research Fellow
> >>> Department of Statistics
> >>> University of Auckland
> >>> Phone: +64-9-373-7599 ext. 88276
> >>>
> >>>         [[alternative HTML version deleted]]
> >>>
> >>> _______________________________________________
> >>> R-sig-Geo mailing list
> >>> R-sig-Geo using r-project.org
> >>> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
> >>>
> >>
> >>
> >> --
> >> Andrés D.
> >>
> >
> >
> >
>
> --
> Roger Bivand
> Department of Economics, Norwegian School of Economics,
> Helleveien 30, N-5045 Bergen, Norway.
> voice: +47 55 95 93 55; e-mail: Roger.Bivand using nhh.no
> https://orcid.org/0000-0003-2392-6140
> https://scholar.google.no/citations?user=AWeghB0AAAAJ&hl=en



-- 
Andrés D.

	[[alternative HTML version deleted]]



More information about the R-sig-Geo mailing list