Этот ответ будет для вас небольшой работой.Я слаб с рубином на рельсах, но я должен быть в состоянии помочь вам через раздел БД.
У вас есть две таблицы: область, которая содержит многоугольник, и событие, которое содержит событие как одну точку (этонемного сложнее, если событие также является областью, и вы пытаетесь выделить перекрывающиеся области ... если события представляют собой отдельные точки, это работает).
Select *
from area a inner join event e on 1=1
Это создаст списоккаждая область, присоединенная к каждому событию ... если у вас есть 500 событий и 20 областей, этот запрос вернет 10'000 строк.Теперь вы хотите отфильтровать это так, чтобы только события, которые находятся в области, к которой они были присоединены.Для этого мы можем использовать st_contains как st_contains (polygon, point):
where st_contains(a.polygon,e.point) = 't'
Если вы запустите это, он должен дать вам. , e. для всех событий в области.Теперь это просто вопрос подсчета того, что вы хотите считать.
select a.id, count(1)
from area a inner join event e on 1=1
where st_contains(a.polygon,e.point) = 't'
group by 1
Это даст вам список всех ваших районов (по идентификатору) и количество событий в них.Отключение a.id с помощью e.id даст список идентификаторов событий и числовых областей, в которых они находятся.
К сожалению, я не знаю, как выразить эти запросы в Ruby, но концепции БД, которые выВам нужно будет здесь ...
Из соображений скорости вы должны изучить индексирование GIStree, которое у Postgres ... индексированные полигоны работают экспоненциально лучше.
Редактировать:
PostGIS - это файл, который поставляется с Postgres, но не существует в стандартной установке ... вам нужно найти этот файл.Они установят ряд ГИС-функций в вашей базе данных, включая ST_Contains.(функции находятся в базе данных, поэтому убедитесь, что вы устанавливаете функции в используемой вами БД)
Второе, что устанавливает файлы вклада PostGIS, - это база данных template_postGIS, которая требуется для типов данных geometry (geom кактип данных не будет существовать, пока он не будет установлен).