Especificações • Instruções • Google Cloud Functions • Demonstração • Dependências • Alunos • Professor Responsável
- A aplicação móvel deve exibir o mapa da localização atual do telefone.
- A aplicação móvel deve rastrear a localização do usuário.
- A cada atualização de localização, a aplicação móvel deve invocar a função lambda do GCF.
- A função lambda deve verificar se o aparelho se encontra a menos de 100 metros de alguma unidade da PUC Minas e retornar para o celular a mensagem "Bem vindo à PUC Minas unidade " + <nome da unidade mais próxima>.
- Endpoint do google cloud function: https://us-central1-clean-axiom-294822.cloudfunctions.net/distances
- Parâmetros:
- lat_s
- lng_s
- lat_d
- lng_d
- Exemplo:
https://us-central1-clean-axiom-294822.cloudfunctions.net/distances?lat_s=-19.9333&lng_s=-43.9371&lat_d=-19.9334&lng_d=-43.9368
- Na plataforma do Firebase o recurso Cloud Firestore está armazenado os campus pertencentes a PUC MINAS, contendo os campos de latitude, longitude e o nome do campus.
"""
Google Clound Function to calculate distance between two coordinates.
Source code: (https://github.com/chirichignoa/ParkingRecommender/blob/4c1d7a4dcfa98fe459ab54cb7aaac37c68214231/HaversineDistanceService/app.py)
Haversine: (https://en.wikipedia.org/wiki/Haversine_formula)
"""
"""
Function to convert degrees to radians
"""
def degrees_to_radians(degrees):
return degrees * pi / 180
def get_haversine(lat_s, lng_s, lat_d, lng_d):
earth_radius_km = 6371
d_lat = degrees_to_radians(lat_d - lat_s)
d_lon = degrees_to_radians(lng_d - lng_s)
a = sin(d_lat / 2) * sin(d_lat / 2) + sin(d_lon / 2) * sin(d_lon / 2) * cos(lat_s) * cos(lat_d)
c = 2 * atan2(sqrt(a), sqrt(1 - a))
return (earth_radius_km * c) * 1000
def hello_world(request):
"""Responds to any HTTP request.
Args:
request (flask.Request): HTTP request object.
Returns:
The response text or any set of values that can be turned into a
Response object using
`make_response <http://flask.pocoo.org/docs/1.0/api/#flask.Flask.make_response>`.
"""
request_json = request.get_json()
lat_s = float(request.args.get('lat_s', None))
lng_s = float(request.args.get('lng_s', None))
lat_d = float(request.args.get('lat_d', None))
lng_d = float(request.args.get('lng_d', None))
if (lat_s is None) or (lng_s is None) or (lat_d is None) or (lng_d is None):
return make_response(jsonify("The request does not have neccessary parameters"), 400)
distance = get_haversine(lat_s, lng_s, lat_d, lng_d)
if(distance < 100):
return make_response(jsonify(
{'distance': get_haversine(lat_s, lng_s, lat_d, lng_d), 'response': True}
), 200)
return make_response(jsonify(
{'distance': get_haversine(lat_s, lng_s, lat_d, lng_d), 'response': False}
), 200)
- A função acima é responsável por retornar um JSON com o cálculo utilizando à fórmula de Haversine que é responsável por encontrar a distância entre dois pontos geográficos a partir de suas latitudes e longitudes.
- A função foi escrita em Python pela facilidade da manipulação dos dados, e foi utilizado o Micro-framework chamado Flask. Portanto, foi-se utilizado também a propriedade args para que fosse possível analisar os parâmetros passados na query da URL.
- O trigger para chamar a função está disponível nesse link: https://us-central1-clean-axiom-294822.cloudfunctions.net/distances
- Algumas métricas disponíveis no site:
Link da demonstração: https://youtu.be/9dXjdV5qtLg
As modificações de localização do usuário foram realizadas pelo próprio emulador:
- IDE (Visual Studio Code / Android Studio).
- Emulador (Android Studio AVD / Genymotion).
- Dentro de (android/app/src/main/AndroidManifest.xml) há algumas dependências relacionadas com Google Maps e o Geolocator.
- Matheus Santos Rosa Carneiro - mcarneirobug
- Raissa Carolina Vilela da Silva - raissavilela
- Vitor Augusto Alves de Jesus - ovitorj
- Hugo Bastos de Paula - hugodepaula