これが私の設定です:
私は次のようなテーブルを持っています:
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が出力に使用する単位を変更する方法はありますか?
次のクエリを使用すると、STDistanceが使用している測定単位に関する明確な回答を得ることができます。たとえば、4326の場合、それはメーターです。
SELECT *
FROM sys.spatial_reference_systems
WHERE spatial_reference_id = 4326
SqlGeometyを使用すると、「投影座標」を処理できます。
あなたの場合、WGS84(4326)でSqlGeometryを使用すると、単位は度になります。したがって、STDistance()、STArea()、...は度を返します。
メートル単位の座標とメートル単位の計算を行うには、メートルを使用する投影座標系(フランスのLambert 93や米国のUTMなど)を使用する必要があります。
幾何学は平らな地図を想定しており、地理学は地球の形をしています。緯度と経度の間の距離は、地球上のどこにいるかによって異なることに注意してください(北極では、経度間の距離は0に近いです)。
大きな違いを引き出したい場合は、コードにさらにいくつかの極端な例を入れてください...北極の近くのポイントと数度離れた別のポイントを選択してください。それを赤道上のいくつかの点と比較してください...幾何学的距離と地理的距離は2つの非常に別個の用語です