0

I have a class that loads a map, get my current location, then does a search on my database for companies in an area based on a zip code radius. I am doing a for loop to loop through each address, forward geocode, now I want to put a placemark and annotation for each location. How can I accomplish this. Here is my code:

- (void)locationUpdate:(CLLocation *)location {
locationLabel.text = [location description];
NSNumber *lat = [[NSString alloc] initWithFormat:@"%g", location.coordinate.latitude];
float latValue = [lat floatValue];
NSNumber *lng = [[NSString alloc] initWithFormat:@"%g", location.coordinate.longitude];
float lngValue = [lng floatValue];

mapView=[[MKMapView alloc] initWithFrame:self.view.bounds];
mapView.showsUserLocation=TRUE;
mapView.mapType=MKMapTypeStandard;
mapView.delegate=self;

/*Region and Zoom*/
MKCoordinateRegion region;
MKCoordinateSpan span;
span.latitudeDelta=0.2;
span.longitudeDelta=0.2;

CLLocationCoordinate2D location1=mapView.userLocation.coordinate;

location1.latitude=latValue;
location1.longitude=lngValue;
region.span=span;
region.center=location1;

/*Geocoder Stuff*/

geoCoder=[[MKReverseGeocoder alloc] initWithCoordinate:location1];
geoCoder.delegate=self;
[geoCoder start];

[mapView setRegion:region animated:TRUE];
[mapView regionThatFits:region];
[self.view insertSubview:mapView atIndex:0];
}
- (void)reverseGeocoder:(MKReverseGeocoder *)geoCoder didFindPlacemark:(MKPlacemark *)placemark
{
NSDictionary *zipDic = [placemark addressDictionary];
NSString *zipCode = [zipDic objectForKey:@"ZIP"];
NSString *post = [NSString stringWithFormat:@"zip=%@", zipCode];
NSString *hostString = @"https://www.mysite.com/searchzip.php?";

// Append string and add percent escapes
hostString = [[hostString stringByAppendingString:post]    stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *hostURL = [NSURL URLWithString:hostString];
NSString *jsonString = [[NSString alloc] initWithContentsOfURL:hostURL];
self.zipArray = [jsonString JSONValue]; 
NSLog(@"%@", zipArray);
for (NSString *sZip in zipArray) {
     NSString *lblAddress = [sZip objectForKey:@"address"];
    NSString *hostStr = [[@"http://maps.google.com/maps/geo?q="   stringByAppendingString:lblAddress]stringByAppendingString:@"&key=ABQIAAAA1KqXKe5yJPkX6ii6Ud    K-0RSIvIZDM4KnjydqrehqKK56hFf_fxQc0uyCKoh-4i77-5B0Qfc8Gs223Q&sensor=false&output=json"];
    hostStr = [hostStr  stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    NSURL *hostURL = [NSURL URLWithString:hostStr];
    NSString *jsonString = [[NSString alloc] initWithContentsOfURL:hostURL];

    SBJSON *parser = [[SBJSON alloc] init];

    // parse the JSON string into an object - assuming json_string is a NSString of JSON data
    NSArray *object = [parser objectWithString:jsonString error:nil];

    NSArray *placemarks = [object objectForKey:@"Placemark"];
    NSDictionary *mark = [placemarks objectAtIndex:0];
    NSDictionary *point = [mark objectForKey:@"Point"];
    NSArray *coordinates = [point objectForKey:@"coordinates"];
    NSNumber *lat = (NSNumber*)[coordinates objectAtIndex:0];
    float latValue = [lat floatValue];
    NSNumber *lon = (NSNumber*)[coordinates objectAtIndex:1];
    float lonValue = [lon floatValue];

          //Here is where I would put placemarks and annotations
}

}
- (void)locationError:(NSError *)error {
locationLabel.text = [error description];
}

@end

I tried...

CLLocationCoordinate2D location = {latitude: latValue, longitude: lonValue};
    return location;

But obviously its wrong. I tried creating a seperate MapAnnotation class to handle the annotations like so:

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>
#import "AgencyViewController.h"
@interface MapAnnotation : NSObject<MKAnnotation> {
CLLocationCoordinate2D coordinate;
NSString *subtitletext;
NSString *titletext;
}
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
@property (readwrite, retain) NSString *titletext;
@property (readwrite, retain) NSString *subtitletext;
-(id)initWithCoordinate:(CLLocationCoordinate2D) coordinate;
- (NSString *)subtitle;
- (NSString *)title;
-(void)setTitle:(NSString*)strTitle;
-(void)setSubTitle:(NSString*)strSubTitle;

and implement it like so:

CLLocationCoordinate2D newCoord = {latitude: latValue, longitude: lonValue};

    MapAnnotation *addAnnotation = [[MapAnnotation alloc] initWithCoordinate:newCoord];  
    [addAnnotation setTitle:@"The Pin Title"];  
    [addAnnotation setSubTitle:@"The pin subtitle goes here"];  

    [mapView addAnnotation:addAnnotation];  

And that didnt work either...

1
  • What do you mean by "didn't work"? What is happening? Is the app crashing or is it just that no annotations show up? It's good to see your code but please explain what is happening/not happening etc. Jan 3, 2012 at 16:31

1 Answer 1

0

Figured it out, needed to add

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
MKPinAnnotationView *pinView = (MKPinAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"Prospects"];
if(pinView == nil) {
    pinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"Prospects"];
    pinView.pinColor = MKPinAnnotationColorGreen;
    pinView.animatesDrop = NO;
    pinView.canShowCallout = YES;
} else {
    pinView.annotation = annotation;
}
return pinView;
}

Now I need to figure out how to change the color of my location pin.

1
  • pinView.pinColor = MKPinAnnotationColorGreen; try outside the if statement
    – Frade
    Feb 2, 2012 at 10:05

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.