我使用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被作为输入
答案 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)))
}
请仔细检查我是否正确复制了等式。