PHP: Какой математически эффективный способ найти «подсеть» большей сетки? - PullRequest
0 голосов
/ 31 августа 2009

Я пытаюсь найти эффективный способ найти часть большой сетки. В настоящее время я перебираю строки, чтобы определить FROM-TO выбор идентификаторов в этой строке, но это не правильно ...

Допустим, у меня есть сетка полей 200х200 (х от 1 до 200, у от 1 до 200). Каждое поле также имеет уникальный идентификатор, начиная с X1, Y1 (fieldid = 1) до X200, Y200 (fieldid = 40000).

У меня есть часть сетки, которую мне нужно выбрать из базы данных (на основе диапазонов XY или уникальных идентификаторов, где уникальные идентификаторы намного быстрее, поэтому предпочтительнее). Подпорция определяется верхним левым полем (опять же на основе значения XY или уникального идентификатора), а затем 16 полями в ширину и 9 полями в высоту.

Итак, как эффективно выбрать подсетку из 144 полей (16x9) большой сетки из 40000 полей (200x200) на основе уникального идентификатора или значения XY поля верхнего левого угла в подсетке 16x9?

Ответы [ 2 ]

1 голос
/ 31 августа 2009

Я обнаружил, что расширение геометрии в MySQL довольно хорошо оптимизировано. Поэтому наиболее эффективным способом было бы добавить в таблицу столбец типа POINT, содержащий позицию в матрице.

ALTER TABLE YourTable ADD COLUMN pos POINT NOT NULL;

Затем вы можете выбрать, используя функции расширения (Пример выбора области 16x9, начиная с координат 10/10):

SET @polygon = GeomFromText('Polygon((10 10, 26 10, 26 19, 10 19, 10 10))');
SELECT * FROM YourTable WHERE MBRContains(@polygon, pos);
1 голос
/ 31 августа 2009

Не слишком уверен, если я понимаю проблему, которую вы пытаетесь преодолеть, некоторый контекст, вероятно, поможет ... в любом случае, здесь идет ...

x1 -> x2 = 16 пробелов y1 -> y2 = 9 пробелов

x1 * y1 = идентификатор начала

x2 * y2 = идентификатор конца

у вас будет девять диапазонов (где 'a' - допустимый диапазон):

x1*y1 < a < (x1*y1)+16
x1*(y1+1) < a < (x1*(y1+1))+16
x1*(y1+2) < a < (x1*(y1+2))+16
....
x1*(y1+8) < a < (x1*(y1+8))+16
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...