【问题标题】:Find the North West and South East among bunch of Latitudes and Longitudes在一堆纬度和经度中找到西北和东南
【发布时间】:2012-01-21 20:47:37
【问题描述】:

我的数据库中有一堆位置(Lat、Lng)数据,我们假设它具有以下列:

度假村

纬度

经度

我想定义可用度假村的半径,我需要找到西北和东南部的地方。 我需要找到最西北的度假村其中最东南部的度假胜地我的目标是绘制一个包含所有地方的矩形。

那会是什么算法?

表存储在 SQL Server 中,我可以在这里使用 SP 或 Function。此外,C# 代码也会有所帮助。

编辑

我需要在 NW 和 SE 上找到一个位置来确定矩形。我需要先解决这个问题。我现在不是在寻找在该矩形内查找位置的方法。

编辑

这是我对我所追求的东西的想象(对不起,糟糕的图画):

将其视为世界地图,蓝色圆圈是度假村。我需要找到我用棕色圆圈标记的两个地方的 lat 和 lng。

编辑

@Damien_The_Unbeliever 指出我在这里走错了方向。我的目标是绘制一个包含所有地方的矩形。我的问题是讲另一个故事。

【问题讨论】:

  • 从你的评论到第一个答案,你是说你有度假村的纬度/经度,但需要计算纬度/经度来搜索附近的地方吗?
  • 让我们看看我是否明白这一点。你有一堆度假村,你想找到包含所有度假村的最小圆(它的半径就是你要找的半径),你想找到最西北和最东南的度假村?
  • 也许你所追求的图片可能会有所帮助。
  • @GeorgeDuckett 我正在这样做 :) 查看更新。
  • @zmbq 你明白了。用图片查看更新后的问题。

标签: c# sql-server tsql geolocation latitude-longitude


【解决方案1】:

如果我理解正确,您有一堆带有坐标的度假村,并且您想要这些度假村的边界“矩形”。

然后你需要发出两个查询,一个查找最小和最大纬度,另一个查找最小和最大经度。

然后组合这些值以获得正确的角。

编辑
您可以像这样使用 SQL:

declare @minlat float, @maxlat float
select @minlat = min(latitude), @maxlat = max(latitude)
from resortstable

与经度类似。然后 (@minlat, @minlong) 是一个角, (@maxlat, @maxlong) 是另一个角。您可能需要更改这些:我不确定纬度是否意味着 N/S。

对于最西北的度假村,您有一个问题:如果一个度假村位于最北端,而另一个位于最西端怎么办?你打算怎么选?

EDIT2
假设您只有两个度假村,一个在东北角,另一个在西南角。也许在这两者之间的粗略线上添加更多。现在西北和东南角的度假村是什么?

【讨论】:

  • 很好的方法,问题是我无法想象如何在 T-SQL 上编写代码。有机会吗?
  • 这将找到您的度假村的绑定矩形。如果你需要一个圆圈,那就是包含这个矩形的圆圈。但是请注意,您可能在任何角落都没有度假村,并且您可能没有“最东南部”的度假村。假设您在中心以北 1 公里处有一个度假村,在东边 1 公里处,在南边 1 公里处,最后一个在西边 1 公里处。您没有最西北的度假胜地,只有北部和西部。
【解决方案2】:

要绘制一个矩形,所有度假村都适合这里是完整的示例:

create table #testing (
Resort varchar(20),
Longitude int,
Latitude int
)

insert into #testing values ('Res 1', 10, 20)
insert into #testing values ('Res 2', -12, 30)
insert into #testing values ('Res 3', 3, -122)
insert into #testing values ('Res 4', 120, 120)
insert into #testing values ('Res 5', -2, 230)
insert into #testing values ('Res 6', 32, -2)

select
    min(Longitude) [Min Longitude],
    max(Longitude) [Max Longitude],
    min(Latitude) [Min Latitude],
    max(Latitude) [Max Latitude],
    convert(varchar, min(Longitude)) + "," + convert(varchar, max(Latitude)) [NW],
    convert(varchar, max(Longitude)) + "," + convert(varchar, min(Latitude)) [SE]
    from #testing

drop table #testing

【讨论】:

  • 谢谢,但我认为你没有得到我的问题。我需要在 NW 和 SE 上找到一个位置来确定矩形。我需要先解决这个问题。知道怎么做吗?所以,@Lat@Lng 值还不存在。
  • 哦,你需要给定一个位置,确定@Lat 和@Lng?
  • @tugberk 你知道所有地方的所有纬度和经度吗?
  • 是的,它们都存储在数据库中。我需要在其中找到最西北和最东南的度假村。
  • @tugberk 你偏爱什么,北方还是西方? (想象一下你的图片左中部有一个度假村,它是最西但不是最北的。我应该选择那个还是应该选择最左+最上的存在,即使它们来自不同的度假村?)
【解决方案3】:

您确实想使用考虑地球曲率的函数,如果距离相当大,这将产生合理的差异。

例如,您可以基于Haversine forumula 创建一个函数:

CREATE FUNCTION [dbo].[LatLong_HaversineDistanceMiles] (
@lat1 float,
@lon1 float,
@lat2 float,
@lon2 float
)
RETURNS float AS
BEGIN 

declare @dlon float
declare @dlat float
declare @a float
declare @c float
declare @d float

select @dlon=radians(@lon2)-radians(@lon1)
select @dlat=radians(@lat2)-radians(@lat1)

select @a =square(sin(@dlat/2.0)) + (cos(radians(@lat1)) * cos(radians(@lat2)) * square(sin(@dlon/2.0)))
select @c = 2.0 * atn2(sqrt(@a), sqrt(1.0-@a))
select @d = 3956 * @c

return @d


end

您可以在 where 子句中使用它来过滤掉值 > 您的半径的那些。

【讨论】:

  • 谢谢。你能看到我更新的问题吗?我认为这种逻辑不会给我在 NW 和 SE 上的优势?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
  • 1970-01-01
  • 1970-01-01
  • 2021-02-12
相关资源
最近更新 更多