Как хранить долготу и широту в качестве географии на сервере sql 2014?
Я новичок в sql, который знает, как получить местоположение моих пользователей в координатах долготы и широты. Моя цель состоит в том, чтобы в конечном итоге выбрать все строки из myTable, где расстояние меньше 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)