Это можно сделать довольно просто. Если вы округляетесь до сетки, то широта изменяется на постоянную величину во всех точках планеты. Долгота меняется в зависимости от того, как далеко вы находитесь от экватора.
Следующий код привязывает широту и долготу к произвольному размеру сетки
double EARTH_RADIUS_KM = 6371;
double GRID_SIZE_KM = 1.6; // <----- Our grid size in km..
double DEGREES_LAT_GRID = Math.toDegrees(GRID_SIZE_KM / EARTH_RADIUS_KM);
// ^^^^^^ This is constant for a given grid size.
public Location snapToGrid(Location myLoc) {
double cos = Math.cos(Math.toRadians(myLoc.latitude));
double degreesLonGrid = DEGREES_LAT_GRID / cos;
return new Location (
Math.round(myLoc.longitude / degreesLonGrid) * degreesLonGrid,
Math.round(myLoc.latitude / DEGREES_LAT_GRID) * DEGREES_LAT_GRID);
}
Обратите внимание, что это потерпит неудачу в случае, когда вы находитесь на полюсе (когда функция cos приближается к нулю). В зависимости от размера вашей сетки результаты становятся непредсказуемыми, когда вы приближаетесь к широте +/- 90 градусов. Обработка этого упражнения оставлена читателю:)