bus1me
DESCRIPTION
TRANSCRIPT
Rede social para compartilhamento de geolocalização
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á
Por que Android?
Ocorrências de Repositórios no Github
● “android”: 65452● “IOS”: 30072● “iphone”: 25039● “apple”: 3115
this.startPresentation();Layout em XML
● 122 linhas● 17 elementos de
layout
<?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>
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
}
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}
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;
Coordenadas do GPS
final LocationManager mlocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
LocationListener mlocListener = new ListenerLocation();
mlocManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, mlocListener);
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;
}}
Service
final Intent sendService = new Intent("SERVICE");startService(sendService);
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); } }
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
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).
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);
Marcador
var marker = new google.maps.Marker({position: point,map: map});
marker.setMap(map);
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);
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/
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
A trajetória numa casca (esférica) de noz
● Ponto em 3 dimensões: precisamos de 3 medidas.
● Tudo bonito, MAS...
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
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.
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;
}
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);
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/
Taxa de Nyquist
Frequência de amostragem mínima para reproduzir um sinal a partir de suas amostras.
Fs > 2*Fb
Olhando de perto, tudo é função● Decompondo gráficos
em partes podemos analisar os pedaços como se fossem funções.
Ponto dentro de polígono● Como detectar se um
ponto está dentro de um polígono qualquer?
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.
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";
Próximos Passos
Node.jsAprimoramento do algoritmo de buscasEconomia de energia
Obrigado!