web-dev-qa-db-ja.com

srid 4326でジオメトリを使用すると、STDistanceはどの測定単位を返しますか?

これが私の設定です:

私は次のようなテーブルを持っています:

Id, Lat, Long, GeoPoint, GeomPoint

GeoPoint(geography)とGeomPoint(geometry)の両方がSRID4326に設定されています

私は次のクエリを持っています:

    DECLARE @radiiCollection TABLE 
      ( [ID]       INT IDENTITY(1, 1) PRIMARY KEY, 
       [Radius]   GEOMETRY, 
       [RefPoint] GEOMETRY, 
       [RefAddr]  VARCHAR(255), 
       [MinLat]   VARCHAR(255), 
       [MaxLat]   VARCHAR(255), 
       [MinLng]   VARCHAR(255), 
       [MaxLng]   VARCHAR(255)) 

    DECLARE @point GEOMETRY = geometry::Point(-111.84493459999999, 33.3902569, 4326) 
    DECLARE @gpoint GEOGRAPHY = geography::Point(33.3902569, -111.84493459999999, 4326);

    INSERT INTO @radiicollection 
                (radius, 
                 refpoint, 
                 refaddr, 
                 maxlat, 
                 maxlng, 
                 minlat, 
                 minlng) 
    VALUES      ( @point.MakeValid().STBuffer(16093.40), 
                  @point, 
                  '10 miles of 85210', 
                  33.51734689767781, 
                  -111.6923852740045, 
                  33.26298081643247, 
                  -111.99703818130439 ) 

    SELECT 
      GeomPoint, 
      GeoPoint
     INTO #temp 
    FROM ( 
      SELECT row_number() OVER ( 
          PARTITION BY [ds].[ADDR], 
          [ds].[APT], 
          [ds].[Zip] ORDER BY [ds].[IND_ID] ASC 
          ) recid1, rGeop1.geompoint, rgeop1.GeoPoint 
      FROM [r].[main] ds 
      JOIN [r].[GeoPoint] rGeoP1 
        ON rGeoP1.[UID] = ds.[UID] 
      JOIN @radiiCollection rr 
        ON GeomPoint.STWithin(rr.radius) = 1 
      WHERE 1 = 1 
        AND ( 
          ( 
            ( 
              ( 
                try_cast(latitude AS DECIMAL(9, 1)) BETWEEN CONVERT(DECIMAL(9, 1), 33.26298081643247)
                  AND CONVERT(DECIMAL(9, 1), 33.51734689767781) 
                AND try_cast(longitude AS DECIMAL(9, 1)) BETWEEN CONVERT(DECIMAL(9, 1), - 111.99703818130439)
                  AND CONVERT(DECIMAL(9, 1), - 111.6923852740045) 
                ) 
              ) 
            ) 
          ) 
      ) f 
    WHERE recid1 = 1

したがって、両方をプルしてから、GeoPointとGeomPointの両方のSTDistanceを次のようにプルします。

select top 10 
 try_cast(GeoPoint.STDistance(@gpoint) as  float) DistanceGeo,
 try_cast(GeoMPoint.STDistance(@point.MakeValid()) as float) DistanceGeom
from #temp

しかし、私が得ているのは少し奇妙です:

    DistanceGeo     DistanceGeom
    -----------------------------------------
    10495.1674191715    0.111544285781801
    10249.4175883919    0.100540150724826
    12307.1907929483    0.1262738924781
    11804.655587608     0.116453906202276
    10249.4175883919    0.100540150724826
    9607.03640753812    0.101614826463312
    11130.8413059431    0.100596791997409
    10249.4175883919    0.100540150724826
    6973.69243171186    0.0644901191669685
    9605.88647121359    0.0967178499759486

私が理解していることから、SRIDは空間列の測定単位を決定しますが、明らかに、これらは両方ともSRID 4326であるため、そうではありませんか?どんな助けでもいただければ幸いです。 I believeここで表示されているのは、メートルではなく度です。 SQLで度をメートルに変換する簡単な方法はありますか?または、STDistanceが出力に使用する単位を変更する方法はありますか?

13
zach

次のクエリを使用すると、STDistanceが使用している測定単位に関する明確な回答を得ることができます。たとえば、4326の場合、それはメーターです。

SELECT *
FROM sys.spatial_reference_systems
WHERE spatial_reference_id = 4326
10
Morgan Thrapp

SqlGeometyを使用すると、「投影座標」を処理できます。

あなたの場合、WGS84(4326)でSqlGeometryを使用すると、単位は度になります。したがって、STDistance()、STArea()、...は度を返します。

メートル単位の座標とメートル単位の計算を行うには、メートルを使用する投影座標系(フランスのLambert 93や米国のUTMなど)を使用する必要があります。

2
XavierFischer

幾何学は平らな地図を想定しており、地理学は地球の形をしています。緯度と経度の間の距離は、地球上のどこにいるかによって異なることに注意してください(北極では、経度間の距離は0に近いです)。

大きな違いを引き出したい場合は、コードにさらにいくつかの極端な例を入れてください...北極の近くのポイントと数度離れた別のポイントを選択してください。それを赤道上のいくつかの点と比較してください...幾何学的距離と地理的距離は2つの非常に別個の用語です

1
Twelfth