使用SRID 4326的几何图形,STDistance返回什么度量单位?

20

这是我的设置:

我有一个如下的表:

Id, Lat, Long, GeoPoint, GeomPoint

GeoPoint(地理)和 GeomPoint(几何)都设置为 SRID 4326。

我有以下查询:

    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,那就不是这种情况了吗? 如果有帮助会很感激。我认为我在这里看到的是度数而不是米。在SQL中有没有一种简单的方法将度数转换为米?或者改变STDistance输出的单位的方法?


4
有一个gis.stackexchange.com网站,你更有可能得到一个好的答案。 - flup
3个回答

18

通过以下查询,您可以获得有关STDistance使用的度量单位的明确答案。对于4326(例如),它是米。

SELECT *
FROM sys.spatial_reference_systems
WHERE spatial_reference_id = 4326

这将返回米。 - gls123
6
实际上,在至少 PostgreSQL 10.6 中,查询 SELECT srtext FROM public.spatial_ref_sys WHERE srid = 4326; 返回类型为“度”的 UNIT - jasmyace
9
巧合的是,尽管SQL Server返回“米”作为查询结果,但查看我的数据表明它实际上是度数!所以这个结果并不可靠。 - Auspex
这个问题的答案是什么,解释了geography::STDistancegeometry::STDistance之间单位差异的区别? - CervEd

6

使用SqlGeomety时,您正在处理“投影坐标”。

在您的情况下,使用WGS84(4326)的SqlGeometry,您的单位是度。 因此,STDistance(),STArea()等将返回度数。

您必须使用使用米为单位的投影坐标系(例如法国的Lambert 93或美国的UTM)才能获得以米为单位的坐标和计算。


1
几何学假设地图是平面的,而地理学则考虑地球的形状。请记住,纬度和经度之间的距离取决于您所处的地球位置(在北极,经度之间的距离接近0)。
如果您想突出差异,请在代码中添加一些极端的例子......选择靠近北极的一个点和另一个离它几度的点。将其与赤道上的几个点进行比较......几何距离和地理距离是两个非常不同的术语。

是的,我开始觉得自己在这个问题上被误导了...我之前读过一篇文章,一个人选择使用几何图形代替地理图形以获得性能提升,因为你可以使用geom设置边界框,但我猜他查询的数据集很小,距离也很小...我使用SRID 4326的几何图形在10英里及以下距离范围内会得到2倍的结果...我也没有看到任何真正的收益,所以我想我可能会放弃这个... - zach
取决于你想要什么,我猜。如果你想找到最接近另一个点的点,那么几何学就可以很好地解决,因为它们是相对的。如果你想要以米为单位的距离,你不能依赖几何学。你似乎有一个不同于所问的问题...你是为了性能而这样做吗? - Twelfth
或多或少,但这里的问题是为什么这样行不通:几何:244,853,地理:115,450...最初的问题是我运行了一个带有3个不同地理多边形的查询,并得到了一些非常奇怪的结果,当我使用几何图形运行相同的查询时,结果似乎是“正确的”。 (在那种情况下,它们比地理数据小10倍...)此外,SQL Server不会呈现地理结果,因此我通过空间结果查看器获得了视觉确认,似乎几何查询正在正确运行... - zach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接