@Holyboom
junior fullstack

Алгоритм получения квадрата по координатам?

Суть вопроса в чем , у нас есть массив точек координат(маршрут пользователя в формате Point(lat, lng)), и нужно забрать из бд сохраненные точки которые лежат недалеко от нашего маршрута (условно 100м).

в бд точки имеют поля (lat,lng, name...).

Забрать точки недалеко от одной не проблема делал так(
"SELECT
                   *,
                    (
                    6371 *
                    acos(cos(radians($lat)) *
                    cos(radians(dots.lat)) *
                    cos(radians(dots.lng) -
                    radians($lng)) +
                    sin(radians($lat)) *
                    sin(radians(dots.lat)))
                    ) AS distance,
                    FROM dots
                    HAVING distance < 0.1
                    ORDER BY distance LIMIT 0, 20

;"

)

но в стал вопрос как забрать много точек сразу одним запросом?

единственное что пришло пока что в голову , это делать выборку по квадрату
613b461508f2c930594979.png
кр точки - точки нашего маршрута
зел точки - нужные из бд
прямоугольник собственно область выборки

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

только вопрос как определить углы квадрата для выборки и как написать саму выборку?
или может есть какой-то способ эффективнее и точнее ?
буду благодарен любой помощи
  • Вопрос задан
  • 266 просмотров
Решения вопроса 1
@Holyboom Автор вопроса
junior fullstack
Сергей Соколов, короче , вроде сделал))
SET @home = ST_GeomFromText('LINESTRING(
//Список наших точек через которые идет маршрут 
53.862263 27.483486,
53.871521 27.493636,
53.875594 27.496447,
53.880938 27.500744,
53.882699 27.505121,
53.884246 27.504435,
53.891446 27.500293,
53.896630 27.497375,
53.905348 27.496302,
53.912531 27.495487,
53.918726 27.496882)');
SELECT *, ST_AsText(geo) as Coord,
    // Дистанция считается странно получается вроде правильно , но не уверен насчет точности . 
   // В оригинале в доках написано умножать ее на .001 для км и .00067... для миль
   // но у меня так не работало и показывало до объекта 0,003км хотя по факту до него 300м вот я решил 
         умножать ее на 100 (хотя хз может оно там сантиметрах считает) 
    ST_DISTANCE(@home, geo) * 100 AS dist
    FROM dots
   // дистанция от маршрута в радиусе которой нам нужны точки (в км ) 
    HAVING dist < 1
    ORDER BY dist
    LIMIT 30


и в итоге будет примерно так
613cb908956cd964506159.png

вернет зеленые точки , а красные нет .

вроде так )
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Vindicar
Я бы обрабатывал отрезки (пары точек), и использовал формулу расстояния от точки до прямой плюс проекцию точки на прямую, чтобы понять, где точка находится - рядом с серединой отрезка или рядом с концами.
Ответ написан
sergiks
@sergiks Куратор тега PHP
♬♬
Не хотите использовать возможности MySQL по работе с пространственными данными? См. список функций.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы