Что не так с моим ограничивающим прямоугольником Geo и запросом выбора SQL? - PullRequest
1 голос
/ 07 июня 2011

(см. Обновление со скриншотом в конце). Мне нужно запросить таблицу отелей в пределах 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

Указаны четыре угла и мое местоположение, но я не могу понять проблему моего метода.

...