如何根据纬度和经度来搜索半径?

Ger*_*man 4 c# asp.net linq-to-entities

我想显示基于具有指定半径的经度和纬度的数据。

例:

我有一条记录,纬度为55.0628,经度为-162.3056,没有指定状态。

我如何只使用实体对linq显示一个状态内的记录?

如果我要显示佛罗里达州,请只显示佛罗里达州内的记录。

Table Data

id            item             latitude                 longitude
1             townhome          55.0628                 -162.3056


Table postal codes

id               state                 city            latitude            longitude
1                alaska                Akutan          54.143              -165.7854
2                Alabama               Huntsville      34.7448             -86.6704
Run Code Online (Sandbox Code Playgroud)

Tim*_*ora 5

我将执行尽可能接近实际数据的查询(这可能意味着绕过LINQ并调用存储过程)。

这是我用来计算两个位置之间距离的SQL用户定义函数。它利用了SQL Server 2008中引入的新地理功能。

CREATE FUNCTION [dbo].[GetDistanceBetween]
(
    @Lat1 float,
    @Long1 float,
    @Lat2 float,
    @Long2 float
)
RETURNS float
AS
BEGIN

    DECLARE @RetVal float;
    SET @RetVal = ( SELECT geography::Point(@Lat1, @Long1, 4326).STDistance(geography::Point(@Lat2, @Long2, 4326)) / 1609.344 );

RETURN @RetVal;

END
Run Code Online (Sandbox Code Playgroud)

函数返回的距离以英里为单位,并且根据我的经验来说非常快(这显然取决于您需要进行多少次比较)。

您可以使用类似这样的名称:

DECLARE @StartingLatitude FLOAT, @StartingLongitude FLOAT;
DECLARE @MaxDistance FLOAT = 50;

SELECT * FROM PostalCodes 
WHERE dbo.GetDistanceBetween(@StartingLatitude, @StartingLongitude, latitude, longitude) <= @MaxDistance;
Run Code Online (Sandbox Code Playgroud)