用光滑数据库查询中的距离计算

时间:2015-01-15 21:37:57

标签: scala distance slick typesafe

我使用scala sclick来查找用户到关闭点的距离。但我不确定如何用光滑的方式做到这一点。我尝试了不同的方法,但我一直在用符号得到错误或没有得到合适的答案。我想要转换的SQL查询是:

SELECT *, 3956 * 2 * sin(sqrt( pow(sin((spot_lat -
abs(lat)) * Pi/180 / 2),2) + cos(spot_lat * Pi/180 ) * cos(abs(lat) *  Pi/180) *
pow(sin((spot_lon – lon) *  Pi/180 / 2), 2) )) as distance 
FROM Spots

其中lat和lon被作为输入

1 个答案:

答案 0 :(得分:1)

首先,定义数据库触发函数,以便它们可以被光滑使用:

val dbSin = SimpleFunction.unary[Double, Double]("sin")
val dbCos = SimpleFunction.unary[Double, Double]("cos")
val dbSqrt = SimpleFunction.unary[Double, Double]("sqrt")
val dbPow = SimpleFunction.binary[Double, Double, Double]("pow")
val dbAbs = SimpleFunction.unary[Double, Double]("abs")

在光滑的查询中使用这些函数时,它会生成带有对数据库函数调用的SQL查询。此外,请确保在您使用的数据库中定义trig函数。在http://slick.typesafe.com/doc/2.1.0/userdefined.html

了解更多相关信息

现在您可以在查询中使用这些功能:

import scala.math._
def distance(lat: Double, lon: Double) = globals.spots map { spot =>
    3956 * 2 * dbSin(dbSqrt(dbPow(dbSin((spot.splot_lat - Pi / 180.0 / 2.0), 2) +
        dbCos(spot.spot_lat * Pi / 180.0) * dbCos(dbAbs(lat) * Pi / 180.0) *
        dbPow(dbSin((spot.spot_lon - lon) * Pi / 180.0 / 2.0), 2)))
}

请仔细检查我是否正确复制了等式。