Codigo elaborado por JoseManuel Magallanes
Llamada a archivo (sucio):
LINK='https://docs.google.com/spreadsheets/d/e/2PACX-1vT0pkNmP_1DXF-g_StbBLbumnGeL0oubIgcYtV1RIlDG5ubwJdc68hHfVBk0h391_IeSoGY4ZCM4OAK/pub?gid=1519759194&single=true&output=csv'
oldies=read.csv(LINK,stringsAsFactors = F)
Primeras
head(oldies)
## ITEM Departamento Provincia Distrito Centro.Poblado
## 1 1 LIMA LIMA LIMA LIMA
## 2 4 LIMA LIMA LIMA LIMA
## 3 6 LIMA LIMA LIMA LIMA
## 4 7 LIMA LIMA LIMA LIMA
## 5 9 LIMA LIMA LIMA LIMA
## 6 11 LIMA LIMA LIMA LIMA
## Dirección.Priorizada
## 1 JR. CHOTA NRO. PUERTA 827 PISO.01 INTERIOR. 403
## 2 PJ. LOS ANGELES NRO. PUERTA 118 PISO.01 MZA. K LOTE.13
## 3 JR. JUNIN NRO. PUERTA 930 PISO.1
## 4 JR. UCHUSUMA NRO. PUERTA 191 PISO.1
## 5 JR. NICOLAS RODRIGO NRO. PUERTA 145 PISO.1
## 6 JR. ANTONIO MIROQUESADA NRO. PUERTA 1210 PISO.1
## Dirección.Alternativa
## 1 SIS: JR CHOTA NRO 827 DPTO 403 PISO 4
## 2 SIS: PSJE. PSJE LOS ANGELES 118 MZ K CERCADO DE L
## 3 SIS: JR. JUNIN NRO. PUERTA 930 PISO.1
## 4 SIS: JR. UCHUSUMA NRO.191 BLOQUE. PISO.1 INTERIOR. MZA. LOTE.
## 5 SIS: CA RODRIGO, NICOLAS, 141
## 6 SIS: JR. ANTONIO MIROQUESADA NRO.1210 BLOQUE. PISO.1 INTERIOR. MZA. LOTE.
## X65.107
## 1 60-65
## 2 76-80
## 3 60-65
## 4 71-75
## 5 66-70
## 6 66-70
Limpieza:
oldies$Dirección.Priorizada=gsub("PGH: ","",oldies$Dirección.Priorizada)
mejorado:
head(oldies$Dirección.Priorizada,10)
## [1] "JR. CHOTA NRO. PUERTA 827 PISO.01 INTERIOR. 403"
## [2] "PJ. LOS ANGELES NRO. PUERTA 118 PISO.01 MZA. K LOTE.13"
## [3] "JR. JUNIN NRO. PUERTA 930 PISO.1"
## [4] "JR. UCHUSUMA NRO. PUERTA 191 PISO.1"
## [5] "JR. NICOLAS RODRIGO NRO. PUERTA 145 PISO.1"
## [6] "JR. ANTONIO MIROQUESADA NRO. PUERTA 1210 PISO.1"
## [7] "JR. ANCASH NRO. PUERTA 830 PISO.5 INTERIOR. 4"
## [8] "JR. JUNIN NRO.1446 BLOQUE. PISO.1 INTERIOR. C MZA. LOTE."
## [9] "JR. ANDAHUAYLAS NRO. PUERTA 775 PISO.4 INTERIOR. 412"
## [10] "CALLE. LAS DALIAS NRO. PUERTA 1598 PISO.01"
oldies$NRO=stringr::str_extract(string = oldies$Dirección.Priorizada,
pattern = "(NRO.\\d+)|(PUERTA.\\d*)")
library(stringr)
oldies$CALLE=str_split(oldies$Dirección.Priorizada,
pattern = 'NRO',
simplify = T)[,1]
oldies$NRO=stringr::str_extract(string = oldies$NRO,
pattern = "\\d+")
oldies$dir=paste0(oldies$CALLE,oldies$NRO," ",oldies$Distrito," ",oldies$Provincia,' Peru')
Resultado mejorado:
head(oldies$dir,5)
## [1] "JR. CHOTA 827 LIMA LIMA Peru"
## [2] "PJ. LOS ANGELES 118 LIMA LIMA Peru"
## [3] "JR. JUNIN 930 LIMA LIMA Peru"
## [4] "JR. UCHUSUMA 191 LIMA LIMA Peru"
## [5] "JR. NICOLAS RODRIGO 145 LIMA LIMA Peru"
Mas mejores por tipo de via:
oldies$tipoCalle=str_split(oldies$dir,pattern = '. ',
simplify = T)[,1]
oldies=oldies[complete.cases(oldies$NRO),]
oldies$dir=gsub("JR.","Jiron",oldies$dir)
oldies$dir=gsub("CALLE.","Calle",oldies$dir)
oldies$dir=gsub("PJ.","Pasaje",oldies$dir)
oldies$dir=gsub("OTR.","",oldies$dir)
oldies$dir=gsub("OTRO.","",oldies$dir)
oldies$dir=gsub("CALL.","Calle",oldies$dir)
oldies$dir=gsub("AV.","Avenida",oldies$dir)
Resultado para geocodificacion:
head(oldies$dir,5)
## [1] "Jiron CHOTA 827 LIMA LIMA Peru"
## [2] "Pasaje LOS ANGELES 118 LIMA LIMA Peru"
## [3] "Jiron JUNIN 930 LIMA LIMA Peru"
## [4] "Jiron UCHUSUMA 191 LIMA LIMA Peru"
## [5] "Jiron NICOLAS RODRIGO 145 LIMA LIMA Peru"
Preparando funcion para geocodificar:
## geocoding function using OSM Nominatim API
## details: http://wiki.openstreetmap.org/wiki/Nominatim
## made by: D.Kisler
library(jsonlite)
nominatim_osm <- function(address = NULL)
{
if(suppressWarnings(is.null(address)))
return(data.frame())
tryCatch(
d <- jsonlite::fromJSON(
gsub('\\@addr\\@', gsub('\\s+', '\\%20', address),
'http://nominatim.openstreetmap.org/search/@addr@?format=json&addressdetails=0&limit=1')
), error = function(c) return(data.frame())
)
if(length(d) == 0) return(data.frame())
return(data.frame(lon = as.numeric(d$lon), lat = as.numeric(d$lat)))
}
Testeando con 5 direcciones:
allD=data.frame()
for (d in oldies$dir[1:5]){
dx=nominatim_osm(d)
if (length(dx)==0){
allD=rbind(allD,data.frame(lon = NA,lat = NA))
}else{allD=rbind(allD,data.frame(lon = as.numeric(dx$lon),
lat = as.numeric(dx$lat)))}
}
Resultado parcial:
allD
## lon lat
## 1 -77.04063 -12.05429
## 2 -76.92610 -12.17912
## 3 -77.02213 -12.05040
## 4 -77.01349 -12.05785
## 5 -77.06925 -12.03597
Cuando se haga todo:
oldies2=cbind(oldies,allD)
oldies2=oldies2[complete.cases(oldies2$lon),]
write.csv(oldies2,"oldies2.csv",row.names = F)