#ruby-on-rails #algorithm
#ruby-on-rails #алгоритм
Вопрос:
Вот что у меня есть
- Данные о населении, агрегированные по почтовому индексу, заданному переписью населения США.
Вот что я делаю прямо сейчас:
- Обратный географический код центральной точки, чтобы найти почтовый индекс центральной точки.
- Свяжите длину широты с каждым почтовым индексом (при обратном геокодировании я знаю, что это может привести к ошибкам).
- Найдите широты (почтовые индексы), которые находятся внутри круга, используя плагин Geokit-Rails.
- Нахождение суммы данных для этих почтовых индексов (почтовый индекс = почтовый индекс центральной точки или расстояние (между широтой почтового индекса и центральной точкой) < радиус) и отображение.
Правильно ли я это делаю? Существуют ли методы, более эффективные, чем это, для поиска совокупности? Есть ли какой-либо алгоритм уже доступен?
Я использую плагин geokit-rails для обратного геокодирования и для поиска почтовых индексов (с соответствующими широтами) внутри круга.
Комментарии:
1. На первый взгляд кажется, что вы на правильном пути. Считаете ли вы, что есть что-то очевидное для оптимизации, или вы ищете какие-либо улучшения в частности? Я не могу представить, что есть более быстрый способ получить данные из базы данных, если не считать самостоятельного написания SQL-запроса, и вы, вероятно, в конечном итоге напишете тот же запрос, что и geokit. Похоже, ваш поиск исходного почтового индекса довольно прост. Я не знаю лучших источников данных.
2. Я предлагаю использовать API карт Google, чтобы получить значения широты и длины для каждого почтового индекса, а не вычислять его. Вот скрипт ruby, который я использовал для вычисления 5 ближайших значений lat и long для каждого из них. По сути, это было сделано для связывания 5 ближайших городов в нашем списке для каждого города: gist.github.com/1321520 . Первые два метода должны вам немного помочь. Возвращает расстояние в километрах. Поэтому преобразуйте его в мили, чтобы проверить, меньше ли оно 100. Вот статья, объясняющая формулу: movable-type.co.uk/scripts/latlong.html
3. @agmcleod.. Я использую плагин geokit-rails, чтобы получить широту для каждого почтового индекса. Я считаю, что плагин geokit-rails внутренне использует Google map API (но Google maps API имеет некоторые ограничения на количество конверсий для пользователя в день, поэтому он использует другие источники данных также в случае, если Google map API не используется).доступно).. Я настроил базу данных со всеми почтовыми индексами и их соответствующей широтой, найденной из плагина geokit-rails. Это моя первоначальная настройка. Итак, я не вычисляю его, он уже есть в базе данных.
4. @muffinista.. Проблема с этой настройкой заключается в том, что почтовые индексы не могут быть фактически представлены широтой, это область. Итак, я не уверен, что пара lat-long, заданная Google Map API, на самом деле находится в центре почтового индекса или что-то в этом роде. Кроме того, для радиуса от 0 до радиуса почти 2,4 мили население остается неизменным при этой настройке. То есть даже для радиуса 0,1 мили он покажет все население почтового индекса. Я ищу способ приблизить это..
5. @muffinista .. но с моими данными я не смогу этого сделать, поскольку я не знаю географического местоположения почтового индекса code.so , я ищу лучшие варианты. Я не ищу оптимизации своего запроса или времени ответа. Я просто ищу лучшие варианты.
Ответ №1:
Не совсем решение, но я думаю, что часть вашей проблемы заключается в концепции самого вашего алгоритма.
Вы пытаетесь получить информацию, которую ваши данные не могут дать вам точно, потому что ее детализация (масштаб) не адаптирована. В этом случае вы используете точку центроида, которая обозначает область, но, конечно, не является точным представлением пространственного распределения населения. Это все равно, что пытаться измерить миллиметры линейкой, на которой есть только сантиметровые отметки…
Одна вещь, которую вы можете сделать, чтобы приблизить pop. заключается в создании регулярной сетки точек, которая интерполирует ваши данные о населении с более высокой степенью детализации (каждая точка сетки получит свою долю от своего населения ZIP area). Это совершенно другой вопрос, связанный с ГИС, поэтому я бы посоветовал вам обратиться за помощью к сообществу gis.stackexchange.