-
Notifications
You must be signed in to change notification settings - Fork 1
/
BSForwardGeocoder.m
139 lines (99 loc) · 3.38 KB
/
BSForwardGeocoder.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
//
// Created by Björn Sållarp on 2010-03-13.
// NO Copyright 2010 MightyLittle Industries. NO rights reserved.
//
// Use this code any way you like. If you do like it, please
// link to my blog and/or write a friendly comment. Thank you!
//
// Read my blog @ http://blog.sallarp.com
//
#import "BSForwardGeocoder.h"
@implementation BSForwardGeocoder
@synthesize searchQuery, status, results, delegate;
-(id) initWithDelegate:(id<BSForwardGeocoderDelegate>)del
{
self = [super init];
if (self != nil) {
delegate = del;
}
return self;
}
-(void) findLocation:(NSString *)searchString
{
// store the query
self.searchQuery = searchString;
[self performSelectorInBackground:@selector(startGeocoding) withObject:nil];
}
-(void)startGeocoding
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
int version = 3;
NSError *parseError = nil;
if(version == 2)
{
// Create the url to Googles geocoding API, we want the response to be in XML
NSString* mapsUrl = [[NSString alloc] initWithFormat:@"http://maps.google.com/maps/geo?q=%@&gl=se&output=xml&oe=utf8&sensor=false",
searchQuery];
// Create the url object for our request. It's important to escape the
// search string to support spaces and international characters
NSURL *url = [[NSURL alloc] initWithString:[mapsUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
// Run the KML parser
BSGoogleV2KmlParser *parser = [[BSGoogleV2KmlParser alloc] init];
[parser parseXMLFileAtURL:url parseError:&parseError];
[url release];
[mapsUrl release];
status = parser.statusCode;
// If the query was successfull we store the array with results
if(parser.statusCode == G_GEO_SUCCESS)
{
self.results = parser.placemarks;
}
[parser release];
}
else if(version == 3)
{
// Create the url to Googles geocoding API, we want the response to be in XML
NSString* mapsUrl = [[NSString alloc] initWithFormat:@"http://maps.google.com/maps/api/geocode/xml?address=%@&sensor=false",
searchQuery];
// Create the url object for our request. It's important to escape the
// search string to support spaces and international characters
NSURL *url = [[NSURL alloc] initWithString:[mapsUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
// Run the KML parser
BSGoogleV3KmlParser *parser = [[BSGoogleV3KmlParser alloc] init];
[parser parseXMLFileAtURL:url parseError:&parseError ignoreAddressComponents:NO];
[url release];
[mapsUrl release];
status = parser.statusCode;
// If the query was successfull we store the array with results
if(parser.statusCode == G_GEO_SUCCESS)
{
self.results = parser.results;
}
[parser release];
}
if(parseError != nil)
{
if([delegate respondsToSelector:@selector(forwardGeocoderError:)])
{
[delegate performSelectorOnMainThread:@selector(forwardGeocoderError:) withObject:[parseError localizedDescription] waitUntilDone:NO];
}
}
else {
if([delegate respondsToSelector:@selector(forwardGeocoderFoundLocation)])
{
[delegate performSelectorOnMainThread:@selector(forwardGeocoderFoundLocation) withObject:nil waitUntilDone:NO];
}
}
[pool release];
NSLog(@"Found placemarks: %d", [self.results count]);
}
-(void)dealloc
{
if(results != nil) {
[results release];
}
[searchQuery release];
[googleAPiKey release];
[super dealloc];
}
@end