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

时间:2015-05-19 10:23:02

标签: sql sql-server-2014

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

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

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

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

4 个答案:

答案 0 :(得分:12)

  

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

您可以使用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)

参考链接:

Update Geography column in table

  

现在我已经获得了地理位置,如何选择特定距离内的所有行(在我的情况下为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);

参考链接:

Distance between two points using Geography datatype in 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;

答案 1 :(得分:0)

上述答案@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;

对我来说,要在远处找到位置

答案 2 :(得分:0)

您可以将经度和纬度转换为点并将其保存在表中。

声明@geo地理, @lat varchar(10), @long varchar(10)

SET @Lat = '34 .738925' SET @Long ='-92.39764'

SET @ geo = geography :: Point(@LAT,@LONG,4326)

答案 3 :(得分:0)

在存储过程和选择中使用GeoPoints时,总是计算GeoPoint变得很累,所以我发现创建一个计算列很方便,该列从经纬度{{ 1}}被选择的行,当字段。

GeoPoint