Acceder a OSM primero cargamos la Libreria OSMAR luego nos conectamos con la API de OSM y obtenemos un area con la funcion center_bbox

library(osmar)
## Loading required package: XML
## Loading required package: RCurl
## Loading required package: bitops
## Loading required package: geosphere
## 
## Attaching package: 'osmar'
## The following object is masked from 'package:utils':
## 
##     find
src <- osmsource_api(url = "https://api.openstreetmap.org/api/0.6/")

bb <- center_bbox(-58.8429093, -27.469345, 1500, 1500)
centro <- get_osm(bb, source = src)
centro
## osmar object
## 3195 nodes, 808 ways, 73 relations
plot(centro)

summary(centro$nodes)
## osmar$nodes object
## 3195 nodes, 8515 tags 
## 
## ..$attrs data.frame: 
##     id, visible, timestamp, version, changeset, user, uid, lat,
##     lon 
## ..$tags data.frame: 
##     id, k, v 
##  
## Bounding box:
##           lat       lon
## min -27.48671 -58.85683
## max -27.45575 -58.81562
## 
## Key-Value contingency table:
##              Key             Value Freq
## 1  addr:postcode              3400 1273
## 2      addr:city        Corrientes 1266
## 3   addr:country                AR 1200
## 4     addr:state        Corrientes 1194
## 5    addr:street           Bolivar   65
## 6    addr:street          Belgrano   61
## 7    addr:street            Moreno   56
## 8        highway   traffic_signals   55
## 9    addr:street          La Rioja   54
## 10   addr:street Hipolito Yrigoyen   53
summary(centro$way)
## osmar$ways object
## 808 ways, 2226 tags, 3334 refs 
## 
## ..$attrs data.frame: 
##     id, visible, timestamp, version, changeset, user, uid 
## ..$tags data.frame: 
##     id, k, v 
## ..$refs data.frame: 
##     id, ref 
##  
## Key-Value contingency table:
##                   Key       Value Freq
## 1      addr:inclusion      actual  601
## 2  addr:interpolation         odd  301
## 3  addr:interpolation        even  299
## 4              oneway         yes  129
## 5             surface       paved   91
## 6             highway residential   84
## 7            maxspeed          40   59
## 8       addr:postcode        3400   47
## 9           addr:city  Corrientes   45
## 10           maxspeed          60   43

Selecciono los nodos que son traffic_signals

ts_ids <- find(centro, node(tags(v == "traffic_signals")))

ts_ids
##  [1]  638725881 2303351858 2286347269 3160246664  639588451  638725917
##  [7]  639276201  639234468 1227482063  639234466  638727671  639552743
## [13]  639234622  639552739  639552735  639552734  638726021 2255971748
## [19] 2255971750 1243935379 2286347267 3481512227 3481512226 3481512225
## [25] 2412369511 2412369512 1227482045 1243935377 2255971770  639284047
## [31] 2412369515  639557423 1227482050 2302887900 2286347270 1227482065
## [37] 1227482053 3481512228  639557425 2861027741  639545207  638731185
## [43] 2826659897 3481512224  638726014  638728144  638731271 2256066281
## [49] 2704378808 1227482041 2258998525 1227482047  639557447  639565909
## [55] 3481512229

El resultado es un vector con ID de nodo (en este caso, 55 nodos de señal de tráfico) o desconocido, los operadores binarios definidos # % agrep% para las coincidencias aproximadas (ver ?agrep) y % grep% para coincide con el patrón (ver ?grepl)

bs_ids <- find(centro, node(tags(v %agrep% "busstop")))
bs_ids
##  [1] 4649774612 4649774613 4649774614 4649774615 4649774640 4654056280
##  [7] 4654056281 4654994144 4654994143 4654994145 4654994147 4654994148
## [13] 4654994149 4654994150 4654994152 4654994153 4654994154 4654994158
## [19] 4654994159 4654994160 4654994162 4654994165 2335718632 4456298627
## [25] 4456304251 4456305995 4456306672 4456311189 4456311213 4573730535
## [31] 4717799354 4654994161 4573699533 4573693769 4649774618 4649774619
## [37] 5002387598 5045493903 5045493904 5415318321 4654994156 4654994157
## [43] 5654724052 4456297824

node<—–way<——relation

centro$ways
## osmar$ways object
## 808 ways, 2226 tags, 3334 refs
hw_ids <- find(centro, way(tags(k == "highway")))
hw_ids <- find_down(centro, way(hw_ids))

Estas dos funciones nos permiten encontrar los elementos relacionados arriba y abajo de la jerarquía. por ejemplo,fin_up() en un nodo devuelve todos los nodos, ways y relaciones relacionadas; find_down() en un nodo devuelve solo el nodo.

str(hw_ids)
## List of 3
##  $ node_ids    : num [1:1137] 2.26e+09 2.56e+08 4.54e+09 4.54e+09 4.24e+08 ...
##  $ way_ids     : num [1:144] 2.21e+08 5.02e+07 2.16e+08 1.28e+08 2.16e+08 ...
##  $ relation_ids: NULL

Subset:El valor de retorno de las funciones de búsqueda se puede usar para crear subconjuntos de objetos Osmar.Los metodos de subset() para objetos de OSMAR, tomo los ID’s y devuelve datos como un objeto de OSMAR. Por ejemplo, los dos subconjuntos basados en los ID´s de señal de tráfico y de parada de autobús son:

ts <- subset(centro, node_ids = ts_ids)
ts
## osmar object
## 55 nodes, 0 ways, 0 relations
bs <- subset(centro, node_ids = bs_ids)
bs
## osmar object
## 44 nodes, 0 ways, 0 relations
hw <- subset(centro, ids = hw_ids)
hw
## osmar object
## 1137 nodes, 144 ways, 0 relations

Ahora el Grafico

plot(centro)
plot_ways(hw, add = TRUE, col = "green")
plot_nodes(ts, add = TRUE, col = "red")
plot_nodes(bs, add = TRUE, col = "blue")
title("Corrientes-Análisis de POI")

Mail:jmourglia@gmail.com Twiter: @yeyomourglia