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

问题描述 投票:0回答:4

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

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

  2. 现在我已经有了地理点,我如何选择特定距离(在我的例子中为2公里)内的所有行?

sql sql-server-2014
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);

参考链接:

在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
投票

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

Declare @geo Geography,
@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
变得很累人,所以我发现创建一个计算列很方便,当行是时,它可以从纬度/经度
GeoPoint
字段生成
FLOAT
已选择。

[GeoPoint]  AS ([geography]::Point([Latitude],[Longitude],(4326))) PERSISTED,
© www.soinside.com 2019 - 2024. All rights reserved.