(см. Обновление со скриншотом в конце). Мне нужно запросить таблицу отелей в пределах 20 км / 50 км от текущего местоположения, и я хочу использовать ограничивающую рамку для фильтрации всех отелей, не входящих в этот диапазон, поэтому ниже метод моей ограничительной рамки:
public static double[] calculateBoundingBox(double aLat, double aLon, double distance, int units) {
double radius = 6378.1; // kilometer
// bearings
double dueNorth = 0.0;
double dueSouth = 180.0;
double dueEast = 90.0;
double dueWest = 270.0;
double aLatRad = aLat / DEGREES_TO_RADIANS;
double aLonRad = aLon / DEGREES_TO_RADIANS;
double northMost = Math.asin(Math.sin(aLatRad) * Math.cos(distance / radius) + Math.cos(aLatRad) * Math.sin(distance / radius) * Math.cos(dueNorth));
double southMost = Math.asin(Math.sin(aLatRad) * Math.cos(distance / radius) + Math.cos(aLatRad) * Math.sin(distance / radius) * Math.cos(dueSouth));
double eastMost = aLonRad + Math.atan2(Math.sin(dueEast)*Math.sin(distance / radius)*Math.cos(aLatRad),Math.cos(distance / radius)-Math.sin(aLatRad)*Math.sin(aLatRad));
double westMost = aLonRad + Math.atan2(Math.sin(dueWest)*Math.sin(distance / radius)*Math.cos(aLatRad),Math.cos(distance / radius)-Math.sin(aLatRad)*Math.sin(aLatRad));
northMost = Math.toDegrees(northMost);
southMost = Math.toDegrees(southMost);
eastMost = Math.toDegrees(eastMost);
westMost = Math.toDegrees(westMost);
double lat1 = 0.0, lat2 = 0.0;
double lon1 = 0.0, lon2 = 0.0;
// sort latitude and longitude for "BETWEEN" query
if (northMost > southMost) {
lat1 = southMost;
lat2 = northMost;
} else {
lat1 = northMost;
lat2 = southMost;
}
if (eastMost > westMost) {
lon1 = westMost;
lon2 = eastMost;
} else {
lon1 = eastMost;
lon2 = westMost;
}
Log.d("GEO", "Bounding Box: " + lat1 + "," + lon1 + " " + lat2 + "," + lon2);
return new double[]{lat1, lat2, lon1, lon2};
}
и предложение SQL где:
String selection = "(" + FIELD_NAME_HOTEL_POS_LATITUDE + " BETWEEN " + boundingBox[0] + " AND " + boundingBox[1] + ") AND ("
+ FIELD_NAME_HOTEL_POS_LONGITUDE + " BETWEEN " + boundingBox[2] + " AND " + boundingBox[3] + ")";
Но в результате было найдено меньше отелей в указанном диапазоне 20 км / 50 км, я не смог найти никаких проблем, может кто-нибудь взглянуть на мой код и указать мне правильное направление?
Большое спасибо!
EDIT:
Я обнаружил проблему, ниже приведено псевдоизображение для вычисленной ограничительной рамки:
географическая карта http://i53.tinypic.com/25ui6xl.png
Указаны четыре угла и мое местоположение, но я не могу понять проблему моего метода.