Найдите почтовые индексы Великобритании, наиболее близкие к другим почтовым кодам Великобритании, сопоставив строку почтового индекса

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

У меня есть сценарий в моем приложении, где у меня есть несколько рабочих мест (от 1 до 50). У задания есть адрес, и у меня есть следующие свойства адреса: почтовый индекс, широта и долгота.

У меня есть таблица рабочих, и у них тоже есть адреса. В то время как задания или рабочие места создаются с помощью экранов, я использую запросы Google Map, чтобы убедиться, что предоставленный почтовый индекс действителен и находится в Великобритании, поэтому все адреса проверены.

Я использую элемент управления планировщика для отображения некоторых работников по оси Y и шкалы времени по оси X. Каждое задание имеет дату и может перемещаться в планировщике только вертикально на дату задания. Пользователь выбирает несколько заданий, и они отображаются в корзине рядом с планировщиком. Пользователь может затем перетащить работу против рабочих. Все это вручную, так что работает.

Моя задача состоит в том, чтобы автоматизировать это так, чтобы пользователь ничего не делал, кроме проверки и распределения заданий. Поэтому я должен автоматизировать процесс.

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

Теперь вот головная боль: у меня более 1500 рабочих. У меня есть служебная функция, которая использует Json Convert от Newtonsoft для десериализации потока ответа из Google Maps. Мне нужно кормить его Почтовые индексы A и B.

Я также планирую представить новую таблицу в БД для хранения результатов поиска в виде почтового индекса A, почтового индекса B и расстояния. Поэтому, если я обнаружу, что снова сравниваю те же самые почтовые индексы, я просто и медленно, и постепенно получу результат из БД, и мне больше не потребуется беспокоить Google, так как эта таблица будет очень полной.

Я не могу использовать простую формулу Haversine, так как путь Crow-fly здесь не мой. Беда в том, что на это уходит много времени. Некоторые работники могут проехать более 10 миль, а некоторые - от 15 до 80. Мне нужно выбрать первую работу из списка и запустить ее с каждым соответствующим работником системы! Мне было интересно, что почтовый индекс Великобритании имеет образец для этого. Если мы отсортируем список британских почтовых индексов, можем ли мы сделать приблизительную оценку по буквенно-цифровой схеме, где мы достигнем отметки 100 миль, отметки 200 миль и т. Д.?

Если кто-то заинтересован в коде, пожалуйста, напишите строку, и я вставлю его.

2 ответа

Вы хотите искать пространственный индекс или кривую заполнения пространства. Пространственный индекс сводит 2-мерную проблему к 1-мерной и рекурсивно разделяет поверхность на более мелкие фрагменты, но в основном это переупорядочение фрагментов. Поверхность можно разделить либо индексом, либо строкой, используя 4 символа. Последний может быть полезен для вас, потому что он позволяет вам запрашивать строку со всеми строковыми операциями, скрытыми в ядре базы данных. Вы хотите искать блог Ника пространственного индекса quadtree с гильбертовой кривой.

(Я работаю в Google, но я не говорю от имени Google. Я не имею никакого отношения к API карт.)

Я подозреваю, что это не очень хорошая ситуация для использования API Карт Google, просто потому, что вы проталкиваете так много данных. Вы действительно не хотите делать так много запросов, даже если вы могли бы делать это в рамках указаний.

Когда я занимался чем-то похожим на предыдущей работе, мы купили локально размещенный API -интерфейс карт, но даже этого было недостаточно для такой работы. В итоге мы предварительно вычислили время для перемещения от центра тяжести каждой "области" почтового индекса (возможно, неправильное название для нее, но за первой частью почтового индекса следует первая цифра остатка, например, "SW1W 9" для "SW1W 9TQ"). ") в любую другую область, сохраняя результат в гигантском столе. Я думаю, что мы сделали это только для почтовых индексов, которые находились в пределах 100 миль или чего-то подобного, чтобы сократить объем предварительной обработки.

Даже тогда простая БД работала не так быстро, как нам хотелось - поэтому мы хранили результаты в гигантском файле с одним байтом на пару источник / назначение. (У нас была фиксированная последовательность исходных и целевых почтовых индексов, поэтому нам не нужно было указывать их.) В этот момент вычисление времени в пути состояло из:

  • Отработать почтовые индексы (подстрока)
  • Найти индекс каждой области почтового индекса в последовательности
  • Проверьте, загрузили ли мы эту часть файла (мы лениво загружены для скорости запуска)
  • Загрузите строку, если необходимо, и просто получите к ней доступ в противном случае

Байты были по скользящей шкале точности, поэтому в течение первых 60 минут это было поминутно, затем каждое дополнительное значение означало дополнительные 2 минуты, затем 5 и т. Д. (Это не точные значения, но это было что-то подобное.)

Разобравшись с "хорошими кандидатами", вы, конечно же, можете попросить локальный API или API Карт Google о более точных указаниях для ваших точных почтовых индексов.

Другие вопросы по тегам