Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CW 34: Bus1.me - Rafael Silva

CW 34: Bus1.me - Rafael Silva

Avatar for hackthursday

hackthursday

August 23, 2012
Tweet

More Decks by hackthursday

Other Decks in Programming

Transcript

  1. 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á
  2. Ocorrências de Repositórios no Github • “android”: 65452 • “IOS”:

    30072 • “iphone”: 25039 • “apple”: 3115
  3. <?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: "/> <EditText android:id="@+id/Usuario" android:layout_width="fill_parent" android:layout_height="wrap_content"/> </LinearLayout> </LinearLayout> </ScrollView>
  4. 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 }
  5. POST para o servidor //URL e json passados como parâmetro

    //Create a new HttpClient and Post Header String 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 }
  6. 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;
  7. Coordenadas do GPS final LocationManager mlocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); LocationListener

    mlocListener = new ListenerLocation(); mlocManager.requestLocationUpdates( LocationManag er.GPS_PROVIDER, 0, 0, mlocListener);
  8. Coordenadas do GPS public 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; } }
  9. Alarm Manager public class Alarm extends BroadcastReceiver { @Override public

    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); } }
  10. 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
  11. 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).
  12. Ponto var point = new google.maps.LatLng(lat, lon); //isso ainda não

    é um marcador Mapa var myOptions = { zoom: zoom, center: point, mapTypeId: google.maps.MapTypeId.ROADMAP} var map = new google.maps. Map(document.getElementById("map"), myOptions);
  13. 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);
  14. Círculo this.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/
  15. 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
  16. A trajetória numa casca (esférica) de noz • Ponto em

    3 dimensões: precisamos de 3 medidas. • Tudo bonito, MAS...
  17. 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
  18. 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.
  19. Distância entre dois pontos function 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; }
  20. 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);
  21. 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/
  22. Olhando de perto, tudo é função • Decompondo gráficos em

    partes podemos analisar os pedaços como se fossem funções.
  23. Ponto dentro de polígono • Como detectar se um ponto

    está dentro de um polígono qualquer?
  24. 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.
  25. 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";