Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up

Interface between R and the OpenStreetMap-based routing service OSRM

License

NotificationsYou must be signed in to change notification settings

riatelab/osrm

Repository files navigation

CRANdownloadsR build statuscodecovProject Status: Active – The project has reached a stable, usable state and is being actively developed.DOI

Interface Between R and the OpenStreetMap-Based Routing ServiceOSRM

Description

OSRM is a routing service based on OpenStreetMap data. Seehttp://project-osrm.org/ for more information. This package enablesthe computation of routes, trips, isochrones and travel distancesmatrices (travel time and kilometric distance).

This package relies on the usage of a running OSRM service (tested withv5.27.0 of OSRM).

You can run your own instance of OSRM following guidelines providedhere. The simplestsolution is probably the one based ondockercontainers.

⚠️You must be careful using the OSRM demo server and read theabout page of theservice:

One request per second max. No scraping, no heavyusage.

Features

  • osrmTable() uses thetable service to query time/distancematrices,
  • osrmRoute() uses theroute service to query routes,
  • osrmTrip() uses thetrip service to query trips,
  • osrmNearest() uses thenearest service to query the nearest pointon the street network,
  • osrmIsochrone() andosrmIsodistance() use multipleosrmTable()calls to create isochrones or isodistances polygons.

Demo

This is a short overview of the main features ofosrm. The datasetused here is shipped with the package, it is a sample of 100 randompharmacies in Berlin (© OpenStreetMapcontributors) stored in ageopackage file.

  • osrmTable() gives access to thetable OSRM service. In thisexample we use this function to get the median time needed to accessany pharmacy from any other pharmacy.
library(osrm)
## Data: (c) OpenStreetMap contributors, ODbL 1.0 - http://www.openstreetmap.org/copyright## Routing: OSRM - http://project-osrm.org/
library(sf)
## Linking to GEOS 3.9.0, GDAL 3.2.2, PROJ 7.2.1; sf_use_s2() is TRUE
pharmacy<- st_read(system.file("gpkg/apotheke.gpkg",package="osrm"),quiet=TRUE)travel_time<- osrmTable(loc=pharmacy)travel_time$durations[1:5,1:5]
##      1    2    3    4    5## 1  0.0 21.1 33.4 21.2 12.6## 2 22.1  0.0 42.3 16.1 20.2## 3 33.0 43.0  0.0 30.5 27.4## 4 20.1 15.3 29.7  0.0 12.7## 5 10.2 20.3 26.8 12.3  0.0
diag(travel_time$durations)<-NAmedian(travel_time$durations,na.rm=TRUE)
## [1] 21.4

The median time needed to access any pharmacy from any other pharmacy is21.4 minutes.

  • osrmRoute() is used to compute the shortest route between twopoints. Here we compute the shortest route between the two firstpharmacies.
(route<- osrmRoute(src=pharmacy[1, ],dst=pharmacy[2, ]))
## Simple feature collection with 1 feature and 4 fields## Geometry type: LINESTRING## Dimension:     XY## Bounding box:  xmin: -13170.51 ymin: 5837172 xmax: -3875.771 ymax: 5841047## Projected CRS: WGS 84 / UTM zone 34N##     src dst duration distance                       geometry## 1_2   1   2 21.11667   12.348 LINESTRING (-13170.51 58410...

This route is 12.3 kilometers long and it takes 21.1 minutes to drivethrough it.

plot(st_geometry(route))plot(st_geometry(pharmacy[1:2,]),pch=20,add=T,cex=1.5)

  • osrmTrip() can be used to resolve the travelling salesman problem,it gives the shortest trip between a set of unordered points. In thisexample we want to obtain the shortest trip between the first fivepharmacies.
(trips<- osrmTrip(loc=pharmacy[1:5, ],overview="full"))
## [[1]]## [[1]]$trip## Simple feature collection with 5 features and 4 fields## Geometry type: LINESTRING## Dimension:     XY## Bounding box:  xmin: -13431.24 ymin: 5837172 xmax: -3875.582 ymax: 5856332## Projected CRS: WGS 84 / UTM zone 34N##   start end duration distance                       geometry## 1     1   2 21.11667  12.3480 LINESTRING (-13170.77 58410...## 2     2   4 16.10833   8.4273 LINESTRING (-3875.582 58379...## 3     4   3 29.69000  18.1448 LINESTRING (-7444.513 58427...## 4     3   5 27.39833  16.4265 LINESTRING (-8027.41 585621...## 5     5   1 10.15333   4.2289 LINESTRING (-11716.36 58435...## ## [[1]]$summary## [[1]]$summary$duration## [1] 104.4667## ## [[1]]$summary$distance## [1] 59.5755

The shortest trip between these pharmacies takes 104.5 minutes and is59.6 kilometers long. The steps of the trip are described in the “trip”sf object (point 1 > point 2 > point 4 > point 3 > point 5 > point1).

mytrip<-trips[[1]]$trip# Display the tripplot(st_geometry(mytrip),col= c("black","grey"),lwd=2)plot(st_geometry(pharmacy[1:5, ]),cex=1.5,pch=21,add=TRUE)text(st_coordinates(pharmacy[1:5,]),labels= row.names(pharmacy[1:5,]),pos=2)

  • osrmNearest() gives access to thenearest OSRM service. It returnsthe nearest point on the street network from any point. Here we willget the nearest point on the network from a couple of coordinates.
pt_not_on_street_network<- c(13.40,52.47)(pt_on_street_network<- osrmNearest(loc=pt_not_on_street_network))
## Simple feature collection with 1 feature and 2 fields## Geometry type: POINT## Dimension:     XY## Bounding box:  xmin: 13.39671 ymin: 52.46661 xmax: 13.39671 ymax: 52.46661## Geodetic CRS:  WGS 84##      id distance                  geometry## loc loc      439 POINT (13.39671 52.46661)

The distance from the input point to the nearest point on the streetnetwork is of 439 meters

  • osrmIsochrone() computes areas that are reachable within a giventime span from a point and returns the reachable regions as polygons.These areas of equal travel time are called isochrones. Here wecompute the isochrones from a specific point defined by its longitudeand latitude.
(iso<- osrmIsochrone(loc= c(13.43,52.47),breaks= seq(0,12,2)))
## Simple feature collection with 5 features and 3 fields## Geometry type: MULTIPOLYGON## Dimension:     XY## Bounding box:  xmin: 13.34397 ymin: 52.41642 xmax: 13.50187 ymax: 52.51548## Geodetic CRS:  WGS 84##   id isomin isomax                       geometry## 1  1      0      4 MULTIPOLYGON (((13.43743 52...## 2  2      4      6 MULTIPOLYGON (((13.42356 52...## 3  3      6      8 MULTIPOLYGON (((13.40345 52...## 4  4      8     10 MULTIPOLYGON (((13.4077 52....## 5  5     10     12 MULTIPOLYGON (((13.42257 52...
bks<-  sort(unique(c(iso$isomin,iso$isomax)))pals<- hcl.colors(n= length(bks)-1,palette="Light Grays",rev=TRUE)plot(iso["isomax"],breaks=bks,pal=pals,main="Isochrones (in minutes)",reset=FALSE)points(x=13.43,y=52.47,pch=4,lwd=2,cex=1.5)

Installation

  • Development version on GitHub
remotes::install_github("riatelab/osrm")
  • Stable version onCRAN
install.packages("osrm")

Community Guidelines

One can contribute to the package throughpullrequests and report issues orask questionshere. See theCONTRIBUTING.mdfile for detailed instructions.

Acknowledgements

Many thanks to the editor (@elbeejay) and reviewers (@JosiahParry,@mikemahoney218 and @wcjochem) of the JOSS article.
This publication has led to a significant improvement in the code baseand documentation of the package.


[8]ページ先頭

©2009-2025 Movatter.jp