Ruby, SQLite и тригонометрические функции - PullRequest
3 голосов
/ 15 августа 2011

Я хочу иметь возможность использовать различную тригонометрию, чтобы найти расстояние между широтой и долготой от рубина, используя базу данных SQLite. SQLite не предоставляет тригонометрических функций (cos, sin, pow), поэтому я ищу, как реализовать эти функции - есть идеи?

Я знаю, что могу использовать другие базы данных (PostgreSQL, MySQL и т. Д.), Но мне нужно использовать SQLite, поэтому установка базы данных не требуется. Любые идеи о том, как скомпилировать расширения для SQLite, которые я могу вставить в гем sqlite3?

Спасибо!

1 Ответ

1 голос
/ 15 августа 2011

Если написание расширения - это слишком много работы, я обычно делаю для этой проблемы приблизительное расстояние, которое я хочу выбрать (и переоцениваю бит), используя ограничивающую рамку широта / долгота, которая значительно уменьшает пространство выборки, а затем выполните итерацию по этому набору в 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...