首页 文章

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

提问于
浏览
2

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

度假经纬度

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

算法算法是什么?

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

EDIT

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

EDIT

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

enter image description here

认为这是世界 Map ,蓝色圆圈是度假胜地 . 我需要找到我用棕色圆圈标记的两个地方的纬度和长度 .

EDIT

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

3 回答

  • 1

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

    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
    
  • 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

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

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

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

    EDIT
    您可以像这样使用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角落度假村?

相关问题