如何在sql server 2014中将经度和纬度存储为地理位置?

Mat*_*ias 14 sql sql-server-2014

我是一个sql初学者,知道如何在经度和纬度坐标中获取我的用户位置.我的目标是最终能够从myTable中选择距离小于2km的所有行.然而,在我实现这一目标的过程中,有些事情让我困惑,所以我会尝试列出我无法理解的内容.

  1. 我如何使用经度和纬度在地理列中存储位置?(因为它应该只是一个地理点而不是两个权利?不是一个经度而一个是纬度?)

  2. 现在我已经获得了地理点,我如何选择特定距离内的所有行(在我的情况下为2km)?

我已经看到了一些类似的问题,但是解决它们的预先理解的数量超出了我的sql知识,因为我是一个绝对的初学者,这可以轻松完成,任何人都知道如何?

ugh*_*hai 17

我怎样才能利用这个长篇大论来存储地理栏目中的位置?(因为它应该只是一个地理点而不是两个权利?不是一个地方,一个是妓女,一个是妓女?)

您可以使用geography::STPointFromText/ geography::Point以地理数据类型存储经度和纬度.

SELECT geography::STPointFromText('POINT(' + CAST([Longitude] AS VARCHAR(20)) + ' ' + CAST([Latitude] AS VARCHAR(20)) + ')', 4326)
Run Code Online (Sandbox Code Playgroud)

要么

SELECT geography::Point(Latitude, Longitude , 4326)
Run Code Online (Sandbox Code Playgroud)

参考链接:

在表格中更新地理列

现在我已经获得了地理点,我如何选择特定距离内的所有行(在我的情况下为2km)?

你可以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);
Run Code Online (Sandbox Code Playgroud)

参考链接:

sqlserver 2008中使用Geography数据类型的两点之间的距离?

插入查询

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);
Run Code Online (Sandbox Code Playgroud)

获取距离查询

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;
Run Code Online (Sandbox Code Playgroud)