Ближайшие данные о местоположении с пространственными данными - PullRequest
0 голосов
/ 14 марта 2019

Я прочитал все связанные вопросы к этой проблеме, но не смог найти решение.

Я сохранил координаты в mysql colum type point , в модели laravel я сохранил вот так

use Spatial;
protected $spatial = ['location'];

Чтобы получить координаты, я могу сделать это

$model->getCoordinates();

Но я хочу выбрать все эти записи на расстоянии 10 км, как я могу создать красноречивый запрос для этого?

Примечание: в моей таблице нет столбцов lat, lon, поэтому этот запрос не будет работать

$results = DB::select(DB::raw('SELECT id, ( 3959 * acos( cos( radians(' . $lat . ') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(' . $lng . ') ) + sin( radians(' . $lat .') ) * sin( radians(lat) ) ) ) AS distance FROM articles HAVING distance < ' . $distance . ' ORDER BY distance') );

Обновлено: я использовал laravel Voyager для сохранения местоположений на карте, здесь ссылка

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

$ model-> getCoordinates () возвращает массив координат. Вы можете сбросить это и проверить данные массива. Я думаю, что этот экспорт работает.

list($lat, $lng) = $model->getCoordinates();

Таким образом, вы можете иметь $ lat, $ lng переменных.

0 голосов
/ 14 марта 2019

Попробуйте, как это

$lon = 96.14344130;$lat = 16.86677920;$distance=10;

    MyNode::whereRaw(DB::raw( "(3959 * acos( cos( radians($lat) ) 
                     * cos( radians( ST_Y(geom) ) )  
                     * cos( radians( ST_X(geom) ) - radians($lon) ) 
                     + sin( radians($lat) ) 
                     * sin( radians( ST_Y(geom) ) ) ) ) < $distance "))
                     ->take(10)->get();
...