2017-02-06 2 views
1

У меня есть структура таблицы (и данные) со следующей информациейНайти адрес по широте и долготе от точки (широта, LNG) данного

[Примечание: данные, приведенные ниже, просто образец и случайно добавили, пожалуйста, извините если значение долготы и широт не действует в этом данные выборках.]

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 км от указанной точки).

enter image description here

Если мы рассмотрим приведенный выше пример (с картинки), запрос должен возвращать адрес с идентификатором 1 (1 км) и 3 (0,8 км).

Я использую MS SQL с ASP.NET MVC. Я могу использовать команду LINQ для запроса базы данных, если это упростит.

Заранее спасибо.

ответ

1

Если вы не используете тип ГЕОГРАФИЯ в SQL, вы можете сделать что-то вроде этого

Пример

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

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

ОДС при необходимости

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 
+0

Я дам ему попробовать, Thanx. –

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 
+0

Благодарим вас за ответ. Это, вероятно, также будет работать. Но я пойду с ответом Джона Каппелетти (как это немного проще). –