[R-br] Recuperar coordenadas de locais de uma estrada a partir do Google Maps

Augusto Ribas ribas.aca em gmail.com
Terça Setembro 18 15:53:20 BRT 2012


Opa, caso sirva para alguém, consegui fazer uma solução, acho que até razoavel.

Usando o programa Google Earth www.google.com/earth/ , eu salvei em
.kml um grupo de pontos de referencia de uma estrada e uma rota do
inicio ao fim da estrada que tenho interesse. Daqui fiz o seguinte, em
script:

#dados

#coordenadas de referencia
claudia.coord<-structure(list(X1 = c(-40.3201206572012,
-40.3247698942156, -40.3934139596311,
-40.5105609306218, -40.5558289282114, -40.551610815962), X2 =
c(-20.3967530595136,
-20.4019278830141, -20.5432001637965, -20.6309481844606, -20.733489883797,
-20.7392078853725), X3 = c(11, 12, 30, 49, 66, 67)), .Names = c("X1",
"X2", "X3"), row.names = c(NA, -6L), class = "data.frame")

#rota
rota.coord<-list(structure(c(-40.365423, -20.517075, 0), .Dim = c(1L, 3L)),
    structure(c(-40.552351, -20.737927, 0), .Dim = c(1L, 3L)),
    structure(c(-40.36541, -20.51709, 0), .Dim = c(1L, 3L)),
    structure(c(-40.43334, -20.61993, 0), .Dim = c(1L, 3L)),
    structure(c(-40.51806, -20.63094, 0), .Dim = c(1L, 3L)),
    structure(c(-40.36541, -40.365742, -40.381519, -40.38269,
    -40.383438, -40.384258, -40.391472, -40.392799, -40.394341,
    -40.397041, -40.406738, -40.406979, -40.40918, -40.415722,
    -40.416901, -40.41803, -40.418839, -40.42157, -40.423302,
    -40.423809, -40.424229, -40.42458, -40.424751, -40.4268,
    -40.42717, -40.42775, -40.428299, -40.429062, -40.43092,
    -40.433338, -40.433338, -40.43391, -40.43446, -40.43483,
    -40.43536, -40.435661, -40.437302, -40.441681, -40.44212,
    -40.44294, -40.443878, -40.4505, -40.453442, -40.454021,
    -40.455059, -40.457439, -40.457878, -40.45826, -40.458988,
    -40.46138, -40.466801, -40.467892, -40.469059, -40.469849,
    -40.47047, -40.472919, -40.473942, -40.474339, -40.47686,
    -40.47834, -40.48362, -40.485271, -40.487709, -40.48827,
    -40.489029, -40.489441, -40.489929, -40.490379, -40.490688,
    -40.490978, -40.492329, -40.492748, -40.493649, -40.494171,
    -40.494492, -40.495689, -40.495949, -40.496208, -40.496521,
    -40.496922, -40.50016, -40.500629, -40.50103, -40.50177,
    -40.502178, -40.504108, -40.50452, -40.50528, -40.505852,
    -40.506401, -40.506809, -40.509621, -40.510479, -40.510971,
    -40.511871, -40.516418, -40.517181, -40.518059, -40.518059,
    -40.518639, -40.519249, -40.521309, -40.521469, -40.52195,
    -40.522041, -40.521992, -40.522099, -40.522209, -40.52293,
    -40.524651, -40.52549, -40.528721, -40.52932, -40.529652,
    -40.530621, -40.531078, -40.531719, -40.532051, -40.532558,
    -40.533112, -40.534512, -40.534882, -40.53529, -40.53577,
    -40.53619, -40.54044, -40.541222, -40.541752, -40.542332,
    -40.54393, -40.54509, -40.545509, -40.54607, -40.546371,
    -40.546951, -40.547291, -40.549229, -40.550892, -40.551281,
    -40.551559, -40.554508, -40.555222, -40.558552, -40.559299,
    -40.55941, -40.55946, -40.559429, -40.559139, -40.559101,
    -40.559139, -40.559391, -40.56007, -40.560299, -40.56039,
    -40.56052, -40.560711, -40.560879, -40.561619, -40.562469,
    -40.563492, -40.564751, -40.565262, -40.565609, -40.565731,
    -40.565849, -40.566448, -40.566441, -40.566319, -40.566109,
    -40.56546, -40.563431, -40.562962, -40.562698, -40.562698,
    -40.564091, -40.564171, -40.56414, -40.563961, -40.56353,
    -40.562119, -40.56171, -40.561489, -40.561531, -40.561779,
    -40.56218, -40.56601, -40.568699, -40.572079, -40.572762,
    -40.573711, -40.575909, -40.57618, -40.576321, -40.57679,
    -40.576729, -40.576569, -40.576241, -40.57402, -40.573189,
    -40.571331, -40.5709, -40.570469, -40.569851, -40.569279,
    -40.568081, -40.564419, -40.563519, -40.562931, -40.560059,
    -40.559551, -40.559292, -40.559109, -40.558922, -40.558609,
    -40.55827, -40.557991, -40.557652, -40.557259, -40.555271,
    -40.554901, -40.5536, -40.553219, -40.552341, -20.51709,
    -20.51738, -20.528761, -20.529699, -20.530439, -20.531361,
    -20.54055, -20.54215, -20.54423, -20.54763, -20.56024, -20.56061,
    -20.564871, -20.577801, -20.58, -20.58148, -20.582291, -20.5844,
    -20.58593, -20.58654, -20.587191, -20.587971, -20.588579,
    -20.604839, -20.606581, -20.608749, -20.61027, -20.61215,
    -20.61635, -20.61993, -20.61993, -20.62042, -20.620621, -20.62063,
    -20.62051, -20.620399, -20.61956, -20.61656, -20.61628, -20.61587,
    -20.615589, -20.614269, -20.613899, -20.61376, -20.613359,
    -20.61187, -20.61165, -20.6115, -20.61134, -20.611191, -20.611139,
    -20.61092, -20.61051, -20.610331, -20.61025, -20.61017, -20.61025,
    -20.610331, -20.610991, -20.61129, -20.61158, -20.61153,
    -20.61129, -20.6113, -20.61146, -20.611629, -20.61191, -20.61227,
    -20.61261, -20.613041, -20.615709, -20.61632, -20.61739,
    -20.61812, -20.618879, -20.623011, -20.62348, -20.62381,
    -20.624109, -20.62439, -20.626459, -20.62674, -20.6269, -20.627069,
    -20.62709, -20.62686, -20.62685, -20.62698, -20.62718, -20.627501,
    -20.627819, -20.630289, -20.630779, -20.630951, -20.631149,
    -20.63121, -20.631149, -20.630939, -20.630939, -20.63081,
    -20.63076, -20.630699, -20.63076, -20.63142, -20.631781,
    -20.63208, -20.6325, -20.632681, -20.63323, -20.6341, -20.63463,
    -20.63726, -20.63785, -20.63825, -20.640039, -20.64072, -20.64105,
    -20.64115, -20.64119, -20.6411, -20.640739, -20.640711, -20.640739,
    -20.64094, -20.64123, -20.645691, -20.646441, -20.64678,
    -20.64695, -20.64716, -20.64744, -20.64765, -20.648211, -20.648729,
    -20.649561, -20.64978, -20.650709, -20.651979, -20.65222,
    -20.65233, -20.65299, -20.65325, -20.65505, -20.65576, -20.656139,
    -20.65661, -20.657141, -20.658529, -20.658911, -20.6593,
    -20.660089, -20.66123, -20.66185, -20.66239, -20.66415, -20.6646,
    -20.664869, -20.66543, -20.66588, -20.666519, -20.667521,
    -20.667971, -20.668381, -20.66872, -20.66913, -20.67264,
    -20.673201, -20.673679, -20.674101, -20.6751, -20.67775,
    -20.67856, -20.679569, -20.680531, -20.68688, -20.68738,
    -20.688101, -20.688749, -20.689541, -20.6912, -20.69183,
    -20.69257, -20.693319, -20.694019, -20.69454, -20.6982, -20.700491,
    -20.702909, -20.7036, -20.70483, -20.708309, -20.708969,
    -20.709459, -20.71533, -20.716431, -20.71719, -20.718081,
    -20.720119, -20.72117, -20.723829, -20.72436, -20.72471,
    -20.725121, -20.72541, -20.72574, -20.72599, -20.7262, -20.72645,
    -20.728041, -20.72846, -20.728769, -20.72912, -20.729691,
    -20.73107, -20.73184, -20.73222, -20.73255, -20.73283, -20.733919,
    -20.734209, -20.735689, -20.736271, -20.737921, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), .Dim = c(223L, 3L)))


library(RgoogleMaps)
library(maptools)
library(sp)

#importando um mapa de referencia
lat = claudia.coord[c(1,6),2]
lon = claudia.coord[c(1,6),1]
center = c(lat=mean(lat), lon=mean(lon));
zoom <- min(MaxZoom(range(lat), range(lon)));

MyMap <- GetMap(center=center,zoom=zoom,maptype ="roadmap")

#visualizando o mapa
PlotOnStaticMap(MyMap)

#coordenadas de referencia
TextOnStaticMap(MyMap,claudia.coord[,2],claudia.coord[,1],labels =
claudia.coord[,3])

#observando a rota se esta correta
#transformar dados de lista para matrix
rota.coord<-data.frame(do.call(rbind,rota.coord))
TextOnStaticMap(MyMap,rota.coord[,2],rota.coord[,1],labels =
rownames(rota.coord),cex=0.5)

#é possivel usar o comando spDists para obter a distancia em km de 2
pontos em latitude e longitude
spDists(as.matrix(rbind(claudia.coord[3,c(2,1)],rota.coord[,c(2,1)])),longlat=T)[,1]

#assim eu posso comparar com meu ponto de referencia
plot(rota.coord[,c(2,1)],type="b")
text(claudia.coord[,c(2,1)], labels = claudia.coord[,3],col="red")

#então comparando com o KM 30, usando somente ele como ponto de referencia
rota.coord$X3<-spDists(as.matrix(rbind(claudia.coord[3,c(2,1)],rota.coord[,c(2,1)])),longlat=T)[-1,1]


#então o ponto mais proximo na rota do meu KM 30 eu vou chamar de KM 30 na rota
rota.coord$KM<-NA
min(rota.coord$X3)
which(rota.coord$X3==min(rota.coord$X3))
#esse ponto é o meio
rota.coord$KM[13]<-30

#e vou separar em esquerda e direta
#pos pra esquerda a kilometragem aumenta, e pra direta a kilometragem diminui
#vou deixar meu ponto de referencia nos dois lados
rota.coord.esquerda<-rota.coord[1:13,]
rota.coord.direita<-rota.coord[13:228,]

#esquerda
#aqui os pontos estão bagunçados, veio assim da rota do google maps
rota.coord.esquerda
plot(rota.coord.esquerda[,c(2,1)])
text(rota.coord.esquerda[,c(2,1)], labels =
round(rota.coord.esquerda[,3],digits=2),col="red")

#mas tirando 3 pontos a rota fica organizada
rota.coord.esquerda[-c(2,4,5),]
plot(rota.coord.esquerda[-c(2,4,5),c(2,1)],type="b")
text(rota.coord.esquerda[-c(2,4,5),c(2,1)], labels =
round(rota.coord.esquerda[-c(2,4,5),3],digits=2),col="red")

rota.coord.esquerda<-rota.coord.esquerda[-c(2,4,5),]

#dai eu calculo a distancia em kilometros de um ponto e o ponto adjacente
rota.coord.esquerda$Dist.next<-0
for(i in (nrow(rota.coord.esquerda)-1):1) {
rota.coord.esquerda$Dist.next[i]<-spDists(as.matrix(rota.coord.esquerda[c(i,i+1),c(2,1)]),longlat=T)[2,1]
}

#vejo se os valores fazem sentido espacialmente
rota.coord.esquerda
plot(rota.coord.esquerda[,c(2,1)])
text(rota.coord.esquerda[,c(2,1)], labels =
round(rota.coord.esquerda[,5],digits=2),col="red")

#ai usando o km 30 de referencia eu vou diminuindo a kilometragem da estrada
for(i in (nrow(rota.coord.esquerda)-1):1) {
rota.coord.esquerda$KM[i]<-rota.coord.esquerda$KM[i+1]-rota.coord.esquerda$Dist.next[i]
}

#e dou uma olhada no contexto do mapa
rota.coord.esquerda
TextOnStaticMap(MyMap,rota.coord.esquerda[,2],rota.coord.esquerda[,1],labels
= round(rota.coord.esquerda$KM,digits=2),cex=0.5)
windows()
TextOnStaticMap(MyMap,claudia.coord[,2],claudia.coord[,1],labels =
claudia.coord[,3])
#parece que ficou ok, ai começo o mesmo processo pra direita

#direita
#pontos ok
rota.coord.direita
plot(rota.coord.direita[,c(2,1)],type="b")
text(rota.coord.direita[,c(2,1)], labels =
round(rota.coord.direita[,3],digits=2),col="red")

#distancia ao proximo ponto
rota.coord.direita$Dist.next<-0
for(i in (nrow(rota.coord.direita)-1):1) {
rota.coord.direita$Dist.next[i]<-spDists(as.matrix(rota.coord.direita[c(i,i+1),c(2,1)]),longlat=T)[2,1]
}

#olhando num plot
rota.coord.direita
plot(rota.coord.direita[,c(2,1)])
text(rota.coord.direita[,c(2,1)], labels =
round(rota.coord.direita[,5],digits=2),col="red")

#somando a kilometragem estrada a frente
for(i in 1:(nrow(rota.coord.direita)-1)) {
rota.coord.direita$KM[i+1]<-rota.coord.direita$KM[i]+rota.coord.direita$Dist.next[i+1]
}

#olhando o resultado no mapa
rota.coord.direita
TextOnStaticMap(MyMap,rota.coord.direita[,2],rota.coord.direita[,1],labels
= round(rota.coord.direita$KM,digits=2),cex=0.5)
windows()
TextOnStaticMap(MyMap,claudia.coord[,2],claudia.coord[,1],labels =
claudia.coord[,3])

#plotando o resutado final
final<-rbind(rota.coord.esquerda,rota.coord.direita)
TextOnStaticMap(MyMap,final[,2],final[,1],labels =
round(final$KM,digits=2),cex=0.5)

#agora eu posso substituir nos meus dados a coordenada mais proxima
#do km que esta na planilha de dados que tenho.
#eu ainda vou tentar melhorar usando mais pontos de referencias e
vendo se o resultado diferencia muito, e pensei em fazer uma média
entre os pontos.
#resolvi postar aqui, pos quem sabe pode ser util para alguem


Em 17 de setembro de 2012 16:52, Augusto Ribas <ribas.aca em gmail.com> escreveu:
> So arrumando o script, la em baixo é pra usar o data.frame dados.pos e não
> claudia.coord, segue o script organizado
>
> library(RgoogleMaps)
>
> #dados de exemplo
>
> especie<-paste("Especie",1:6)
> km<-seq(11,67,by=1)
>
> dados<-data.frame(Especie=NA,km=NA)
> for(i in 1:20) {
>   dados[i,1]<-sample(especie,1)
>   dados[i,2]<-sample(km,1)
>   }
>
> head(dados)
>
> #pontos de referencia
>
> dados.pos<-structure(list(Lon = c(-40.3201206572012, -40.3247698942156,
> -40.3934139596311,
> -40.5105609306218, -40.5558289282114, -40.551610815962), Lat =
> c(-20.3967530595136,
> -20.4019278830141, -20.5432001637965, -20.6309481844606, -20.733489883797,
> -20.7392078853725), Local = c("Inicio", "KM 12", "KM 30", "KM 49", "KM 66",
> "Fim")), .Names = c("Lon", "Lat", "Local"), row.names = c(NA, -6L), class =
> "data.frame")
>
> dados.pos
>
>
> #baixando um mapa
>
> lat = dados.pos[c(1,6),2]
> lon = dados.pos[c(1,6),1]
> center = c(lat=mean(lat), lon=mean(lon))
> zoom <- min(MaxZoom(range(lat), range(lon)))
>
> MyMap <- GetMap(center=center,zoom=zoom,maptype ="roadmap")
>
> #plot de exemplo
> PlotOnStaticMap(MyMap)
> TextOnStaticMap(MyMap,dados.pos[,2],dados.pos[,1],labels = dados.pos[,3])
>
>
> Em 17 de setembro de 2012 16:47, Augusto Ribas <ribas.aca em gmail.com>
> escreveu:
>
>> Ola a todos, estou devolta aqui.
>> Estou com o seguinte problema. Olhando os dados de atropelamentos de
>> varias especies de bixinhos ao longo de uma estrada, eu tenho os seguintes
>> dados:
>>
>> > head(dados)
>>     Especie km
>> 1 Especie 5 27
>> 2 Especie 3 32
>> 3 Especie 3 64
>> 4 Especie 4 40
>> 5 Especie 1 51
>> 6 Especie 6 57
>>
>> A especie que foi atropelada, e qual o km da estrada.
>>
>> Eu gostaria de fazer um gráfico espacial, de onde estão acontecendo esses
>> atropelamentos.
>> Os dados em questão são da Rodovia ES-060.
>> Eu fui no google maps e encontrei ela. Ai peguei as coordenadas de alguns
>> pontos e importei no R, por exemplo:
>>
>>         Lon       Lat           Local
>> 1 -40.32012 -20.39675   Inicio
>> 2 -40.32477 -20.40193  KM 12
>> 3 -40.39341 -20.54320  KM 30
>> 4 -40.51056 -20.63095  KM 49
>> 5 -40.55583 -20.73349  KM 66
>> 6 -40.55161 -20.73921    Fim
>>
>> Peguei esses valores assim, eu ia no google street view, ai olhava na
>> estrada as plaquinha km 30, ai ia la e marcava um ponto. Olhava outra
>> plaquinha e marcava outro ponto.
>> Se você traçar uma rota do fim para o inicio, da pra ver a estrada inteira
>> (se a rota for ao contrario, não da muito certo, ja que tem que voltar pra
>> uma rotatória no trajeto.).
>>
>> Eu gostaria de saber se tem uma estrategia simples, usando essas
>> informações de saber as coordenadas para cada km do 11 ao 67. Pra completar
>> minha primeira planilha, dados, com coordenadas.
>> Tipo importar a rota e marcar pontos usando estes de referencia, pra saber
>> a coordenada do km 11, do km 12 e assim por diante.
>> Dai eu veria num mapa onde estão os atropelamentos.
>>
>> Segue um exemplo dos dados e um plot do mapa da estrada.
>>
>> library(RgoogleMaps)
>>
>> #exemplo de dados
>> especie<-paste("Especie",1:6)
>> km<-seq(11,67,by=1)
>>
>> dados<-data.frame(Especie=NA,km=NA)
>> for(i in 1:20) {
>>   dados[i,1]<-sample(especie,1)
>>   dados[i,2]<-sample(km,1)
>>   }
>>
>> head(dados)
>>
>>
>> #Locais no google maps em um data.frame
>> dados.pos<-structure(list(Lon = c(-40.3201206572012, -40.3247698942156,
>> -40.3934139596311,
>> -40.5105609306218, -40.5558289282114, -40.551610815962), Lat =
>> c(-20.3967530595136,
>> -20.4019278830141, -20.5432001637965, -20.6309481844606, -20.733489883797,
>> -20.7392078853725), Local = c("Inicio", "KM 12", "KM 30", "KM 49", "KM
>> 66",
>> "Fim")), .Names = c("Lon", "Lat", "Local"), row.names = c(NA, -6L), class
>> = "data.frame")
>>
>> dados.pos
>>
>> #Baixando o maps
>> lat = dados.pos[c(1,6),2]
>> lon = dados.pos[c(1,6),1]
>> center = c(lat=mean(lat), lon=mean(lon))
>> zoom <- min(MaxZoom(range(lat), range(lon)))
>>
>> MyMap <- GetMap(center=center,zoom=zoom,maptype ="roadmap")
>>
>>
>> #plot
>> PlotOnStaticMap(MyMap)
>>
>> #pontos conhecidos
>> TextOnStaticMap(MyMap,claudia.coord[,2],claudia.coord[,1],labels =
>> claudia.coord[,3])
>>
>>
>>
>> Desde ja agradeço a atenção
>> Abraços a todos
>> --
>> Grato
>> Augusto C. A. Ribas
>>
>> Site Pessoal: http://augustoribas.heliohost.org
>> Lattes: http://lattes.cnpq.br/7355685961127056
>>
>
>
>
> --
> Grato
> Augusto C. A. Ribas
>
> Site Pessoal: http://augustoribas.heliohost.org
> Lattes: http://lattes.cnpq.br/7355685961127056
>



-- 
Grato
Augusto C. A. Ribas

Site Pessoal: http://augustoribas.heliohost.org
Lattes: http://lattes.cnpq.br/7355685961127056


Mais detalhes sobre a lista de discussão R-br