У меня есть база данных, содержащая заказы, и каждый порядок имеет связанное расположение. Currentl, когда пользователь зарегистрирован, я использую Карты Bing API, чтобы геокодировать каждое местоположение порядка и затем вычислить проезжающее расстояние зарегистрированному пользователю. На основе этих расстояний пользователь через dropdownbox может затем указать максимальные расстояния с результатами, отображенными в gridview. Однако больше чем с 100 заказами процесс становится крайне медленным. Я ценил бы некоторые подсказки относительно оптимизации любого запросы резкого звука, возможно кэширование результатов (таким образом, они могут быть снова использованы, не повторно получая доступ к API карт резкого звука), или используя Ajax к так или иначе фоновому процессу заказы.Спасибо.
Что вы, вероятно, захотите сделать, так это создать минимальное связующее дерево, предполагая, что у вас есть то же место назначения для пользователя. MST по-прежнему O (V ^ 2), но вы эффективно кэшируете многие из кратчайших путей, поскольку многие из них будут повторно использовать одни и те же дороги.
Другой вариант - сначала оценить, используя линейные расстояния вместо миль дороги, но все зависит от того, что вы отправляете обратно пользователю.
Удачи!
Я планирую сделать что-то подобное в самом ближайшем будущем, поэтому у меня есть несколько предложений, но пока нет кода, которым можно поделиться. Надеюсь, это будет полезно.
Я планирую хранить широту и долготу для каждого элемента в своей базе данных (поэтому геокодируется только один раз). Чтобы выбрать элементы на определенном расстоянии от точки, я вычисляю числа широты и долготы, которые составляют «x» миль к северу / югу / востоку / западу от моей центральной точки. Затем выбор превращается в простой вопрос выбора записей, где значения широты и долготы находятся между значениями моего квадрата.
И да, я знаю, что технически я должен использовать круг, чтобы точно контролировать расстояние, но это намного проще и быстрее. Если вам действительно нужно использовать круг для более точного ограничения, сначала используйте этот метод, а затем используйте более сложные вычисления, чтобы отсеять элементы за пределами круга в углах.
Я не знаком с лицензированием Bing, но если я правильно помню о Google, вам нужна платная (коммерческая) лицензия для хранения результатов геокодирования. И это недешево. Так что это может свести на нет ценность, которую могло иметь мое предложение: (
Изменить; я просто прочитал вопрос немного внимательнее и вижу, что он говорит о километрах, а не о линейных милях. Итак, мой ответ не действительно применимо, если вы не хотите использовать его как способ сузить количество вычислений расстояния, которое вам нужно сделать.
Кроме того, по вопросу геокодирования и лицензий вы можете посмотреть geocoder.us , что довольно дешево.