Если написание расширения - это слишком много работы, я обычно делаю для этой проблемы приблизительное расстояние, которое я хочу выбрать (и переоцениваю бит), используя ограничивающую рамку широта / долгота, которая значительно уменьшает пространство выборки, а затем выполните итерацию по этому набору в ruby, чтобы найти точный набор точек на нужном расстоянии.
Редактировать: похоже, что кто-то уже написал библиотеку, которая позволяет вам легко определять функции, как если бы они были хранимыми процедурами. Я не знаю, является ли это реализацией ruby или она делает какую-то хитрость, чтобы сначала скомпилировать ее до C, поэтому я не знаю производительность, но она кажется довольно простой в использовании. https://github.com/copiousfreetime/amalgalite
require 'rubygems'
$: << "../lib"
$: << "../ext"
require 'amalgalite'
db = Amalgalite::Database.new( "mydb.sqlite" )
db.define_function( 'geo_dist' ) do |lat1, lng1, lat2, lng2|
# Haversine formular here to calculate the distance
end
Вот полный пример
https://github.com/copiousfreetime/amalgalite/blob/master/examples/define_function.rb