@@ -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