web-dev-qa-db-ja.com

経度と緯度をSQL Server 2014の地理として保存するにはどうすればよいですか?

私はSQL初心者で、ユーザーの位置を経度と緯度の座標で取得する方法を知っています。私の目標は、距離が2km未満のmyTableからすべての行を選択できるようにすることです。しかし、この目標に向かう途中で、私を混乱させるいくつかのことがあるので、私が理解していないことをリストアップしようとします。

  1. 経度と緯度を使用して地理列内に位置を格納するにはどうすればよいですか(地理的位置が2つではなく1つだけであると想定されているため?経度と緯度の1つではないため?)

  2. 地理的ポイントを取得したので、特定の距離(私の場合は2km)内のすべての行を選択するにはどうすればよいですか?

私はすでにいくつかの同様の質問を見てきましたが、私は絶対的な初心者なので、それらを解決するための事前理解の量は私のSQLの知識を超えています。これは簡単に行うことができますか、誰でも知っていますか?

15
Mattias

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;
15
ughai

上記の回答に加えて@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;

距離内の場所を取得するのに役立ちました

0
Tajkumar

緯度と経度をポイントに変換して、テーブルに保存できます。

@geo Geography、@ Lat varchar(10)、@ long varchar(10)を宣言します

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

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

0
Deepak Singla