Upload
eduard-roccatello
View
4.813
Download
0
Tags:
Embed Size (px)
Citation preview
24 Ottobre 2009Italians iPhone Developers meeting @ VeneziaCamp2009
Eduard Roccatello <[email protected]>
GIS e Geolocalizzazione CoreLocation Framework MapKit Framework Use case: ReLocate Discussione
2Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
GIS - Geographic Information System
Software che lavora con il territorio; più esattamente con l’informazione territoriale.
Consumer
Google Maps
Microsoft Live Search Maps
ViaMichelin
Yahoo! Maps
3Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
Business
Free & opensource software
▪ Molti software di alta qualità, aderenti agli standard emanati da Open Geospatial Consortium (OGC).
Commerciale
▪ Autodesk
▪ ESRI
▪ Bentley
4Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
Cos’è cambiato?
Banda larga
Ampia diffusione di dispositivi mobile
La maggior parte delle applicazioni tradizionali sono state riviste.
E se sfruttassimo la posizione geografica per fornire nuove potenzialità?
5Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
Associare ad un documento multimediale una coppia di coordinate geografiche.
Diffusa sul web per la condivisione di fotografie e video.
Ma anche per eventi, strutture, punti di interesse... Qualsiasi elemento che possa essere
georeferenziato.
6Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
HTML 5 offre supporto alla geolocalizzazione.
Browser che supportano la geolocalizzazione: Mozilla Firefox 3.5 Apple Mobile Safari
Due modalità Utilizzo di un ricevitore GPS Database di geolocalizzazione tramite IP.
Accuratezza Houston we have a problem...
Da 10 m del caso ottimo a circa 50 km nei casi peggiori.
7Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
// controllo del supporto
if (navigator.geolocation){
navigator.geolocation
.getCurrentPosition(onSuccess, onError);
}
// stub per gestione errore
function onError(message) {}
function onSuccess(position) {
// debug con firebug ;)
console.dir(position);
var s = "LAT: " + position.coords.latitude +
"LON: " + position.coords.longitude;
alert(s);
}
8Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
9Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
Assisted GPS (A-GPS) Ottimo perchè consente un fixing veloce.
Combina la triangolazione cellulare (LBS – Location Base Service) con le informazioni relative alla posizione dei satelliti.▪ Al fine di ottenere il segnale GPS velocemente.
Migliore accuratezza rispetto al GPS tradizionale▪ Fino a 10 metri contro i 30 classici.
Limitazioni▪ Nessun accesso alle stringhe NMEA.
10Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
Bussola magnetica - Magnometer
Consente di ottenere la direzione sui tre assi xyz senza doversi spostare ed affidarsi al poco accurato GPS.
Limitazioni ma anche applicazioni
▪ Soggetta a false letture dovute a campi magnetici esterni.
▪ Potreste volerlo utilizzare per trovare i fili elettrici nel muro :-P
11Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
Dispositivi di localizzazione Core Location Framework
▪ I dispositivi sono condivisi tra tutte le applicazioni e OS X mobile.
▪ Non è possibile accedere direttamente ai dispositivi.
Gestire la mappa MapKit Framework
▪ Supporto nativo alla mappa di Google.
▪ Solo con iPhone Firmware 3.0 e successivi.
12Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
Framework alla base di iPhone OS.
Introdotto con iPhone OS 2.0
Può utilizzare la triangolazione cellulare, GPS e WiFi (non in Italia).
Consente di trovare la posizione, l’orientamento e la velocità di spostamento del dispositivo.
13Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
Core Location è basato su eventi.
Alla disponibilità di una nuova localizzazione iPhone attiverà un evento.
Per poter utilizzare Core Location, le applicazioni devono essere configurate per ricevere questi eventi.
14Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
Requisiti di base
Creare un’istanza della classe CLLocationManager
Assegnare un delegato alla classe che implementi il protocollo CLLocationManagerDelegate
▪ Questa istanza intercetta gli eventi
▪ Si occupa di fatto di aggiornare tutti gli aspetti relativi alla geolocalizzazione.
15Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
Aprite Xcode 3.2
Create un nuovo progetto
View-Based project
Chiamatelo VeniceCamp
Aggiungete il framework CoreLocation
Add > Existing framework...
▪ CoreLocation.framework
16Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
Aggiungete gli header di CoreLocation.
Per ogni classe... O meglio usando VeniceCamp_Prefix.pch
Dentro Other Sources
#ifdef __OBJC__
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
#endif 17Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
Aggiungete una nuova classe
Cliccate su Classes
Add > New file...
Iphone OS
▪ Cocoa Touch Class
▪ Objective-C class▪ Subclass of NSObject
Chiamatela FirstCLController.m
▪ Create anche il file .h
18Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
E’ il delegato per la gestione degli eventi Deve implementare CLLocationManagerDelegate
Eventi di posizione– locationManager:didUpdateToLocation:fromLocation: – locationManager:didFailWithError:
Eventi di orientamento (opzionali – a meno di usare la bussola)
– locationManager:didUpdateHeading: – locationManagerShouldDisplayHeadingCalibration:
19Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
@interface FirstCLController :
NSObject <CLLocationManagerDelegate> {
CLLocationManager *locationManager;
}
@property (nonatomic, retain) CLLocationManager *locationManager;
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation;
- (void)locationManager:(CLLocationManager *)manager
didFailWithError:(NSError *)error;
@end
20Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
Dichiara la classe come aderente al protocollo CLLocationManagerDelegate
Contiene un’istanza della classe CLLocationManager, che viene esposta tramite l’uso delle proprietà.
Dichiara solo i metodi per la location.
21Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
@implementation FirstCLController@synthesize locationManager;
- (id) init {self = [super init];if (self != nil) {
self.locationManager = [[[CLLocationManager alloc] init] autorelease];self.locationManager.delegate = self;
}return self;
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
NSLog(@"Location: %@", [newLocation description]);}
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
NSLog(@"Error: %@", [error description]);}
- (void)dealloc {[self.locationManager release];[super dealloc];
}
@end
22Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
Init crea l’istanza e inizializza una nuova instanza di CLLocationManager.
Viene associata l’istanza della classe come delegato dell’istanza del location manager.
I metodi del protocollo rispondono agli eventi scrivendo dei messaggi nel log, utilizzando la funzione NSLog.
23Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
Definito il controller aggiungiamolo al nostro ViewController preesistente.
Aprite VeniceCampViewController.h e aggiungete le righe evidenziate.
@class FirstCLController
@interface VeniceCampViewController : UIViewController {
FirstCLController *locationController;
}
@property (nonatomic, retain)
FirstCLController *locationController;
@end
24Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
Aprite ora VeniceCampViewController.m In testa aggiungete#import “FirstCLController.h”
@implementation ...
@synthesize locationController;
Implementate i metodi seguenti- (void) viewDidLoad {
[super viewDidLoad];
locationController = [[MyCLController alloc] init];
[locationController.locationManager startUpdatingLocation];
}
- (void) dealloc {
[locationController release];
[super dealloc];
}
25Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
Caricata la vista, il metodo viewDidLoadinizializza il controller creato in precedenza ed avvia il location manager con il metodo startUpdatingLocation.
A questo punto possiamo provare l’applicazione. Compilate ed eseguite dal menu
Build > Build and Run.
Visualizzate la console dal menu Run > Console.
26Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
Mantenere logica e visualizzazione separati è fondamentale per assicurare una qualità migliore.
Come passare i dati quindi dal controller per CoreLocation alla vista?
Utilizzamo un protocollo e lo strumento dei delegati.
27Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
Aprite FirstCLController.h Creiamo il protocollo LocatorDelegate dopo le
righe di importazione
@protocol LocatorDelegate
@required
- (void) locationUpdate:
(CLLocation *)location;
- (void) locationError:
(NSString *)error;
@end
28Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
Aggiungete una nuova variabile nell’interfaccia: id delegate;
Create la proprietà: @property (nonatomic, assign)
id<LocatorDelegate> delegate;
Modificate la dichiarazione di VeniceCampViewController.h in @interface VeniceCampViewController :
UIViewController <LocatorDelegate>
29Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
Per prima cosa aggiungete in testa @synthesize delegate;
Aprite FirstCLController.m e aggiungete dopo le righe di logging dei metodi didUpdateToLocation e didFailWithErrorrispettivamente: [self.delegate locationUpdate:newLocation];
[self.delegate locationError:
[error description]];
30Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
Aggiungete una nuova variabile per contenere una label come segue in VeniceCampViewController.h IBOutlet UILabel *locationLabel;
Aprite l’interface builder facendo doppio click sullo xib VeniceCampViewController, in Resources.
Aggiungete una label e collegatela al File’s Owner.
31Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
Entrambi i metodi del protocollo sono obbligatori.
- (void) locationUpdate:(CLLocation *)location{
[locationLabel setText:[location description]];
}
- (void) locationError:(NSString *)error{
[locationLabel setText:error];
}
32Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
A questo punto è necessario aggiungere il delegato al controller di Core Location.
Questo avviene nel metodo viewDidLoad locationController.delegate = self;
A questo punto la comunicazione tra controller e vista è impostata e funzionante.
33Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
Proprietà
BOOL locationServicesEnabled
▪ Indica se nel dispositivo sono abilitati i servizi di localizzazione.
CLLocation *location
▪ L’ultima location ricevuta
CLLocationDistance distanceFilter
▪ Distanza dall’ultima posizione dopo la quale essere notificati degli eventi
▪ kCLDistanceFilterNone per tutti gli eventi
34Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
Proprietà CLLocationAccuracy desiredAccuracy Indica l’accuretezza desiderata. Possibili valori:
▪ kCLLocationAccuracyBest; (default)▪ kCLLocationAccuracyNearestTenMeters;▪ kCLLocationAccuracyHundredMeters;▪ kCLLocationAccuracyKilometer;▪ kCLLocationAccuracyThreeKilometers;
BOOL headingAvailable▪ Indica se la bussola è disponibile nel dispositivo
CLLocationDegrees headingFilter▪ Gradi di tolleranza per far scattare le notifiche di orientamento.
35Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
Con l’introduzione di iPhone OS 3.0 è disponibile un nuovo framework per la gestione della mappa.
Possiamo utilizzarlo per visualizzare la posizione sulla mappa.
Aggiungiamo il framework MapKit.frameworke l’import #import <MapKit/MapKit.h>
36Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
Aggiungete una nuova proprietà IBOutlet a VeniceCampViewController.h MKMapView *mapView;
@property (nonatomic, retain)
IBOutlet MKMapView *mapView;
Dall’Interface Builder aggiungete una mappa e associatela al File’s Owner.
37Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
Aprite VeniceCampViewController.m Nel metodo locationUpdate ora dobbiamo
aggiornare la mappa.
Si vuole ottenere lo zoom alla regione interessata.MKCoordinateRegion region;
MkCoordinateSpan span;
span.longitudeDelta = 0.05;
span.latitudeDelta = 0.05;
region.center = [location coordinate];
region.span = span;
[mapView setRegion:region animated:TRUE];
38Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
Basta abilitare il flag showsUserLocation a TRUE.
Possiamo anche utilizzare l’interface builder, spuntando la scelta nelle proprietà.
Ricompilate, riavviate ed ecco uno splendido puntino blu!
39Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
Posso utilizzare la annotation per visualizzare elementi accessori sulla mappa.
Pushpin
Descrizioni
Posso disegnare polilinee e poligoni ma devo utilizzare degli hack.
Alternative? Route-me library!40Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
41Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009
Dubbi, domande?
42Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009