quarta-feira, 26 de fevereiro de 2020

Acessando dados de GPS da prefeitura e descobrindo sua posição pelo Google Maps

Olá, pessoal!

Hoje vou mostrar a vocês como recuperar dados de localização dos carros em circulação de uma determinada linha de ônibus do Rio de Janeiro e em seguida relacionar a posição entregues ao Google Maps para que nos retorne em qual rua eles estão localizados.

Hoje a prefeitura disponibiliza uma API para você buscar as informações sobre qualquer uma das linhas de ônibus em circulação na cidade do Rio de Janeiro. Essa API pode ser acessada pela url http://dadosabertos.rio.rj.gov.br/apiTransporte/apresentacao/rest/index.cfm/obterPosicoesDaLinha/

Um exemplo:

http://dadosabertos.rio.rj.gov.br/apiTransporte/apresentacao/rest/index.cfm/obterPosicoesDaLinha/210

que retorna as seguintes informações:

{"COLUMNS":["DATAHORA","ORDEM","LINHA","LATITUDE","LONGITUDE","VELOCIDADE"],"DATA":[["02-26-2020 08:59:25","A29080",210.0,-22.86778,-43.29127,0.0],["02-26-2020 09:43:39","A29128",210.0,-22.87821,-43.21585,9.0]]}

Para esse exemplo, temos 2 carros circulando na linha 210. As informações sobre eles são apresentadas então em uma lista com DATA/HORA da última atualização, nº de ordem, nº da linha, latitude, longitude e velocidade.

O primeiro passo então é receber em nosso aplicativo a informação de qual linha queremos consultar, isso é feito através das linhas abaixo:

linha = request.args.get('linha')uri = "http://dadosabertos.rio.rj.gov.br/apiTransporte/apresentacao/rest/index.cfm/obterPosicoesDaLinha/" + linhauResponse = requests.get(uri)Jresponse = uResponse.textdata = json.loads(Jresponse)valor = data['DATA']tamanho=len(valor)

Dessa forma conseguimos não apenas acessar a resposta, mas também contar a quantidade de itens disponibilizados

O passo seguinte é, para cada entrada presente na resposta da prefeitura, nós verificarmos qual o nome da rua onde cada carro se encontra, para isso podemos utilizar uma das APIs do Google, que é feito da seguinte maneira. Exemplo:

https://maps.googleapis.com/maps/api/geocode/json?latlng=-22.96004,-43.39588&key=[INSIRA AQUI SUA CHAVE]

Cuja resposta está abaixo:


{ "plus_code" : { "compound_code" : "2JQ3+XJ Rio de Janeiro, RJ, Brasil", "global_code" : "589R2JQ3+XJ" }, "results" : [ { "address_components" : [ { "long_name" : "47", "short_name" : "47", "types" : [ "street_number" ] }, { "long_name" : "Rua Antonio Manoel Da Silva", "short_name" : "R. Antonio Manoel Da Silva", "types" : [ "route" ] }, { "long_name" : "Curicica", "short_name" : "Curicica", "types" : [ "political", "sublocality", "sublocality_level_1" ] }, { "long_name" : "Rio de Janeiro", "short_name" : "Rio de Janeiro", "types" : [ "administrative_area_level_2", "political" ] },
Para o nosso exemplo o que nos interessa é pegar o nome completo da Rua a partir de cada ponto. Para isso precisamos usar um loop for, para extrair cada uma das coordenadas, consultar o google então extrair o nome da rua e salvar em uma variável:


latitude_bruto=str(vez[3:4])longitude_bruto=str(vez[4:5])latitude=latitude_bruto[1:-1]longitude=longitude_bruto[1:-1]ler="https://maps.googleapis.com/maps/api/geocode/json?latlng=" + latitude + "," + longitude + "&key=SUA CHAVE"resposta = requests.get(ler)Jresposta = resposta.textdata = json.loads(Jresposta)resposta_final = data['results'][0]['address_components'][1]['long_name']

O código final você encontra logo abaixo:

import os
from flask import Flask,jsonify,request
import requests
import json
app = Flask(__name__)
@app.route("/")
def home():
    linha = request.args.get('linha')
    if linha is None:
        return "Informe a linha desejada com ?linha="
    uri = "http://dadosabertos.rio.rj.gov.br/apiTransporte/apresentacao/rest/index.cfm/obterPosicoesDaLinha/" + linha
    uResponse = requests.get(uri)
    Jresponse = uResponse.text
    data = json.loads(Jresponse)
    valor = data['DATA']
    tamanho=len(valor)
    aviso = "Foram identificados " + str(tamanho) + " carros para essa linha, que estão localizados em: "
    #return aviso
    for i  in range(tamanho):
        vez=valor[i]
        latitude_bruto=str(vez[3:4])
        longitude_bruto=str(vez[4:5])
        latitude=latitude_bruto[1:-1]
        longitude=longitude_bruto[1:-1]
        ler="https://maps.googleapis.com/maps/api/geocode/json?latlng=" + latitude + "," + longitude + "&key=[INSIRA AQUI SUA CHAVE]"
        resposta = requests.get(ler)
        Jresposta = resposta.text
        data = json.loads(Jresposta)
        if i < tamanho-2:
            resposta_final = data['results'][0]['address_components'][1]['long_name'] + ", "
        elif i < tamanho-1:
            resposta_final = data['results'][0]['address_components'][1]['long_name'] + " e "   
        else:
            resposta_final = data['results'][0]['address_components'][1]['long_name']
        aviso = aviso + resposta_final
    return aviso
if __name__ == "__main__":
    port = int(os.environ.get("PORT", 5000))
    app.run(host='0.0.0.0', port=port)