在众多纬度和经度中找到西北和东南

时间:2011-12-16 09:36:53

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

我的数据库中有大量的位置(Lat,Lng)数据,我们假设它有以下列:

  

度假村

     

纬度

     

经度

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

算法是什么?

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

修改

我需要在NW和SE上找到一个地方来确定矩形。我需要先解决这个问题。我现在不想找到在那个矩形内找到地方的方法。

修改

这是我对我所追求的想象力(抱歉可怕的绘画):

enter image description here

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

修改

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

你真的想要使用一个考虑到地球曲率的函数,如果距离相当大,这将产生合理的差异。

例如,您可以根据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子句中使用它来过滤掉值为>你的半径。

答案 2 :(得分:1)

如果我理解正确,你有一堆带有坐标的度假村,你想为这些度假村设置一个边界“矩形”。

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

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

修改
您可以像这样使用SQL:

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

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

对于大多数NW度假村,您有一个问题:如果一个度假村是最北部的,另一个是最西部的度假村怎么办?你打算如何选择?

<强> EDIT2
假设您只有两个度假村,一个在NE角落,另一个在SW角落。也许在这两者之间的粗略线上添加更多。现在NW和SE角落里有什么?