Как сохранить longitute & latitude в качестве географии в sql server 2014?

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

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

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

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

2 ответов


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

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

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);

Ссылки:

расстояние между двумя точками с использованием типа данных Geography в 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;

дополнение к вышеуказанному ответу @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

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

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;

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