Разделить город на зоны — хорошая идея?

Я работаю над личным проектом на основе геолокации, где я хотел бы получить поставщиков на основе значения широты и долготы пользователя. И дело в том, что поставщики имеют переменный радиус поставки, немногие поставщики снабжают только в пределах 5 км от своего радиуса, а некоторые могут поставлять по всему городу.

Общий способ сделать это - для каждого поставщика рассчитать расстояние между поставщиком и пользователем. Если он меньше или равен радиусу предложения, отобразите этого поставщика в результатах.

Но это может быть очень медленно, поэтому я решил разделить город на четыре зоны (выбрать четыре значения широты и долготы из карт Google для северо-востока, запада, юга) и всякий раз, когда добавляется поставщик, я буду делать расчеты и назначать зоны, в которые они могут поставлять в базе данных. Теперь, когда я получаю широту и долготу пользователя, я определяю зону и выбираю поставщиков, которые могут поставлять в эту зону, выполняю расчет расстояния и отфильтровываю их. Таким образом, я делаю расчет на меньшее количество поставщиков, а не на весь список.

Но это хорошая идея или я могу сделать лучше?


person Mudassir Ali    schedule 05.07.2014    source источник
comment
Какую базу данных вы используете? Именно в этом преуспевают пространственные индексы, поскольку они являются двумерными (с использованием R-деревьев) и позволяют выполнять запросы внутри, содержит, пересекает, дистанционные запросы.   -  person John Powell    schedule 05.07.2014
comment
Я планирую использовать postgres   -  person Mudassir Ali    schedule 05.07.2014
comment
В этом случае просто используйте пространственный индекс, а затем используйте запросы типа ST_DWithin(geom1, geom2, Distance), см. postgis.net/docs/ST_DWithin.html   -  person John Powell    schedule 05.07.2014
comment
Это действительно здорово! Я думаю, что мне даже не нужно использовать геокодер, я могу просто выполнить соответствующий запрос SQL и получить результаты.   -  person Mudassir Ali    schedule 05.07.2014
comment
Я написал более полный ответ и добавил теги Postgres/Postgis к вашему вопросу: D   -  person John Powell    schedule 05.07.2014


Ответы (1)


Если вы используете Postgres/Postgis, вы можете использовать пространственные индексы, а затем используйте запросы типа ST_DWithin(geom1, geom2, Distance), см. ST_DWithin docs. Пространственный индекс разделит пространство за вас, что сделает такой запрос очень эффективным и избавит вас от необходимости придумывать какую-либо собственную схему пространственного разделения.

Другой оператор, который вы можете использовать, — это оператор ‹->, который очень эффективен с пространственным индексом и используется в предложении order by, чтобы получить y объектов, ближайших к некоторой точке x, (поиск k ближайших соседей) см. ‹-> документы оператора. Одно предостережение для правильной работы этого оператора с индексом, точка, которую вы ищете, должна быть постоянной, как это звучит в вашем случае.

person John Powell    schedule 05.07.2014
comment
Большое спасибо за ответ! - person Mudassir Ali; 05.07.2014