@@ -272,23 +272,23 @@ pub fn recover_nearest(_code: &str, ref_pt: Point<f64>) -> Result<String, String
272
272
273
273
let code_area = decode ( code. as_str ( ) ) . unwrap ( ) ;
274
274
275
- let area_range = compute_latitude_precision ( prefix_len) ;
276
- let area_edge = area_range / 2f64 ;
275
+ let resolution = compute_latitude_precision ( prefix_len) ;
276
+ let half_res = resolution / 2f64 ;
277
277
278
278
let mut latitude = code_area. center . lat ( ) ;
279
279
let mut longitude = code_area. center . lng ( ) ;
280
280
281
- let latitude_diff = latitude - clip_latitude ( ref_pt. lat ( ) ) ;
282
- if latitude_diff > area_edge {
283
- latitude -= area_range;
284
- } else if latitude_diff < -area_edge {
285
- latitude += area_range;
281
+ let ref_lat = clip_latitude ( ref_pt. lat ( ) ) ;
282
+ let ref_lng = normalize_longitude ( ref_pt. lng ( ) ) ;
283
+ if ref_lat + half_res < latitude && latitude - resolution >= -LATITUDE_MAX {
284
+ latitude -= resolution;
285
+ } else if ref_lat - half_res > latitude && latitude + resolution <= LATITUDE_MAX {
286
+ latitude += resolution;
286
287
}
287
- let longitude_diff = longitude - normalize_longitude ( ref_pt. lng ( ) ) ;
288
- if longitude_diff > area_edge {
289
- longitude -= area_range;
290
- } else if longitude_diff < -area_edge {
291
- longitude += area_range;
288
+ if ref_lng + half_res < longitude {
289
+ longitude -= resolution;
290
+ } else if ref_lng - half_res > longitude {
291
+ longitude += resolution;
292
292
}
293
293
Ok ( encode ( Point :: new ( longitude, latitude) , code_area. code_length ) )
294
294
}
0 commit comments