Какой самый эффективный способ получить области, где широта / долгота попадают под? - PullRequest
0 голосов
/ 08 апреля 2020

area имеет много coordinates coordinate модель имеет два атрибута: latitude и longitude

Есть ли способ реорганизовать это? Прямо сейчас это работает, но выполняет своего рода n + 1 запрос:

areas.each_with_object([]) do |area, array|
  geokit_lat_lngs = area.coordinates.order(sequence: :asc).map do |coordinate|
    Geokit::LatLng.new(coordinate.latitude, coordinate.longitude)
  end

  polygon = Geokit::Polygon.new(geokit_lat_lngs)
  point   = Geokit::LatLng.new(latitude, longitude)
  array << area.id if polygon.contains?(point)
end

Я пытаюсь получить все areas, которые latitude и longitude попадают под

Im используя гем Geokit, но с удовольствием переключаюсь, если есть что-то более эффективное, чем я должен сделать

1 Ответ

0 голосов
/ 08 апреля 2020

В зависимости от того, сколько областей ваша база данных должна содержать, у вас могут быть разные стратегии.

Если у вас относительно небольшое количество областей, и у каждой области есть небольшое количество координат, вы можете preload или даже eager_load координаты в памяти.

# Suppose `areas` is an `ActiveRecord::Relation`, not just an array
areas.preload(:coordinates).each_with_object([]) do |area, array|
  # Do an in-memory sort
  geokit_lat_lngs = area.coordinates.sort_by(&:sequence).map do |coordinate|
    # ...
  end
end

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

...