Skip to content

Commit 780dc53

Browse files
committed
Merge pull request #27 from bananita/geocoder_components
implementation of component filtering
2 parents 0b0f6b1 + 13fde8f commit 780dc53

File tree

2 files changed

+75
-7
lines changed

2 files changed

+75
-7
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,
@@ -28,11 +34,16 @@ typedef void (^SVGeocoderCompletionHandler)(NSArray *placemarks, NSHTTPURLRespon
2834

2935
+ (SVGeocoder*)geocode:(NSString *)address completion:(SVGeocoderCompletionHandler)block;
3036
+ (SVGeocoder*)geocode:(NSString *)address region:(CLRegion *)region completion:(SVGeocoderCompletionHandler)block;
37+
+ (SVGeocoder*)geocode:(NSString *)address components:(NSDictionary *)components completion:(SVGeocoderCompletionHandler)block;
38+
+ (SVGeocoder*)geocode:(NSString *)address region:(CLRegion *)region components:(NSDictionary *)components completion:(SVGeocoderCompletionHandler)block;
3139

3240
+ (SVGeocoder*)reverseGeocode:(CLLocationCoordinate2D)coordinate completion:(SVGeocoderCompletionHandler)block;
3341

3442
- (SVGeocoder*)initWithAddress:(NSString *)address completion:(SVGeocoderCompletionHandler)block;
3543
- (SVGeocoder*)initWithAddress:(NSString *)address region:(CLRegion *)region completion:(SVGeocoderCompletionHandler)block;
44+
- (SVGeocoder*)initWithAddress:(NSString *)address components:(NSDictionary *)components completion:(SVGeocoderCompletionHandler)block;
45+
- (SVGeocoder*)initWithAddress:(NSString *)address region:(CLRegion *)region components:(NSDictionary *)components completion:(SVGeocoderCompletionHandler)block;
46+
3647

3748
- (SVGeocoder*)initWithCoordinate:(CLLocationCoordinate2D)coordinate completion:(SVGeocoderCompletionHandler)block;
3849

SVGeocoder/SVGeocoder.m

Lines changed: 64 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ - (SVGeocoder*)initWithParameters:(NSMutableDictionary*)parameters completion:(S
4343

4444
- (void)addParametersToRequest:(NSMutableDictionary*)parameters;
4545
- (void)finish;
46+
- (NSString*)createComponentsStringFromDictionary:(NSDictionary *)components;
47+
- (NSString*)createBoundsStringFromRegion:(CLRegion *)region;
4648

4749
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
4850
- (void)callCompletionBlockWithResponse:(id)response error:(NSError *)error;
@@ -79,6 +81,18 @@ + (SVGeocoder *)geocode:(NSString *)address region:(CLRegion *)region completion
7981
return geocoder;
8082
}
8183

84+
+ (SVGeocoder*)geocode:(NSString *)address components:(NSDictionary *)components completion:(SVGeocoderCompletionHandler)block {
85+
SVGeocoder *geocoder = [[self alloc] initWithAddress:address components:components completion:block];
86+
[geocoder start];
87+
return geocoder;
88+
}
89+
90+
+ (SVGeocoder*)geocode:(NSString *)address region:(CLRegion *)region components:(NSDictionary *)components completion:(SVGeocoderCompletionHandler)block {
91+
SVGeocoder *geocoder = [[self alloc] initWithAddress:address region:region components:components completion:block];
92+
[geocoder start];
93+
return geocoder;
94+
}
95+
8296
+ (SVGeocoder *)reverseGeocode:(CLLocationCoordinate2D)coordinate completion:(SVGeocoderCompletionHandler)block {
8397
SVGeocoder *geocoder = [[self alloc] initWithCoordinate:coordinate completion:block];
8498
[geocoder start];
@@ -104,18 +118,36 @@ - (SVGeocoder*)initWithAddress:(NSString*)address completion:(SVGeocoderCompleti
104118

105119

106120
- (SVGeocoder*)initWithAddress:(NSString *)address region:(CLRegion *)region completion:(SVGeocoderCompletionHandler)block {
107-
MKCoordinateRegion coordinateRegion = MKCoordinateRegionMakeWithDistance(region.center, region.radius, region.radius);
121+
NSString *bounds = [self createBoundsStringFromRegion:region];
122+
108123
NSMutableDictionary *parameters = [NSMutableDictionary dictionaryWithObjectsAndKeys:
109124
address, @"address",
110-
[NSString stringWithFormat:@"%f,%f|%f,%f",
111-
coordinateRegion.center.latitude-(coordinateRegion.span.latitudeDelta/2.0),
112-
coordinateRegion.center.longitude-(coordinateRegion.span.longitudeDelta/2.0),
113-
coordinateRegion.center.latitude+(coordinateRegion.span.latitudeDelta/2.0),
114-
coordinateRegion.center.longitude+(coordinateRegion.span.longitudeDelta/2.0)], @"bounds", nil];
125+
bounds, @"bounds", nil];
115126

116127
return [self initWithParameters:parameters completion:block];
117128
}
118129

130+
- (SVGeocoder*)initWithAddress:(NSString *)address components:(NSDictionary *)components completion:(SVGeocoderCompletionHandler)block {
131+
NSString *componentsValue = [self createComponentsStringFromDictionary:components];
132+
133+
NSMutableDictionary *parameters = [NSMutableDictionary dictionaryWithObjectsAndKeys:
134+
address, @"address",
135+
componentsValue, @"components", nil];
136+
137+
return [self initWithParameters:parameters completion:block];
138+
}
139+
140+
- (SVGeocoder*)initWithAddress:(NSString *)address region:(CLRegion *)region components:(NSDictionary *)components completion:(SVGeocoderCompletionHandler)block {
141+
NSString *bounds = [self createBoundsStringFromRegion:region];
142+
NSString *componentsValue = [self createComponentsStringFromDictionary:components];
143+
144+
NSMutableDictionary *parameters = [NSMutableDictionary dictionaryWithObjectsAndKeys:
145+
address, @"address",
146+
bounds, @"bounds",
147+
componentsValue, @"components", nil];
148+
149+
return [self initWithParameters:parameters completion:block];
150+
}
119151

120152
#pragma mark - Private Utility Methods
121153

@@ -162,10 +194,35 @@ - (void)setTimeoutTimer:(NSTimer *)newTimer {
162194
timeoutTimer = newTimer;
163195
}
164196

197+
- (NSString*)createComponentsStringFromDictionary:(NSDictionary *)components {
198+
NSMutableArray *preparedComponents = [NSMutableArray new];
199+
200+
[components enumerateKeysAndObjectsUsingBlock:^(NSString* key, NSString* value, BOOL *stop) {
201+
NSString *component = [NSString stringWithFormat:@"%@:%@", key, value];
202+
[preparedComponents addObject:component];
203+
}];
204+
205+
NSString *componentsValue = [preparedComponents componentsJoinedByString:@"|"];
206+
207+
return componentsValue;
208+
}
209+
210+
- (NSString*)createBoundsStringFromRegion:(CLRegion *)region {
211+
MKCoordinateRegion coordinateRegion = MKCoordinateRegionMakeWithDistance(region.center, region.radius, region.radius);
212+
213+
NSString *bounds = [NSString stringWithFormat:@"%f,%f|%f,%f",
214+
coordinateRegion.center.latitude-(coordinateRegion.span.latitudeDelta/2.0),
215+
coordinateRegion.center.longitude-(coordinateRegion.span.longitudeDelta/2.0),
216+
coordinateRegion.center.latitude+(coordinateRegion.span.latitudeDelta/2.0),
217+
coordinateRegion.center.longitude+(coordinateRegion.span.longitudeDelta/2.0)];
218+
219+
return bounds;
220+
}
221+
165222
#pragma mark - NSOperation methods
166223

167224
- (void)start {
168-
225+
169226
if(self.isCancelled) {
170227
[self finish];
171228
return;

0 commit comments

Comments
 (0)