Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / выбор точек в определённом радиусе / 18 сообщений из 18, страница 1 из 1
29.09.2015, 14:54:16
    #39064247
Areostar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор точек в определённом радиусе
имеется таблица с координатами точек на гугловской карте. структура таблицы пока самая простая:
point_id, point_name, coordX, coordY

Надо выбирать точки находящиеся в заданном радиусе от заданной точки(координаты которой передаются)

алгоритм нахождения дистанции имеется. как то так:


p1 - центральная точка.
p2 - точка из таблицы.
R - радиус земли в метах = 6378137.
lat - координата x.
lng - координата y.
d - искомая величина.

dLat = rad(p2.lat - p1.lat);
dLong = rad(p2.lng - p1.lng);

a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.cos(rad(p1.lat())) * Math.cos(rad(p2.lat())) * Math.sin(dLong / 2) * Math.sin(dLong / 2);

c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
d = R * c;


вопрос:
что то мне подсказывает что пихать такие условия в простой запрос не есть гуд.

что скажите писать хранимку или всё же в запрос.

И вот ещё момент тут по любому придётся пробегать в сей таблице и каждую точку подставлять в алгоритм.

А если таблица раздуется до нескольких сот тысяч или миллионов точек. как изменить таблицу или что ещё что б поиск занимал более менее приемлемое время???
...
Рейтинг: 0 / 0
29.09.2015, 15:51:01
    #39064331
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор точек в определённом радиусе
Для начала выполните отбор по квадрату (что не попадает в него - не попадёт и во вписанную окружность):
WHERE p2.lat BETWEEN p1.lat-d AND p1.lat+d
AND p2.lng BETWEEN p1.lng-d AND p1.lng+d
Точек для проверки сразу станет намного меньше. И индексы могут использоваться.
А дальше подумайте - считать ли расстояние по прямой, или и так хватит...
...
Рейтинг: 0 / 0
29.09.2015, 15:53:13
    #39064334
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор точек в определённом радиусе
Для начала найдите точки в рамках нужного прямоугольника, а потом уже среди них будете фильтровать по расстоянию.
AreostarНадо выбирать точки находящиеся в заданном радиусе от заданной точки(координаты которой передаются) FAQ: Нахождение записей, где заданное значение находится между значениями полей
Areostarчто скажите писать хранимку или всё же в запрос.Хранимки не ускоряют выполнение запросов.

AreostarИ вот ещё момент тут по любому придётся пробегать в сей таблице и каждую точку подставлять в алгоритм.Если таблица в MyISAM, то не обязательно. См. ссылку выше.
...
Рейтинг: 0 / 0
29.09.2015, 20:25:31
    #39064655
Areostar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор точек в определённом радиусе
ну в принципе идея не плохая!

а на счёт того стоитли в коде писать запросы или лучше в храимку?
...
Рейтинг: 0 / 0
29.09.2015, 20:51:08
    #39064666
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор точек в определённом радиусе
Хранимка не может быть быстрее запроса в ней. А вот материализацию поиметь - это запросто.
...
Рейтинг: 0 / 0
29.09.2015, 22:12:49
    #39064700
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор точек в определённом радиусе
AkinaА вот материализацию поиметь - это запросто.материализация VIEW - это я понимаю, а хранимка-то как?
...
Рейтинг: 0 / 0
30.09.2015, 08:27:48
    #39064821
Areostar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор точек в определённом радиусе
miksoft,

Конюха это тоже идея неплохая.

Опыта в проектировании бдительности не так уж много вот и не допёр
...
Рейтинг: 0 / 0
30.09.2015, 08:31:32
    #39064824
Areostar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор точек в определённом радиусе
Я имел ввиду вьюха. Пишу с телефона а телефон со словарем всё сравнивает.


А объясните что такое материализация?
...
Рейтинг: 0 / 0
30.09.2015, 08:33:41
    #39064827
Areostar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор точек в определённом радиусе
Areostarmiksoft,

Конюха это тоже идея неплохая.

Опыта в проектировании бд


Чёрт как этот словарь вырубить
...
Рейтинг: 0 / 0
30.09.2015, 09:24:58
    #39064859
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор точек в определённом радиусе
Areostarчто такое материализация?Это когда некие (промежуточные) данные при обработке запроса/функции/процедуры/прочее не по(раз)мещаются в памяти (и неважно, по размеру или по иным причинам - вплоть до заложенной в обработку логики) и записываются на диск.

miksoftматериализация VIEW - это я понимаю, а хранимка-то как?
Мы сравниваем ХП и запрос, выполняющий одно и то же, верно?
В этом случае либо тот же запрос находится внутри ХП (какая разница тогда?), либо вместо запроса внутри ХП используется итерация "на ручной тяге". Если итерации используют дополнительные статические таблицы или промежуточную модификацию основных таблиц - то вот и материализация.
...
Рейтинг: 0 / 0
30.09.2015, 09:29:03
    #39064863
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор точек в определённом радиусе
AreostarА объясните что такое материализация?Это когда промежуточный результат выполнения SQL запроса внутри MySQL помещается во временную таблицу. Это может потребовать дополнительного дискового ввода/вывода и у этой таблицы не будет индексов, что может существенно замедлить выполнение всего запроса.
Применительно к VIEW можно почитать тут .
...
Рейтинг: 0 / 0
30.09.2015, 09:40:27
    #39064877
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор точек в определённом радиусе
AkinaМы сравниваем ХП и запрос, выполняющий одно и то же, верно?
Не совсем, потенциально у нас три варианта:
1) Запрос выполняется клиентским кодом, вся дальнейшая обработка происходит на клиенте.
2) Запрос обернут в ХП, ХП вызывается клиентским кодом и возвращает результат запроса в виде набора записей, итерация по результату происходит на клиенте.
3) Запрос находится внутри ХП, обработка и итерация по результату тоже происходит в ХП. На клиента отдается только общий итог работы или ошибка.

1 и 3 случаи принципиально не отличаются и, если и создают какие-то временные таблицы, то лишь в силу алгоритма обработки результата запроса, т.е. явно.
Т.е. материализация не есть свойство самой хранимки.

Насчет 2 случая точно не знаю, но нигде не встречал упоминания, что там может происходить материализация.
Хотя, зная общую ситуацию в MySQL, не удивлюсь.
...
Рейтинг: 0 / 0
30.09.2015, 09:58:12
    #39064896
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор точек в определённом радиусе
miksoftматериализация не есть свойство самой хранимки.
Несомненно. Материализация есть разновидность способов накопления данных, коих по большому счёту всего-то два (или оперативка, или диск). И разделять тут накопление промежуточных и выходных данных я как-то не вижу смысла.

miksoft2) Запрос обернут в ХП, ХП вызывается клиентским кодом и возвращает результат запроса в виде набора записей, итерация по результату происходит на клиенте.
...
Насчет 2 случая точно не знаю, но нигде не встречал упоминания, что там может происходить материализация.
ХП тупо выливает результаты запроса в некий выходной поток, который и отдаётся клиенту. Причём клиенту он отдаётся не в момент образования в нём данных, не сразу, а когда клиент собсно попросит. Где же быть данным в этом интервале времени? в памяти? расточительно, особенно если вывод пухлый, а клиент (и/или канал до него) тормозной. Только на диск, обычная практика.
...
Рейтинг: 0 / 0
30.09.2015, 11:30:56
    #39064995
Areostar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор точек в определённом радиусе
Всем спасибо за ответы.
...
Рейтинг: 0 / 0
09.10.2015, 15:25:06
    #39073034
Areostar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор точек в определённом радиусе
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
var getDistance = function(p1, p2) {
  var R = 6378137; // Earth’s mean radius in meter
  var dLat = rad(p2.lat() - p1.lat());
  var dLong = rad(p2.lng() - p1.lng());
  var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
    Math.cos(rad(p1.lat())) * Math.cos(rad(p2.lat())) *
    Math.sin(dLong / 2) * Math.sin(dLong / 2);
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  var d = R * c;
  return d; // returns the distance in meter
};



пытаюсь переписать в условие для sql запроса. Получилось так:

Код: php
1.
2.
3.
4.
$formula = $radius." * (2 * ATAN2(SQRT(POW(SIN(RADIANS(`coor_x` - ".$main_lat.")), 2) +
					COS(RADIANS(".$main_lat.")) * COS(RADIANS(`coor_x`)) * POW(SIN(RADIANS(`coor_y` - ".$main_lgn.") / 2), 2),
                    SQRT(1 - POW(SIN(RADIANS(`coor_x` - ".$main_lat.")), 2)) + 
					COS(RADIANS(".$main_lat.")) * COS(RADIANS(`coor_x`)) * POW(SIN(RADIANS(`coor_y` - ".$main_lgn.") / 2), 2))))";



$main_lat - х координата заданной точки. $main_lgn - y координата заданной точки
coor_x, coor_y - координаты точек из таблицы

подставляю в запрос

Код: php
1.
$sth = $dbh->prepare("SELECT `point_id`, `point_name`, `coor_x`, `coor_y` FROM `points_table`   WHERE (".$formula.") < 1000");



запускаю. выполняется но возвращает пустой запрос. где я ошибся??
...
Рейтинг: 0 / 0
09.10.2015, 16:26:04
    #39073119
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор точек в определённом радиусе
Areostar,

Отлаживать нужно. Найдите точку, которая гарантированно подходит. Последовательно вычисляйте фрагменты выражения для ее координат. Да и вообще посмотрите, а какое расстояние получается до этой точки от искомых координат.
...
Рейтинг: 0 / 0
09.10.2015, 19:13:27
    #39073273
Areostar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор точек в определённом радиусе
miksoft,

Ясно!
...
Рейтинг: 0 / 0
09.10.2015, 21:14:19
    #39073321
Areostar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор точек в определённом радиусе
проблему решил. одну из скобок закрывал не там где надо )
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / выбор точек в определённом радиусе / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]