我有经度和纬度坐标的位置。我的目标最终是能够从 myTable 中选择距离小于 2 公里的所有行。
如何使用经度和纬度在地理列中存储位置?(因为它应该只有一个地理点而不是两个,对吗?不是一个经度一个纬度?)
现在我已经有了地理点,我如何选择特定距离(在我的例子中为2公里)内的所有行?
我如何使用经度和纬度在地理列中存储位置?(因为它应该只是一个地理点而不是两个对吗?不是一个经度和一个纬度?)
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;
您可以将纬度和经度转换为一个点并将其保存在表格中。
Declare @geo Geography,
@Lat varchar(10),
@long varchar(10)
SET @Lat = '34.738925'
SET @Long = '-92.39764'
SET @geo= geography::Point(@LAT, @LONG, 4326)
除了上述答案@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;
它对我来说很有效,可以到达远处的地方
在存储过程和选择中使用 GeoPoints 时,总是计算
GeoPoint
变得很累人,所以我发现创建一个计算列很方便,当行是时,它可以从纬度/经度 GeoPoint
字段生成 FLOAT
已选择。
[GeoPoint] AS ([geography]::Point([Latitude],[Longitude],(4326))) PERSISTED,