从给定的点(lat,lng)按纬度和经度查找地址

时间:2017-02-06 16:44:33

标签: sql-server asp.net-mvc linq latitude-longitude

我有一个包含以下信息的表结构(和数据)

[注意:下面提供的数据只是样本并随机添加,如果此样本数据中的经度和纬度值无效,请原谅。]

  Id |  FullAddress    | Longitude | Latitude | 
  ----------------------------------------
  1  | 123 Test Ave, Toronto, ON, M1L3T8, Canada  | 43.12345  | -72.2355 |
  ------------------------------------------
  2  | 7 North Ave, Brampton, ON, L7A1T9, Canada | 40.12345  | -71.2745 |
  ------------------------------------------
  5  | 10 South Dr., Toronto, ON, M4H1J4, Canada  | 42.45375  | -73.2645 |
  ------------------------------------------
  8  | 123A Ave Rd, Ajax, ON, M3K3Y9, Canada   | 41.09775  | -74.2745 |
  ------------------------------------------
.
.
.

给出了纬度和经度的点。例如:(43.54567,-73.5433)。

从这一点((43.54567,-73.5433))1 KM范围内(这可以是任何数字),我想使用表经度和纬度数据(上面的所有地址)从上表中找到所有地址1 KM范围的给定点。)

enter image description here

如果我们考虑上面的例子(从图片中),查询应该返回ID为1(1 KM)和3(0.8 KM)的地址。

我在ASP.NET MVC中使用MS SQL。我可以使用LINQ命令查询数据库,如果这样可以更容易。

提前谢谢。

2 个答案:

答案 0 :(得分:1)

如果你没有在SQL中使用GEOGRAPHY类型,你可以这样做

示例

Declare @BaseLat float = 43.54567
Declare @BaseLng float = -73.5433

Select * 
 From  YourTable 
 Where [dbo].[udf-Geo-Meters](@BaseLat,@BaseLng,Latitude ,Longitude ) <=1000

UDF(如果需要)

CREATE Function [dbo].[udf-Geo-Meters](@Lat1 FLOAT, @Lng1 FLOAT, @Lat2 FLOAT, @Lng2 FLOAT)
Returns Float as
Begin
    Return ACOS(SIN(PI()*@Lat1/180.0)*SIN(PI()*@Lat2/180.0)+COS(PI()*@Lat1/180.0)*COS(PI()*@Lat2/180.0)*COS(PI()*@Lng2/180.0-PI()*@Lng1/180.0)) * 6371008.8
    -- 6.371 mean radius of earth in meters
End

答案 1 :(得分:0)

您可以使用以下查询查找给定范围内的地址,并按最近的顺序排序。您可以在MapPoint in .Net了解更多信息。

DECLARE @CntXAxis FLOAT 
DECLARE @CntYAxis FLOAT 
DECLARE @CntZAxis FLOAT 


SET @CntXAxis = COS(RADIANS(-118.4104684)) * COS(RADIANS(34.1030032)) 
SET @CntYAxis = COS(RADIANS(-118.4104684)) * SIN(RADIANS(34.1030032)) 
SET @CntZAxis = SIN(RADIANS(-118.4104684)) 

SELECT 
        50 *,
    ProxDistance = 3961 * ACOS( dbo.XAxis(LAT, LONG)*@CntXAxis + dbo.YAxis(LAT, LONG)*@CntYAxis + dbo.ZAxis(LAT)*@CntZAxis) 
FROM 
    tbl_ProviderLocation 
WHERE 
    (3961 * ACOS( dbo.XAxis(LAT, LONG)*@CntXAxis + dbo.YAxis(LAT, LONG)*@CntYAxis + dbo.ZAxis(LAT)*@CntZAxis) <= 10) 
ORDER BY 
    ProxDistance ASC

用户定义的功能

CREATE FUNCTION [dbo].[XAxis] (@lat float, @lon float)  
RETURNS float
AS  
BEGIN 
   RETURN COS(4 * (4 * atn2(1, 5) - atn2(1, 239)) / 180 * @lat) * COS(4 * (4 * atn2(1, 5) - atn2(1, 239)) / 180 * @lon) 
END

CREATE FUNCTION [dbo].[YAxis] (@lat float, @lon float)  
RETURNS float AS  
BEGIN 
RETURN COS(4 * (4 * atn2(1,5) - atn2(1,239)) / 180 * @lat) * SIN(4 * (4 * atn2(1,5) - atn2(1,239)) / 180 * @lon)
END

CREATE FUNCTION [dbo].[ZAxis] (@lat float)  
RETURNS float AS  
BEGIN 
RETURN SIN(4 * (4 * atn2(1,5) - atn2(1,239)) / 180 * @lat)
END