如何检查lat长圈或不是sql server

时间:2016-06-29 12:18:44

标签: sql-server sql-server-2012

我有查询回复这个,纬度和经度是否在Rectangle中。请检查下面的代码和图像文件。

我的问题是如何获得圈子的结果? mylat长圈或出圈 我在数据库中有"lat":"25.38227896335241","lon":"68.3395897859009"},"radius":"141.4213562373095"

  

示例:"我有纬度经度的汽车我正在检查纬度   ,如果在圆形结果中,经度是否在圆圈内?' Car in Circle'   如果不是' Car out of Circle area'这个逻辑在我的矩形中很完美但是   我也想要圆圈结果"

DECLARE @g geography,
@pIn geography,
@pOut geography


DECLARE @minY varchar(10);
DECLARE @maxY varchar(10);
DECLARE @minX varchar(10);
DECLARE @maxX varchar(10);
DECLARE @carlat varchar(10);
DECLARE @carlong varchar(10);
DECLARE @CarIdx int;
select 
@minY = g.minlatitude , --N'29.7071393481341'
@maxY = g.minlongitude , --N'64.808349609375'
@minX = g.maxlatitude , --N'28.2463279710488'
@maxX = g.maxlongitude --N'63.292236328125'
from tblgeofencing as g where ShapeType = 'rectangle'
SET @g = geography::STPolyFromText('POLYGON((' + @minX + ' ' + @minY + ', ' + 
@maxX + ' ' + @minY + ', ' + 
@maxX + ' ' + @maxY + ', ' + 
@minX + ' ' + @maxY + ', ' + 
@minX + ' ' + @minY + '))', 4326);

select TOP 1 @CarIdx= idx, @carlat = f.lat, @carlong = f.long from checkgeofence as f order by idx desc
SET @pIn = geography::STPointFromText('POINT(' + @carlat +' ' + @carlong +' )',4326)
SET @pOut = geography::STPointFromText('POINT( 28.709860843942856 63.643798828125 )',4326)

SELECT Poly = @g, 
pIn = @pIn, 
pOut = @pOut
SELECT DistanceInMetersIn = @g.STDistance( @pIn ),
DistanceInMetersOut = @g.STDistance( @pOut ),
STIntersectsIn = @g.STIntersects( @pIn ),
STIntersectsOut = @g.STIntersects( @pOut )
SELECT STIntersectionIn = @g.STIntersection( @pIn ).ToString(),
STIntersectionOut = @g.STIntersection( @pOut ).ToString()
if( @g.STIntersects( @pIn ) >= 1)
update checkgeofence
set IsGeofence = 1
where idx = @CarIdx

enter image description here

1 个答案:

答案 0 :(得分:0)

  1. 获取汽车的纬度和经度
  2. 获取地点的纬度和经度
  3. 获得所需的圆圈半径
  4. 计算汽车与地点之间的距离
  5. 如果你运行它,它应该返回一个1,这意味着汽车在该地方的给定半径范围内。

    declare @latitudeCar decimal(9,6) = 0.0275361;
    declare @longitudeCar decimal(9,6) = 51.5064694;
    declare @latitudePlace decimal(9,6) = -66.1711278;
    declare @longitudePlace decimal(9,6) = -17.4125;
    
    
    declare @source geography = 'POINT(' + cast(@latitudeCar as nvarchar) + ' ' + cast(@longitudeCar as nvarchar) + ')'
    declare @target geography = 'POINT(' + cast(@latitudePlace as nvarchar) + ' ' + cast(@longitudePlace as nvarchar) + ')'
    declare @radius float = 7000
    declare @check float
    declare @isPastCircle bit
    
    set @check = (select @source.STDistance(@target)/1609.344)
    --select @source.STDistance(@target)/1000
    
    set @isPastCircle = (select case when @check < @radius then 1 else 0 end);
    select @isPastCircle [isPastCircle], @check [carDistance], @radius [acceptableRadius]
    

    标准美国里程检查

    set @check = select @source.STDistance(@target)/1609.344
    

    km check

    set @check = select @source.STDistance(@target)/1000