我的数据库中有大量的位置(Lat,Lng)数据,我们假设它有以下列:
度假村
纬度
经度
我想定义可用度假村的半径和我需要在西北和东南找到这个地方。 我需要找到最西北的度假胜地在那些 中的大多数东南度假胜地我的目标是绘制一个包含所有地方的矩形。
算法是什么?
表存储在SQL Server中,我可以在这里使用SP或Function。此外,C#代码也会有所帮助。
修改
我需要在NW和SE上找到一个地方来确定矩形。我需要先解决这个问题。我现在不想找到在那个矩形内找到地方的方法。
修改
这是我对我所追求的想象力(抱歉可怕的绘画):
将此视为世界地图,蓝色圆圈为度假村。我需要找到两个地方的lat和lng,我用棕色圆圈标记。
修改
答案 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角落里有什么?