Как хранить долготу и широту в качестве географии на сервере sql 2014?

Я новичок в sql, который знает, как получить местоположение моих пользователей в координатах долготы и широты. Моя цель состоит в том, чтобы в конечном итоге выбрать все строки из myTable, где расстояние меньше 2 км. Однако на пути к этой цели есть некоторые вещи, которые меня смущают, поэтому я попытаюсь перечислить то, что я не понимаю.

  1. Как я могу использовать долготу и широту для хранения местоположения в столбце географии? (Потому что он должен быть только одним географическим пунктом, а не двумя, а не по долготе и по широте?)

  2. Теперь, когда у меня есть точки географии, как я могу выбрать все строки на определенном расстоянии (в моем случае 2 км)?

Я уже видел некоторые подобные вопросы, однако количество предварительного понимания для их решения выходит за рамки моих знаний sql, так как я абсолютный новичок, это можно сделать легко, кто-нибудь знает как?

Ответ 1

Как я могу использовать longitute и latitute для хранения местоположения в столбце географии? (Потому что он должен быть только одним географическим пунктом, а не двумя, а не один для longitute и один для latitute?)

Вы можете использовать geography::STPointFromText/ geography::Point для хранения долготы и широты в geography::STPointFromText данных.

SELECT geography::STPointFromText('POINT(' + CAST([Longitude] AS VARCHAR(20)) + ' ' + CAST([Latitude] AS VARCHAR(20)) + ')', 4326)

или же

SELECT geography::Point(Latitude, Longitude , 4326)

Ссылка:

Обновить столбец географии в таблице

Теперь, когда у меня есть точки географии, как я могу выбрать все строки на определенном расстоянии (в моем случае 2 км)?

Вы можете использовать STDistance как это.

DECLARE @g geography;
DECLARE @h geography;
SET @g = geography::STGeomFromText('POINT(-122.35900 47.65129)', 4326);
SET @h = geography::STGeomFromText('POINT(-122.34720 47.65100)', 4326);
SELECT @g.STDistance(@h);

Ссылка:

Расстояние между двумя точками, использующее тип данных географии в sqlserver 2008?

Вставить запрос

DECLARE @GeoTable TABLE 
(
    id int identity(1,1),
    location geography
)
--Using geography::STGeomFromText
INSERT INTO @GeoTable 
SELECT geography::STGeomFromText('POINT(-122.35900 47.65129)', 4326)

--Using geography::Point
INSERT INTO @GeoTable 
SELECT geography::Point(47.65100,-122.34720, 4326);

Получить дистанционный запрос

DECLARE @DistanceFromPoint geography
SET @DistanceFromPoint =  geography::STGeomFromText('POINT(-122.34150 47.65234)', 4326);

SELECT id,location.Lat Lat,location.Long Long,location.STDistance(@DistanceFromPoint) Distance
FROM @GeoTable;

Ответ 2

Дополнение к вышеизложенному Ответ @ughai

Добавление столбца

 ALTER TABLE [dbo].[Landmark]
 ADD [GeoLocation] GEOGRAPHY
 GO

Преобразование долготы и широт в географию

UPDATE [dbo].[Landmark]
SET [GeoLocation] = geography::STPointFromText('POINT(' + CAST([Longitude] 
AS VARCHAR(20)) + ' ' + 
                CAST([Latitude] AS VARCHAR(20)) + ')', 4326)
GO

Поиск мест в радиусе 2 км

DECLARE @Origin GEOGRAPHY,
    -- distance defined in meters
    @Distance INTEGER = 2000;        


 SET @Origin = GEOGRAPHY::STGeomFromText('POINT(17.482477 78.546871)', 4326);

 -- return all rows from events in 2km radius
SELECT *,GeoLocation.STDistance(@Origin) Distance FROM dbo.Locations WHERE @Origin.STDistance(GeoLocation) <= @Distance;

он работал для меня, чтобы получить места на расстоянии

Ответ 3

Вы можете преобразовать lat и long в точку и сохранить его в таблице.

Объявить @geo Geography, @Lat varchar (10), @long varchar (10)

SET @Lat = '34.738925 'SET @Long =' -92.39764 '

SET @geo = география :: Point (@LAT, @LONG, 4326)