【问题标题】:Distance calculation in query with slick database使用光滑数据库进行查询中的距离计算
【发布时间】:2015-01-15 21:37:57
【问题描述】:

我正在使用带有 scala 的 slick 来查找用户到关闭点的距离。但我不确定如何正确使用 slick。我尝试了不同的方法,但我不断收到符号错误或没有得到适当的答案。我要转换的 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 已作为输入给出

【问题讨论】:

  • 你能包括你一直在尝试的 Scala 吗?
  • @Jonoabroad val q = for { s <- globals.spots } yield (3956 * 2 * sin(sqrt( pow(sin((s.spot_lat - abs(lat)) * Pi/180 / 2),2) + cos(s.stop_lat * Pi/180 ) * cos(abs(lat) * Pi/180) * pow(sin((s.spot_lon – lon) * Pi/180 / 2), 2) )) )
  • @Jonoabroad val newQuery = for {(latr, lonr) <- Parameters [(Double, Double)] u <- globals.spots if u.spot_lat >= latr && u.spot_lon >= lonr}yield u val result = newQuery(lat, lon).list 这个更像是一个测试,看看它是否会查询
  • 型号?我会尝试从查询中重新创建它。

标签: scala distance slick typesafe


【解决方案1】:

首先,定义您的数据库三角函数,以便 slick 可以使用它们:

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")

当您在 slick 查询中使用这些函数时,它会生成 SQL 查询并调用数据库函数。此外,请确保在您使用的数据库中定义了三角函数。阅读更多关于它的信息: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)))
}

请仔细检查我复制的方程式是否正确。

【讨论】:

  • 我还会使用postgis geometry 类型(slick-pg 支持)进行距离计算。
  • 等式看起来不错。我只是收到一个错误,`3956 * 2 * ..` 找到“*”的符号时遇到问题
  • 可能是一个错误。请提供可重现的示例并在github.com/slick/slick/issues 报告
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-14
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多