Download - Bus1me
![Page 1: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/1.jpg)
Rede social para compartilhamento de geolocalização
![Page 2: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/2.jpg)
Mobilidade Urbana
“Uma cidade verdadeiramente avançada é aquela em que os ricos usam transporte público, caminham e vão a parques. O contrário disso é quando eles usam helicópteros...”
Enrique Peñalosa, ex-prefeito de Bogotá
![Page 3: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/3.jpg)
Por que Android?
![Page 4: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/4.jpg)
Ocorrências de Repositórios no Github
● “android”: 65452● “IOS”: 30072● “iphone”: 25039● “apple”: 3115
![Page 5: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/5.jpg)
this.startPresentation();Layout em XML
● 122 linhas● 17 elementos de
layout
![Page 6: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/6.jpg)
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent"
android:layout_height="fill_parent"android:fillViewport="true"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical"
android:layout_width="fill_parent"android:layout_height="fill_parent"android:scrollbars="vertical"android:background="#87CEEB">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:paddingTop="5px"android:orientation="horizontal"android:layout_width="fill_parent"android:layout_height="wrap_content"> <TextView
android:layout_width="125px" android:layout_height="wrap_content"android:textColor="#FFFFFF"android:textSize="25sp"android:gravity="right" android:text="Usuário: "/>
<EditTextandroid:id="@+id/Usuario"android:layout_width="fill_parent" android:layout_height="wrap_content"/>
</LinearLayout></LinearLayout>
</ScrollView>
![Page 7: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/7.jpg)
JSON no Android
//Cria objeto Json para enviar dados
JSONObject userData = new JSONObject(); try {
userData.put("hash", encryptedName);userData.put("ps", password);
} catch (JSONException e) {//TODO Auto-generated catch block//Exception
}
![Page 8: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/8.jpg)
POST para o servidor//URL e json passados como parâmetro//Create a new HttpClient and Post HeaderString text = "";
HttpClient httpclient = new DefaultHttpClient();HttpPost httppost = new HttpPost(URL);try {
JSONArray postjson=new JSONArray();postjson.put(json);
// Post the data:httppost.setHeader("json",json.toString());httppost.getParams().
setParameter("jsonpost",postjson);
HttpResponse response = httpclient.execute(httppost); }catch (ClientProtocolException e) {
TODO Auto-generated catch block}
![Page 9: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/9.jpg)
Enquanto isso, no servidor...<?php
$json = $_SERVER['HTTP_JSON'];//http://fahmirahman.wordpress.com
$data = json_decode($json); $user = $data->hash;$password = $data->ps;
//validação//teste
echo $response;
![Page 10: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/10.jpg)
Coordenadas do GPS
final LocationManager mlocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
LocationListener mlocListener = new ListenerLocation();
mlocManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, mlocListener);
![Page 11: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/11.jpg)
Coordenadas do GPSpublic class ListenerLocation implements LocationListener {
public static float lat;public static float lon;public void onLocationChanged(Location location) {
lat = (float) location.getLatitude();lon = (float) location.getLongitude();
}
public void onProviderDisabled(String provider) {}public void onProviderEnabled(String provider) {}public void onStatusChanged(String provider, int status, Bundle
extras) {}
public static float getLat() {return lat;
}
public static float getLon() {return lon;
}}
![Page 12: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/12.jpg)
Service
final Intent sendService = new Intent("SERVICE");startService(sendService);
![Page 13: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/13.jpg)
Alarm Managerpublic class Alarm extends BroadcastReceiver {
@Overridepublic void onReceive(Context context, Intent intent){
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");wl.acquire();
//Put code here.
wl.release();}
public void SetAlarm(Context context){ AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); Intent i = new Intent(context, Alarm.class); PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0); am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 * 10, pi); }
public void CancelAlarm(Context context){ Intent intent = new Intent(context, Alarm.class); PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0); AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); alarmManager.cancel(sender); } }
![Page 14: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/14.jpg)
GeoCooding API
● Limite grátis de 2500 requisições diárias.● Coordenadas ↔ Informações (estado, país,
cidade, etc.)
Ex.:http://maps.googleapis.com/maps/api/geocode/json?
address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=false
http://maps.googleapis.com/maps/api/geocode/json?latlng=-31.765262537003238,-52.337857211608934&sensor=false
![Page 15: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/15.jpg)
Maps API
● Disponível em Javascript e Flash.● Uso gratuito (até 25.000 carregamentos diários
da biblioteca. Depois U$ 4,00/1000).● Não necessita mais de chave de registro (exceto
mobile).
![Page 16: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/16.jpg)
Ponto
var point = new google.maps.LatLng(lat, lon);//isso ainda não é um marcador
Mapavar myOptions = {
zoom: zoom,center: point, mapTypeId: google.maps.MapTypeId.ROADMAP}
var map = new google.maps. Map(document.getElementById("map"), myOptions);
![Page 17: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/17.jpg)
Marcador
var marker = new google.maps.Marker({position: point,map: map});
marker.setMap(map);
![Page 18: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/18.jpg)
Linha
var route = [];var point = new google.maps.LatLng( lat, lon );route.push( point );line = new google.maps.Polyline({
path: route,strokeColor: 'red',strokeOpacity: 0.8,strokeWeight: 6});
line.setMap(map);
![Page 19: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/19.jpg)
Círculothis.radius = 200;var populationOptions = {
strokeColor: "#FF0000",strokeOpacity: 0.8,strokeWeight: 2,fillColor: "#FF0000",fillOpacity: 0.35,map: map,center: center,radius: this.radius};this.circle = new google.maps.Circle
(populationOptions);this.circle.setMap(map);
Ex.: /workspace/bus1meRecover/test/mapCircle/
![Page 20: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/20.jpg)
Cálculo de distâncias● B-A (arco): PI * R / 2● B-A (reta): R * sqrt(2)● d = R * (PI/2 – sqrt(2))● D = 998.7 Km
![Page 21: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/21.jpg)
A trajetória numa casca (esférica) de noz
● Ponto em 3 dimensões: precisamos de 3 medidas.
● Tudo bonito, MAS...
![Page 22: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/22.jpg)
Algumas tretas com coordenadas geográficas
● Medidas desiguais de latitude e longitude.
● Equador > Greenwich (Literalmente. Chupa, Inglaterra. Free Assange)
● Distâncias ->
lat: 11131.94 m
lon: 9464.27 m
![Page 23: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/23.jpg)
Métricas
Posição e Tempo geram:
● Distância, velocidade média, aceleração.
● Velocidade do tráfego por hora do dia.
● Atraso por trecho.
![Page 24: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/24.jpg)
Distância entre dois pontosfunction calculateDistanceBetweenCoordinates($lat1, $lon1, $lat2, $lon2){
$R = 6378.1; // km$dLat = deg2rad($lat2-$lat1);$dLon = deg2rad($lon2-$lon1);$lat1 = deg2rad($lat1);$lat2 = deg2rad($lat2);$a = sin($dLat/2) * sin($dLat/2) + sin($dLon/2) *
sin($dLon/2) * cos($lat1) * cos($lat2); $c = 2 * atan2(sqrt($a), sqrt(1-$a)); $d = $R * $c* 1000;return $d;
}
![Page 25: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/25.jpg)
Distância entre dois pontos
var myLatlng = new google.maps.LatLng(lat, lon);var myLatlng2 = new google.maps.LatLng(lat2, lon2); distance = google.maps.geometry.spherical.
computeDistanceBetween(myLatlng, myLatlng2);
![Page 26: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/26.jpg)
Muitos Objetos no Mapa
● Coordenadas para traçar uma rota não representam grande tráfego de rede, mas ter muitos pontos atrapalha.
● Ex.: http://pelotas.com.br/pelotasmelhor/mapa/
![Page 27: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/27.jpg)
Taxa de Nyquist
Frequência de amostragem mínima para reproduzir um sinal a partir de suas amostras.
Fs > 2*Fb
![Page 28: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/28.jpg)
![Page 29: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/29.jpg)
Olhando de perto, tudo é função● Decompondo gráficos
em partes podemos analisar os pedaços como se fossem funções.
![Page 30: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/30.jpg)
![Page 31: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/31.jpg)
Ponto dentro de polígono● Como detectar se um
ponto está dentro de um polígono qualquer?
![Page 32: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/32.jpg)
Ao infinito e além● Coloca-se um ponto
no infinito (ou o mais perto disso que se conseguir)
● Traça-se uma reta do ponto dentro do polígono ao ponto no infinito.
● Verifica cruzamentos nas retas do polígono.
![Page 33: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/33.jpg)
Encontrando o ponto mais próximo//equação da distância entre dois pontos$query = "SELECT lat, lon, minor_angle, major_angle, zone FROM points WHERE 1
ORDER BY 6378.1 * 2 * atan2( ( sin(radians( $lat - lat )/2) *
sin( radians( $lat - lat ) /2) + sin( radians($lon - lon) /2) * sin( radians($lon - lon) /2) * cos( radians(lat) ) * cos( radians($lat) )
), (1 - sin(radians( $lat - lat )/2) * sin( radians( $lat - lat ) /2) + sin( radians($lon - lon) /2) * sin( radians($lon - lon) /2) * cos( radians(lat) ) * cos( radians($lat) )
) ) * 1000";
![Page 34: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/34.jpg)
Próximos Passos
Node.jsAprimoramento do algoritmo de buscasEconomia de energia
![Page 35: Bus1me](https://reader034.vdocuments.com.br/reader034/viewer/2022051816/5455ac84b1af9f40378b4999/html5/thumbnails/35.jpg)
Obrigado!