- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу

В 2023 году Google заблокировал более 170 млн фальшивых отзывов на Картах
Это на 45% больше, чем в 2022 году
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Нужно выбирать ближайшие объекты по заданным координатам из базы (100к записей).
Особая точность не нужна, можно выбирать из прямоугольника с диагональю двойного растояния поиска (на окружность ресурсы тратить не стоит)
Лучшее что удалось найти: это
Там предлагает два варианта:
1. использовать процедуру, которая, ограничивает прямоугольник поиска и выбирает between координат.
2. использовать spatial функции, которые по своей сути делают тоже самое.
Т.е. выбрать объекты вроде как не состовляет сложности, но если в квадрате будет их много (скажем 10к) мне кажется будет долго order by distance..
У кого есть опыт?
Ничего долгого, если у вас место по сути не ограничено. Создайте кэш для каждого объекта и не нужно каждый раз делать поиск.
Создайте кэш для каждого объекта и не нужно каждый раз делать поиск.
А что кэшировать? distance-то от объекта до произвольной координаты изменяется..
мне кажется будет долго order by distance
Если действительно будет - тогда думать..
Если не критичны незначительные ошибки при сортировке, можно другой, менее ресурсоёмкой метрикой пользоваться.. (к примеру, |x1-x2|+|y1-y2|)
В свое время сталкивался с похожей задачей когда нужно было выводить обьекты недвижимости на Яндекс картах.
Определяли местоположение объекта
longitude – float
$leftx , $lefty - левый нижний угол
$rightx, $righty – правый верхний угол
Зная точку вокруг которой нужно искать очень легко в пхп построчить верхний и нижний угол
дальше на основе этих данных строился SQL запрос
Запрос очень простой БАЗА была MySQL записей ~ 1M, но в выборке участвовали максимум 100 тыщ. Естественно latitude, longitude добавили в индекс, так как это числа то запрос довольно быстро отрабатывал и не создавал нагрузку.(тупо в лоб, без красивостей - но оно работало!!!!)
Самый геморрой начался когда выбиралась область а в ней от 5 до 30 тысяч объектов . А на карту одновременно мы выводили не более 500 объектов. Вариант когда тупо стоит LIMIT 0,500; отмели сразу. Задача стояла выводить рендомно каждый раз объекты для это области т.е чтобы не было такого что показываются одни и те же 500 последних. Пробовали order by RAND() LIMIT 0,500 -- запрос начал жрать кучу ресурсов и тормозить.
В итоге сделали костыльное решение во все записи добавили 10 новых полей RAND1, RAND….RAND10. Все эти поля заполнялись при вставке записи в базу каждое поле получало свое рендомное значение от 1 до 1000. А когда в пхп строился запрос на выборку то случайным образом выбиралось 1 поле из 10 по которому будут сортироваться этот раз записи. Решение конечно довольно колхозное – но стабильно работало. И когда единицей поиска был целый город разные люди при заходах получали разные наборы выборок.
Использую комбинированный вариант.
1) Выделение максимальных/минимальных координат на нужном расстоянии от заданной точки и фильтр всех точек, которые попадают в эту область.
2) Среди них уже расчет точного расстояния до начальной точки и сортировка по этому значению.
Проблем с производительностью замечено не было. У меня в этот прямоугольник обычно может попадать до 2к точек пока. Работающий пример
Для первого этапа граничные значения расчитываются вот так:
Дальше эти значения просто в WHERE добавляются в запрос. С использованием ORM у меня так, но думаю, смысл понятен:
Использую встроенную процедуру для определения расстояния на втором этапе. По результату и делаю сортировку.
Пример расчета расстояния от точки А с координатами lat1, lon1 до точки B c координатами lat2 : GetDistance(lat1,lon1,lat2,lon2);
Если что-то не понятно описал, обращайтесь, расскажу.