Have a fun while searching

Wednesday, July 20, 2011

find position in circle using longitude and latitude sp

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER procedure [dbmcs2005].[dist]
(
@Longitude decimal(18,15),
@Latitude decimal(18,15)

)
as
declare @Query as varchar(5000)
begin
set @Query = 'select RM.Address,RM.rent,RM.photo1,convert(varchar(25),RM.latitude)as latitude,convert(varchar(25),RM.Longitude)as Longitude,isnull(RM.Age,0)as Age,isnull(RM.bedrooms,0)as bedrooms,isnull(RM.bathrooms,0)as bathrooms,RM.gender,RM.city,RM.pets,MP.phone from RoomApartments RM inner join MemberProfiles MP on RM.memberID = MP.memberID where dbo.CalculateDistance(' + cast(@Latitude as varchar(50)) + ', ' + cast(@Longitude as varchar(50))+', Latitude,Longitude,''Miles'') <=' + '25'
exec(@Query)
end
----------------------------------------------------------
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER FUNCTION [dbo].[CalculateDistance]
(
@originLatitude decimal(18, 15),
@originLongitude decimal(18, 15),
@relativeLatitude decimal(18, 15),
@relativeLongitude decimal(18, 15),
@Measure varchar(12)
)
RETURNS decimal(18, 10)
AS BEGIN

IF @originLatitude = @relativeLatitude AND @originLongitude = @relativeLongitude BEGIN
RETURN 0; -- same lat/lon points, 0 distance
END

-- default unit of measurement will be miles
IF @Measure = '' BEGIN
SELECT @Measure = 'Miles';
END

-- lat and lon values must be within -180 and 180.
IF @originLatitude < -180 OR @relativeLatitude < -180 OR @originLongitude < -180 OR @relativeLongitude < -180 BEGIN
RETURN 0;
END
IF @originLatitude > 180 OR @relativeLatitude > 180 OR @originLongitude > 180 OR @relativeLongitude > 180 BEGIN
RETURN 0;
END

DECLARE @x decimal(18,15);
SELECT @x = 0.0;

-- convert from degrees to radians
SELECT @originLatitude = @originLatitude * PI() / 180.0,
@originLongitude = @originLongitude * PI() / 180.0,
@relativeLatitude = @relativeLatitude * PI() / 180.0,
@relativeLongitude = @relativeLongitude * PI() / 180.0;

-- distance formula, accurate to within 30 feet
SELECT @x = Sin(@originLatitude) * Sin(@relativeLatitude) + Cos(@originLatitude) * Cos(@relativeLatitude) * Cos(@relativeLongitude - @originLongitude);

IF 1 = @x BEGIN
RETURN 0; -- same lat/long points
-- not enough precision in SQL Server to detect this earlier in the function
END

DECLARE @EarthRadius decimal(7,3);
SELECT @EarthRadius = 3963.189;

DECLARE @distInSelectedUnit decimal(18, 10);
SELECT @distInSelectedUnit = @EarthRadius * (-1 * Atan(@x / Sqrt(1 - @x * @x)) + PI() / 2);

-- convert the result to kilometers if desired
IF @Measure = 'Kilometers' BEGIN
SELECT @distInSelectedUnit = dbo.MilesToKilometers(@distInSelectedUnit);
END

RETURN @distInSelectedUnit;
END

0 comments:

Post a Comment