segunda-feira, 4 de março de 2013

iOS - Marcar área em torno de um ponto no mapa

Esse post tem como objetivo apresentar como podemos demarcar uma área qualquer em torno de um ponto utilizando Objective-C.

Figura 1 - Área Delimitada

A Figura 1 mostra bem o quero apresentar com esse post. Neste figura, existem 7 pontos. O ponto azul simboliza o ponto onde esta o smartphone. Os 4 pontos vermelhos unidos por um quadrado tracejado representam uma área definida em torno do ponto azul. 

Imagine a seguinte situação: O ponto azul sendo uma pessoa, os quatro pontos vermelhos unidos por um quadrado tracejado sendo uma área de 1 mil metros quadrados. Você seria capaz de informar para a pessoa diversos tipos de serviços dentro de uma área específica.

Para isso é necessário obter localização do smartphone, isso pode ser realizado implementado o método  - (void) locationManager:(CLLocationManager *) manager didUpdateToLocation:(CLLocation *) newLocation fromLocation:(CLLocation *) oldLocation do protocolo CLLocationManagerDelegate.

Uma vez que saibamos onde esta o smartphone é possível definir os quatro pontos que definem a área em torno do ponto azul. Para isso deve-se criar uma região utilizando o método  MKCoordinateRegion MKCoordinateRegionMakeWithDistance passando o ponto de origem do smartphone e o quanto deseja de distância, para latitude e longitude.

Nesse momento é possível calcular os pontos extremos que definem a área de deseja, calculando o mínimo e o máximo de latitude e longitude. Cada um dos pontos corresponde a seguinte combinação: (mínimoLatitude, mínimoLongitude); (mínimoLatitude, máximoLongitude); (máximoLatitude, máximoLongitude) e (máximoLatitude, mínimoLongitude).

Abaixo segue código em Objective-C capaz de gerar a figura apresentada

TMKViewController.h

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>

@interface TMKViewController : UIViewController <MKMapViewDelegate, CLLocationManagerDelegate>

@property (weak, nonatomic) IBOutlet MKMapView *viewMap;

@property (weak, nonatomic) IBOutlet UITextField *labelLatitude;

@property (weak, nonatomic) IBOutlet UITextField *labelLongitude;

- (IBAction) getPosition:(id)sender;

@end

TMKViewController.m

#import "TMKViewController.h"

@interface TMKViewController ()

@end

@implementation TMKViewController

@synthesize labelLatitude, labelLongitude, viewMap;

CLLocationManager *locationManager;

CLLocation *currentLocation;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
 
    /*
     * INICIALIZANDO LOCATION MANAGER
     */
    locationManager = [[CLLocationManager alloc] init];
    [locationManager setDelegate: self];
    [locationManager setDesiredAccuracy: kCLLocationAccuracyBest];
    [locationManager startUpdatingLocation];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

- (void) getPosition:(id)sender
{

 // GERANDO COORD
    CLLocationCoordinate2D theOrigin = CLLocationCoordinate2DMake(currentLocation.coordinate.latitude, currentLocation.coordinate.longitude);
    
    // GERANDO REGIÃO DE MIL METROS QUADRADOS EM TORNO DO PONTO DE ORIGEM
 MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(theOrigin, 1000.0, 1000.0);
    
    // CALCULANDO MÍNIMOS E MÁXIMOS DE LATITUDE E LONGITUDE
    double minLat = region.center.latitude - (region.span.latitudeDelta / 2.0);
    double maxLat = region.center.latitude + (region.span.latitudeDelta / 2.0);
    
    double minLong = region.center.longitude - (region.span.longitudeDelta / 2.0);
    double maxLong = region.center.longitude + (region.span.longitudeDelta / 2.0);
    
    // MARCANDO PONTOS NO MAPA
    CLLocationCoordinate2D coordinate;
    MKPointAnnotation *pointAnnotation = nil;
    
    coordinate = CLLocationCoordinate2DMake( minLat, minLong);
    pointAnnotation = [[MKPointAnnotation alloc] init];
    [pointAnnotation setCoordinate:coordinate];
    [pointAnnotation setTitle:@"Sudoeste"];
    [viewMap addAnnotation:pointAnnotation];
    
    
    coordinate = CLLocationCoordinate2DMake( minLat, maxLong);
    pointAnnotation = [[MKPointAnnotation alloc] init];
    [pointAnnotation setCoordinate:coordinate];
    [pointAnnotation setTitle:@"Sudeste"];
    [viewMap addAnnotation:pointAnnotation];
    
    
    coordinate = CLLocationCoordinate2DMake( maxLat, maxLong);
    pointAnnotation = [[MKPointAnnotation alloc] init];
    [pointAnnotation setCoordinate:coordinate];
    [pointAnnotation setTitle:@"Nordeste"];
    [viewMap addAnnotation:pointAnnotation];
    
    
    coordinate = CLLocationCoordinate2DMake( maxLat, minLong);
    pointAnnotation = [[MKPointAnnotation alloc] init];
    [pointAnnotation setCoordinate:coordinate];
    [pointAnnotation setTitle:@"Noroeste"];
    [viewMap addAnnotation:pointAnnotation];
    
    [viewMap setRegion:region animated:YES];
    [viewMap setCenterCoordinate:theOrigin];
    [viewMap setShowsUserLocation:true];
    [viewMap setUserTrackingMode:MKUserTrackingModeFollowWithHeading];
    
    NSLog(@" Noroeste, Lat: %2.4f, Long: %2.4f ", maxLat, minLong);
    NSLog(@" Nordeste, Lat: %2.4f, Long: %2.4f ", maxLat, maxLong);
    NSLog(@" Sudoeste, Lat: %2.4f, Long: %2.4f ", minLat, minLong);
    NSLog(@" Sudeste , Lat: %2.4f, Long: %2.4f ", minLat, maxLong);
    
}

- (MKOverlayView *)mapView:(MKMapView *)map viewForOverlay:(id <MKOverlay>)overlay
{
    MKCircleView *circleView = [[MKCircleView alloc] initWithOverlay:overlay];
    circleView.strokeColor = [UIColor redColor];
    circleView.fillColor = [[UIColor redColor] colorWithAlphaComponent:0.4];
    return circleView;
}


#pragma mark - CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    NSLog(@"didFailWithError: %@", error);
    UIAlertView *errorAlert = [[UIAlertView alloc]
                               initWithTitle:@"Error" message:@"Failed to Get Your Location" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [errorAlert show];
}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    currentLocation = newLocation; // ATUALIZANDO VÁRIAVEL QUE GUARDA LOCALIZAÇÃO CORRENTE
    
    if (currentLocation != nil) {
        
        [labelLongitude setText: [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.longitude]];
        
        [labelLatitude setText: [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.latitude]];
    }
    
}

@end


Nenhum comentário:

Postar um comentário