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

21

我有经纬度坐标的位置。我的目标是最终能够选择从myTable中距离小于2公里的所有行。

  1. 如何使用经度和纬度将位置存储在地理列中?(因为它只应该是一个地理点,不是两个对吧?不是一个用于经度和一个用于纬度吗?)

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


1
geography::Point() - Damien_The_Unbeliever
4个回答

30
你可以使用 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);

参考链接:

如何使用SQL Server 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;

谢谢,我会试一下! - Mattias
好的,使用这个可以工作,那么我如何插入一种方法来选择特定距离内的所有行呢?我尝试了类似于 WHERE @DistanceFromPoint > 400 的东西,但显然这不是正确的方法,因为它会给我带来错误。再次感谢您的答案! - Mattias
您将使用 WHERE location.STDistance(@DistanceFromPoint) > 400 - ughai
好的,非常感谢!例如它说400,是指公里还是英里? - Mattias
它以米为单位(https://dev59.com/DnA75IYBdhLWcg3wW3y8) - ughai

2

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

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

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

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


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;

对我来说,在距离范围内获取地点的方法是有效的。


0
在处理存储过程和查询中的GeoPoints时,总是需要计算GeoPoint,这变得很烦人。因此,我发现创建一个计算列非常方便,该列可以在选择行时从lat/long FLOAT字段生成一个GeoPoint。
[GeoPoint]  AS ([geography]::Point([Latitude],[Longitude],(4326))) PERSISTED,

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接