2

我遇到了一个与我的半正弦公式有关的奇怪问题。它在我的应用程序中发生的方式是;

select lat,long,distance from(
        select lat,long,( 6371 * acos( cos( radians("+testLatitude.to_s+") ) * cos( radians( lat ) ) * cos( radians( long ) - radians("+testLongitude.to_s+") ) + sin( radians("+testLatitude.to_s+") ) * sin( radians( lat ) ) ) ) as distance
        from available_people) as dt where distance < "+distance.to_s+" order by distance

我 100% 确定我的available_people表中有一个 personName,但我无法让下面的查询正常工作。它给了我列不存在错误。

select lat,long,distance from(
            select personName,lat,long,( 6371 * acos( cos( radians("+testLatitude.to_s+") ) * 

    cos( radians( lat ) ) * cos( radians( long ) - radians("+testLongitude.to_s+") ) + sin( radians("+testLatitude.to_s+") ) * sin( radians( lat ) ) ) ) as distance
                from available_people) as dt where distance < "+distance.to_s+" order by distance

可能的原因是什么。我可以检索 personName 列以及 lat、long 信息吗?

4

1 回答 1

0

没有看到确切的错误(你真的应该包括它)我会说你应该personName在表前加上 ieavailable_people.personNamedt.personName(如果我正确地阅读你的查询)。

其次,尽管不相关,但您的 lat/lng 列使用什么列类型?这是使用mysql吗?作为浮动?

如果是这种情况,那么一旦您的表拥有足够的记录,您就会遇到严重的性能问题。我在大约 50k 条记录中遇到了这个问题,其中查询需要 2 分钟或更长时间。

如果您正在处理地理空间数据,请考虑使用 Postgres+PostGIS 或 MongoDB。这些解决方案具有地理空间索引,可让您的查询超快且功能强大,这样您就不必自己执行余弦或球面余弦定律。

于 2012-12-11T07:48:47.380 回答