查找最近纬度和经度

时间:2015-05-16 18:08:41

标签: c# sql asp.net sql-server

我的问题是,我的数据库中只有他们的纬度和经度的酒店信息。现在我想从给定的纬度和经度找到最近的酒店。 例如:假设纬度为196.98575,经度为= 24.985644, 现在基于这个纬度我想找到最近的酒店在15公里,我在我的数据库中可用。 请建议我任何想法或如果你有任何存储过程请告诉我,以便我可以避免手动任务。 我正在使用sql server。

2 个答案:

答案 0 :(得分:1)

正如上面的评论所提到的,SQL Server自SQL 2008以来就拥有原生地理空间功能。以下是我对解决方案的准备:

create table dbo.Hotels (
    HotelID int identity not null,
        constraint [PK_Hotels] primary key clustered (HotelID),
    Longitude decimal(15, 12) not null,
    Latitude decimal(14, 12) not null,
    geo as geography::Point(Latitude, Longitude, 4326)
)

insert into dbo.Hotels 
    (Longitude, Latitude)
values
    (-122.4167, 37.7833);
go

create procedure dbo.findHotels (@point geography, @distanceKM int = 15)
as
begin
    --SRID 4326 measures disances in meters, so use that measure
    declare @distanceM int = @distanceKM * 1000;

    select HotelID, @point.STDistance(geo) as [DistanceInM]
    from dbo.Hotels
    where @point.STDistance(geo) <= @distanceM
    order by @point.STDistance(geo);
end
go

declare @longitude decimal(15, 12) = -122.4168,
    @latitude decimal(14, 12) = 37.7832;
declare @p geography = geography::Point(@latitude, @longitude, 4326);

exec dbo.findHotels @p, 15;

答案 1 :(得分:0)

看一下here。那里找到距离数据库中M =(lat,lon)=(1.3963,-0.6981)距离d = 1000 km的地方 * Lat和Lon以弧度表示坐标

这是根据此来源的简单查询

SELECT * FROM Places WHERE
    (Lat => 1.2393 AND Lat <= 1.5532) AND (Lon >= -1.8184 AND Lon <= 0.4221)
AND
    acos(sin(1.3963) * sin(Lat) + cos(1.3963) * cos(Lat) * cos(Lon - (-0.6981))) <= 0.1570;