2011-08-15 34 views
3

我希望能夠使用各種三角函數找到使用SQLite數據庫紅寶石緯度和經度之間的距離。 SQLite不提供三角函數(cos,sin,pow),所以我正在尋找如何實現這些功能 - 任何想法?紅寶石,SQLite和三角函數

我知道我可以使用其他數據庫(PostgreSQL系統時,MySQL等),但我需要使用SQLite所以沒有數據庫的安裝是必需的。關於如何編譯SQLite的擴展,我可以插入sqlite3 gem的任何想法?

謝謝!

+2

您確定要在數據庫級別要做到這一點,而不是在Ruby中?爲什麼? –

+1

@Henning如果你有一個龐大的數據集或需要調用這個函數(例如,實時的大型數據集的位置搜索,運行行程規劃算法,數據分析等),那麼在sqlite級別執行C語言會更快一些,雖然通常在這些情況下你會用C/C++來實現整個事情,並且只是用ruby包裝它。我通常做的是近似的距離,以減少SQL中的樣本大小,然後運行ruby中的距離計算。假設你已經將樣本量減小了。超過500點,速度差異變得明顯。 –

+0

@Charles:是的,但是看起來OP看起來像是SQL表達式,而不是C或Ruby。如果OP計劃使用C/C++作爲球面距離,那麼我不明白問題是什麼。 C肯定有trig函數。 –

回答

1

如果寫一個擴展名是太辛苦了,我通常對這個問題做的是通過使用緯度/經度邊框其中顯著降低了樣本空間,以接近我想選擇(和高估一點)的距離,然後在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

+0

這看起來可能只是票 - 將調查! –

+0

這個庫絕對是完美的 - 但它不適用於最新版本的Active Record! (Active Record適配器也與早期版本的Amalgalite綁定)。我會試着讓它工作,但是我對ActiveRecord內部知識的瞭解並不是真的。 –