Skip to content

Commit 291c7e7

Browse files
committed
Merge remote-tracking branch 'upstream/master'
Conflicts: SVGeocoder/SVGeocoder.m
2 parents 3f5dd83 + 780dc53 commit 291c7e7

File tree

2 files changed

+78
-9
lines changed

2 files changed

+78
-9
lines changed

SVGeocoder/SVGeocoder.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,12 @@
1313

1414
#import "SVPlacemark.h"
1515

16+
#define SVGeocoderComponentRoute @"route"
17+
#define SVGeocoderComponentLocality @"locality"
18+
#define SVGeocoderAdministrativeArea @"administrative_area"
19+
#define SVGeocoderPostalCode @"postal_code"
20+
#define SVGeocoderCountry @"country"
21+
1622
typedef enum {
1723
SVGeocoderZeroResultsError = 1,
1824
SVGeocoderOverQueryLimitError,
@@ -34,12 +40,17 @@ typedef void (^SVGeocoderCompletionHandler)(NSArray *placemarks, NSHTTPURLRespon
3440
+ (SVGeocoder*)geocode:(NSString *)address completion:(SVGeocoderCompletionHandler)block;
3541

3642
+ (SVGeocoder*)geocode:(NSString *)address region:(CLRegion *)region completion:(SVGeocoderCompletionHandler)block;
43+
+ (SVGeocoder*)geocode:(NSString *)address components:(NSDictionary *)components completion:(SVGeocoderCompletionHandler)block;
44+
+ (SVGeocoder*)geocode:(NSString *)address region:(CLRegion *)region components:(NSDictionary *)components completion:(SVGeocoderCompletionHandler)block;
3745

3846
+ (SVGeocoder*)reverseGeocode:(CLLocationCoordinate2D)coordinate completion:(SVGeocoderCompletionHandler)block;
3947

4048
- (SVGeocoder*)initWithAddress:(NSString *)address completion:(SVGeocoderCompletionHandler)block;
4149

4250
- (SVGeocoder*)initWithAddress:(NSString *)address region:(CLRegion *)region completion:(SVGeocoderCompletionHandler)block;
51+
- (SVGeocoder*)initWithAddress:(NSString *)address components:(NSDictionary *)components completion:(SVGeocoderCompletionHandler)block;
52+
- (SVGeocoder*)initWithAddress:(NSString *)address region:(CLRegion *)region components:(NSDictionary *)components completion:(SVGeocoderCompletionHandler)block;
53+
4354

4455
- (SVGeocoder*)initWithCoordinate:(CLLocationCoordinate2D)coordinate completion:(SVGeocoderCompletionHandler)block;
4556

SVGeocoder/SVGeocoder.m

Lines changed: 67 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ - (SVGeocoder*)initWithParameters:(NSMutableDictionary*)parameters completion:(S
4444
- (void)addParametersToRequest:(NSMutableDictionary*)parameters;
4545

4646
- (void)finish;
47+
- (NSString*)createComponentsStringFromDictionary:(NSDictionary *)components;
48+
- (NSString*)createBoundsStringFromRegion:(CLRegion *)region;
4749

4850
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
4951

@@ -81,12 +83,30 @@ + (SVGeocoder *)geocode:(NSString *)address region:(CLRegion *)region completion
8183
return geocoder;
8284
}
8385

86+
+ (SVGeocoder*)geocode:(NSString *)address components:(NSDictionary *)components completion:(SVGeocoderCompletionHandler)block {
87+
SVGeocoder *geocoder = [[self alloc] initWithAddress:address components:components completion:block];
88+
[geocoder start];
89+
return geocoder;
90+
}
91+
92+
+ (SVGeocoder*)geocode:(NSString *)address region:(CLRegion *)region components:(NSDictionary *)components completion:(SVGeocoderCompletionHandler)block {
93+
SVGeocoder *geocoder = [[self alloc] initWithAddress:address region:region components:components completion:block];
94+
[geocoder start];
95+
return geocoder;
96+
}
97+
8498
+ (SVGeocoder *)reverseGeocode:(CLLocationCoordinate2D)coordinate completion:(SVGeocoderCompletionHandler)block {
8599
SVGeocoder *geocoder = [[self alloc] initWithCoordinate:coordinate completion:block];
86100
[geocoder start];
87101
return geocoder;
88102
}
89103

104+
+ (void)setGoogleMapsAPIKey:(NSString *)key {
105+
106+
googleMapsAPIKey = [key copy];
107+
108+
}
109+
90110
#pragma mark - Public Initializers
91111

92112
- (SVGeocoder*)initWithCoordinate:(CLLocationCoordinate2D)coordinate completion:(SVGeocoderCompletionHandler)block {
@@ -105,22 +125,35 @@ - (SVGeocoder*)initWithAddress:(NSString*)address completion:(SVGeocoderCompleti
105125
}
106126

107127
- (SVGeocoder*)initWithAddress:(NSString *)address region:(CLRegion *)region completion:(SVGeocoderCompletionHandler)block {
108-
MKCoordinateRegion coordinateRegion = MKCoordinateRegionMakeWithDistance(region.center, region.radius, region.radius);
128+
NSString *bounds = [self createBoundsStringFromRegion:region];
129+
109130
NSMutableDictionary *parameters = [NSMutableDictionary dictionaryWithObjectsAndKeys:
110131
address, @"address",
111-
[NSString stringWithFormat:@"%f,%f|%f,%f",
112-
coordinateRegion.center.latitude-(coordinateRegion.span.latitudeDelta/2.0),
113-
coordinateRegion.center.longitude-(coordinateRegion.span.longitudeDelta/2.0),
114-
coordinateRegion.center.latitude+(coordinateRegion.span.latitudeDelta/2.0),
115-
coordinateRegion.center.longitude+(coordinateRegion.span.longitudeDelta/2.0)], @"bounds", nil];
132+
bounds, @"bounds", nil];
116133

117134
return [self initWithParameters:parameters completion:block];
118135
}
119136

120-
+ (void)setGoogleMapsAPIKey:(NSString *)key {
137+
- (SVGeocoder*)initWithAddress:(NSString *)address components:(NSDictionary *)components completion:(SVGeocoderCompletionHandler)block {
138+
NSString *componentsValue = [self createComponentsStringFromDictionary:components];
139+
140+
NSMutableDictionary *parameters = [NSMutableDictionary dictionaryWithObjectsAndKeys:
141+
address, @"address",
142+
componentsValue, @"components", nil];
143+
144+
return [self initWithParameters:parameters completion:block];
145+
}
121146

122-
googleMapsAPIKey = [key copy];
147+
- (SVGeocoder*)initWithAddress:(NSString *)address region:(CLRegion *)region components:(NSDictionary *)components completion:(SVGeocoderCompletionHandler)block {
148+
NSString *bounds = [self createBoundsStringFromRegion:region];
149+
NSString *componentsValue = [self createComponentsStringFromDictionary:components];
150+
151+
NSMutableDictionary *parameters = [NSMutableDictionary dictionaryWithObjectsAndKeys:
152+
address, @"address",
153+
bounds, @"bounds",
154+
componentsValue, @"components", nil];
123155

156+
return [self initWithParameters:parameters completion:block];
124157
}
125158

126159
#pragma mark - Private Utility Methods
@@ -173,10 +206,35 @@ - (void)setTimeoutTimer:(NSTimer *)newTimer {
173206
timeoutTimer = newTimer;
174207
}
175208

209+
- (NSString*)createComponentsStringFromDictionary:(NSDictionary *)components {
210+
NSMutableArray *preparedComponents = [NSMutableArray new];
211+
212+
[components enumerateKeysAndObjectsUsingBlock:^(NSString* key, NSString* value, BOOL *stop) {
213+
NSString *component = [NSString stringWithFormat:@"%@:%@", key, value];
214+
[preparedComponents addObject:component];
215+
}];
216+
217+
NSString *componentsValue = [preparedComponents componentsJoinedByString:@"|"];
218+
219+
return componentsValue;
220+
}
221+
222+
- (NSString*)createBoundsStringFromRegion:(CLRegion *)region {
223+
MKCoordinateRegion coordinateRegion = MKCoordinateRegionMakeWithDistance(region.center, region.radius, region.radius);
224+
225+
NSString *bounds = [NSString stringWithFormat:@"%f,%f|%f,%f",
226+
coordinateRegion.center.latitude-(coordinateRegion.span.latitudeDelta/2.0),
227+
coordinateRegion.center.longitude-(coordinateRegion.span.longitudeDelta/2.0),
228+
coordinateRegion.center.latitude+(coordinateRegion.span.latitudeDelta/2.0),
229+
coordinateRegion.center.longitude+(coordinateRegion.span.longitudeDelta/2.0)];
230+
231+
return bounds;
232+
}
233+
176234
#pragma mark - NSOperation methods
177235

178236
- (void)start {
179-
237+
180238
if(self.isCancelled) {
181239
[self finish];
182240
return;

0 commit comments

Comments
 (0)