私はSQL初心者で、ユーザーの位置を経度と緯度の座標で取得する方法を知っています。私の目標は、距離が2km未満のmyTableからすべての行を選択できるようにすることです。しかし、この目標に向かう途中で、私を混乱させるいくつかのことがあるので、私が理解していないことをリストアップしようとします。
経度と緯度を使用して地理列内に位置を格納するにはどうすればよいですか(地理的位置が2つではなく1つだけであると想定されているため?経度と緯度の1つではないため?)
地理的ポイントを取得したので、特定の距離(私の場合は2km)内のすべての行を選択するにはどうすればよいですか?
私はすでにいくつかの同様の質問を見てきましたが、私は絶対的な初心者なので、それらを解決するための事前理解の量は私のSQLの知識を超えています。これは簡単に行うことができますか、誰でも知っていますか?
Longituteとlatituteを使用して、geography列内の場所を格納するにはどうすればよいですか?
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)
参照リンク:
地理的ポイントを取得したので、特定の距離(私の場合は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);
参照リンク:
sqlserver 2008のGeographyデータ型を使用した2点間の距離?
クエリを挿入
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;
上記の回答に加えて@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
半径2kmsの場所の検索
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;
距離内の場所を取得するのに役立ちました
緯度と経度をポイントに変換して、テーブルに保存できます。
@geo Geography、@ Lat varchar(10)、@ long varchar(10)を宣言します
SET @Lat = '34 .738925 'SET @Long =' -92.39764 '
SET @ geo = geography :: Point(@LAT、@LONG、4326)