Я работаю над проблемой поиска всех клиентов в пределах стольких миль от конкретного lon/lat и возвращения списка этих клиентов в массиве. Теперь я довольно разбираюсь в формуле Хаверсина и старом способе делать это с границами в MySQL. Однако, обновляя до версии 5.6 MySQL, я теперь пытаюсь использовать функцию ST_WITHIN() для получения того же результата.ST_WITHIN() не возвращает никакого результата
Я следую учебник размещена здесь:
http://rutweb.com/using-the-new-spatial-functions-in-mysql-5-6-for-geo-enabled-applications/
Мой код до сих пор выглядит так:
$lat = 40.2808380;
$lon = -111.6573890;
$distance = $row['RadialMiles']; // radius of bounding circle in miles
$rlon1 = $lon - $distance/abs(cos(deg2rad($lat))*69);
$rlon2 = $lon + $distance/abs(cos(deg2rad($lat))*69);
$rlat1 = $lat - ($distance/69);
$rlat2 = $lat + ($distance/69);
$query = "SELECT astext(Position), Firstname, Lastname FROM Account
WHERE systemAccountID = '$systemAccountID'
AND st_within(Position, envelope(linestring(point(:rlon1, :rlat1), point(:rlon2, :rlat2))))";
try {
$stmt = $con->prepare($query);
$stmt->execute(array('rlon1' => $rlon1,'rlon2' => $rlon2,'rlat1' => $rlat1,'rlat2' => $rlat2));
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
throw $e;
}
print_r($result);
Сейчас массив производит пустой результат, когда я знаю, что это должен вернуть 2 результата.
FYI, вы можете просто предположить, что моя таблица имеет 3 столбца: имя, фамилия и положение. Позиция является точкой типа и содержит что-то вроде: POINT (38.8026085 -116.4193878)
Я работаю с этим весь день, и использование пространственных функций было ... разочаровывающим для меня. Любая помощь будет оценена по достоинству.
Возможно, вам необходимо, чтобы позиция была точечным типом данных. –
Если вы хотели удалить функцию astext() (у столбца уже есть точка как тип), я сделал это, и это не имело значения. –