首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL精选:某个位置50公里范围内的厕所?

SQL精选:某个位置50公里范围内的厕所?
EN

Stack Overflow用户
提问于 2011-06-05 15:22:22
回答 2查看 1.1K关注 0票数 2

我需要找到我周围的厕所,比如说在50公里内,我有我在经纬度方面的位置,数据库中的厕所是这样的:

代码语言:javascript
复制
Toilet ID (primary)
Address
Latitude
Longitude

my location: my_lat, my_lon

是否可以构造一条语句来返回(my_lat,my_lon) 50公里内的所有厕所?就像这样

代码语言:javascript
复制
select * from ToiletTable where 
  SQRT((Latitude - my_lat)^2 + (Longitude - my_lon)^2) < 50

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-27 22:56:57

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

代码语言:javascript
复制
where pow(2*(latitude - ?), 2) + pow(longitude - ?, 2) < distance
票数 0
EN

Stack Overflow用户

发布于 2011-06-05 15:25:37

您正在寻找Haversine formula

下面是两个完整的实现,一个用SQL:Haversine Implementation

编辑:

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

下面内联的SQL

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6241523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档