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