У меня есть следующая таблица таблиц MYSQL, которая содержит записи с их широтой и долготой:
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| user | varchar(128) | NO | | NULL | |
| content | varchar(512) | NO | | NULL | |
| timestamp | varchar(128) | NO | | NULL | |
| longtitude | double | NO | | NULL | |
| latitude | double | NO | | NULL | |
+------------+--------------+------+-----+---------+----------------+
С драгоценным камнем geocoder
я могу использовать метод для определения расстояния между двумя длинными координатами lat.
find the distance between two arbitrary points
Geocoder::Calculations.distance_between([47.858205,2.294359], [40.748433,-73.985655])
=> 3619.77359999382 # in configured units (default miles)
Я хотел бы получить набор записей из таблицы. Я знаю, что могу получить партии из 10 записей, отсортированные по времени, используя следующий запрос:
record = Post.order(:timestamp).offset(10 * @var.to_i).first(10)
Как я могу изменить этот запрос, чтобы получить все сообщения в определенном радиусе? Т.е. отображаются только сообщения, которые имеют координаты в пределах 5 км от текущего местоположения пользователя?
Я использую Sinatra вместо Rails, если это имеет значение.
Вы можете использовать метод near
предоставляемый геокодером:
Post.near([lat, lon], 5)
Как указано в их документации, вам нужно добавить это в свою модель:
extend Geocoder::Model::ActiveRecord
Ссылка: https://github.com/alexreisner/geocoder#for-activerecord-models