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