Haversine Fomula с MySQL получает близлежащие местоположения

Я пытаюсь использовать формулу гаверсинуса в моем PHP/MySQL, чтобы получить близлежащие места туда, где я нахожусь.

Я использую AJAX, чтобы получить только близлежащие маркеры на моей карте Google.

Я знаю, что мой запрос ничего не возвращает.

Я знаю, что есть место на расстоянии, куда я смотрю.

По сути, что не так с моим кодом, использующим формулу гаверсинуса?

РЕДАКТИРОВАТЬ - изменена тонна, чтобы следовать учебнику из здесь. Ошибка все та же.

PHP

$lati = 40.78405877579076;
$longi = -73.94800172194275;

class RadiusCheck
{
    var $maxLat;
    var $minLat;
    var $maxLong;
    var $minLong;

    function RadiusCheck($Latitude, $Longitude, $Miles)
    {
        global $maxLat,$minLat,$maxLong,$minLong;
        $EQUATOR_LAT_MILE = 69.172;
        $maxLat = $Latitude + $Miles / $EQUATOR_LAT_MILE;
        $minLat = $Latitude - ($maxLat - $Latitude);
        $maxLong = $Longitude + $Miles / (cos($minLat * M_PI / 180) * $EQUATOR_LAT_MILE);
        $minLong = $Longitude - ($maxLong - $Longitude);
    }

    function MaxLatitude()
    {
        return $GLOBALS["maxLat"];
    }
    function MinLatitude()
    {
        return $GLOBALS["minLat"];
    }
    function MaxLongitude()
    {
        return $GLOBALS["maxLong"];
    }
    function MinLongitude()
    {
        return $GLOBALS["minLong"];
    }
}

class DistanceCheck
{
    function DistanceCheck()
    {

    }

    function Calculate($dblLat1, $dblLong1, $dblLat2, $dblLong2)
    {
        $EARTH_RADIUS_MILES = 3963;
        $dist = 0;

        //convert degrees to radians
        $dblLat1 = $dblLat1 * M_PI / 180;
        $dblLong1 = $dblLong1 * M_PI / 180;
        $dblLat2 = $dblLat2 * M_PI / 180;
        $dblLong2 = $dblLong2 * M_PI / 180;

        if ($dblLat1 != $dblLat2 || $dblLong1 != $dblLong2)
        {
            //the two points are not the same
            $dist = sin($dblLat1) * sin($dblLat2) + cos($dblLat1) * cos($dblLat2) * cos($dblLong2 - $dblLong1);
            $dist = $EARTH_RADIUS_MILES * (-1 * atan($dist / sqrt(1 - $dist * $dist)) + M_PI / 2);
        }

        return $dist;
    }
}

// set a default number of miles to search within
$Miles = '2';

// set the user's latitude and longitude as the one to search against
$Latitude = $lati;
$Longitude = $longi;

$zcdRadius = new RadiusCheck($Latitude,$Longitude,$Miles);
$minLat = $zcdRadius->MinLatitude();
$maxLat = $zcdRadius->MaxLatitude();
$minLong = $zcdRadius->MinLongitude();
$maxLong = $zcdRadius->MaxLongitude();

$sql = "SELECT `uname`, `it`, `name`, SQRT((((69.1*(latitude-$Latitude))*(69.1*(latitude-$Latitude)))+((53*(longitude-$Longitude))*(53*(longitude-$Longitude))))) AS calc FROM stores WHERE latitude >= '$minLat' AND latitude <= '$maxLat' AND longitude >= '$minLong' AND longitude <= '$maxLong'";

$get_data = mysqli_query($conn, $sql);

while($row = mysqli_fetch_assoc($get_data))
{
    // calculate the number of miles away the result is
    $zcdDistance = new DistanceCheck;
    $Distance = $zcdDistance->Calculate($Latitude, $Longitude, $row['latitude'], $row['longitude']);

    $lat = $row['lat'];
    $lon = $row['lon'];
    $name = $row['name'];
    $it = $row['it'];
    $uname = $row['uname'];

    $data["markers"][] = array
    (
        "latitude" => $lat,
        "longitude" => $lon,
        "name" => $name,
        "it" => $it,
        "uname" => $uname
    );
}
echo json_encode($data);

Ошибка

<b>Warning</b>:  mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given ... null

person copilot0910    schedule 30.06.2013    source источник
comment
Этот вопрос кажется не по теме, поскольку код работает нормально, а ОП просто забыл изменить имена таблиц/столбцов.   -  person HamZa    schedule 30.06.2013
comment
Сначала это было не так, но кажется, что OP больше заинтересован в поиске рабочего кода, чем в попытках понять, что он делает :( Кстати, хороший учебник, вводит класс с методами для возврата глобальных переменных: D   -  person dev-null-dweller    schedule 30.06.2013
comment
Я хотел спросить, что не так с кодом. Я закончил тем, что изменил несколько вещей из tut, но все еще имел некоторые проблемы. Да, конечный результат был глупой ошибкой, но @dev-null-dweller прав, ссылка, по которой я перешел, помогла мне узнать о классах и глобальных переменных.   -  person copilot0910    schedule 01.07.2013
comment
Какая ссылка помогла вам узнать о занятиях? Если вы имеете в виду тот, который вы разместили (snipe.net), то мне очень жаль, но мой комментарий был саркастическим. Использование класса в этом руководстве неправильно, бессмысленно, и, конечно же, вам не следует пытаться узнать из него о классах и ООП.   -  person dev-null-dweller    schedule 01.07.2013
comment
@dev-null-dweller Я имел в виду snipe.net. Где лучшая ссылка, чтобы узнать о классах и других методах ООП?   -  person copilot0910    schedule 01.07.2013
comment
Начните с источника: php.net/manual/en/language.oop5.php   -  person dev-null-dweller    schedule 01.07.2013


Ответы (2)


У вас ошибка в sql. Вы должны проверить $result, прежде чем передать его mysqli_fetch_assoc.

Проблема в отсутствии одного оператора или несовпадении скобок: cos()radians(lon)

person dev-null-dweller    schedule 30.06.2013

Ух ты. Я идиот.

Рассматриваемый код работает отлично. Я просто использовал неправильное имя таблицы и имена столбцов для SELECT

Надеюсь, что это полезно для будущих людей, которые нуждаются в помощи.

person copilot0910    schedule 30.06.2013
comment
Вы должны принять этот ответ, когда сможете. - person Madara's Ghost; 30.06.2013