bus1me

35
Rede social para compartilhamento de geolocalização

Upload: lucas-teixeira

Post on 01-Nov-2014

530 views

Category:

Documents


0 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Bus1me

Rede social para compartilhamento de geolocalização

Page 2: Bus1me

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

Por que Android?

Page 4: Bus1me

Ocorrências de Repositórios no Github

● “android”: 65452● “IOS”: 30072● “iphone”: 25039● “apple”: 3115

Page 5: Bus1me

this.startPresentation();Layout em XML

● 122 linhas● 17 elementos de

layout

Page 6: Bus1me

<?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

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

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

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

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

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

Service

final Intent sendService = new Intent("SERVICE");startService(sendService);

Page 13: Bus1me

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

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

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

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

Marcador

var marker = new google.maps.Marker({position: point,map: map});

marker.setMap(map);

Page 18: Bus1me

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

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

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

A trajetória numa casca (esférica) de noz

● Ponto em 3 dimensões: precisamos de 3 medidas.

● Tudo bonito, MAS...

Page 22: Bus1me

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

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

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

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

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

Taxa de Nyquist

Frequência de amostragem mínima para reproduzir um sinal a partir de suas amostras.

Fs > 2*Fb

Page 28: Bus1me
Page 29: Bus1me

Olhando de perto, tudo é função● Decompondo gráficos

em partes podemos analisar os pedaços como se fossem funções.

Page 30: Bus1me
Page 31: Bus1me

Ponto dentro de polígono● Como detectar se um

ponto está dentro de um polígono qualquer?

Page 32: Bus1me

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

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

Próximos Passos

Node.jsAprimoramento do algoritmo de buscasEconomia de energia

Page 35: Bus1me

Obrigado!