【问题标题】:SQL Select: toilets within 50KM of a certain position?SQL Select:某个位置50KM内的厕所?
【发布时间】:2011-09-08 15:36:15
【问题描述】:

我需要在我周围找到厕所,比如 50 公里以内,我有我的经纬度位置,数据库中的厕所如下所示:

Toilet ID (primary)
Address
Latitude
Longitude

my location: my_lat, my_lon

是否可以构造一个语句返回 (my_lat, my_lon) 50KM 内的所有厕所?类似的东西

select * from ToiletTable where 
  SQRT((Latitude - my_lat)^2 + (Longitude - my_lon)^2) < 50

谢谢!

【问题讨论】:

标签: sql sqlite distance


【解决方案1】:

您正在寻找Haversine formula

这里有两个完整的实现,一个在 SQL 中:Haversine Implementation

编辑:

Here's a Haversine implementation of a UDF in SQLite。不幸的是,它是针对 iPhone 的,但至少你有你需要的确切实现。现在您只需要确定如何插入即可。

SQL 内联如下

CREATE FUNCTION [dbo].[GetDistance]

(
  @lat1 Float(8),
  @long1 Float(8),
  @lat2 Float(8),
  @long2 Float(8)
)
RETURNS Float(8)
AS
BEGIN
  DECLARE @R Float(8);
  DECLARE @dLat Float(8);
  DECLARE @dLon Float(8);
  DECLARE @a Float(8);
  DECLARE @c Float(8);
  DECLARE @d Float(8);
  SET @R = 6371; --This value is 6371 for kilometers, 3960 for miles.
  SET @dLat = RADIANS(@lat2 - @lat1);
  SET @dLon = RADIANS(@long2 - @long1);
  SET @a = SIN(@dLat / 2) * SIN(@dLat / 2) + COS(RADIANS(@lat1))
                    * COS(RADIANS(@lat2)) * SIN(@dLon / 2) * SIN(@dLon / 2);
  SET @c = 2 * ASIN(MIN(SQRT(@a)));
  SET @d = @R * @c;
  RETURN @d;
END
GO

【讨论】:

  • 感谢您的回复,问题是,我正在Android中做一个SQLite数据库(即一个文件),所以不知道除了数据库还能不能创建自己的函数.还有,即使有了函数,我该如何构造SQL语句?
  • 此链接提供了一些有关 Android 开发和 Haversine 的信息。它可能会为您指明正确的方向。 devdiscoveries.wordpress.com/2010/02/01/…
【解决方案2】:

假设您不在极地或太平洋地区,我会使用:

where pow(2*(latitude - ?), 2) + pow(longitude - ?, 2) < distance

【讨论】:

    猜你喜欢
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    相关资源
    最近更新 更多