【问题标题】:Using geometry with srid 4326, what unit of measure does STDistance return?使用带有 srid 4326 的几何,STDistance 返回什么测量单位?
【发布时间】:2014-08-12 17:58:40
【问题描述】:

这是我的设置:

我有一张桌子,例如:

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 用于输出的单位的方法?

【问题讨论】:

标签: sql sql-server geospatial


【解决方案1】:

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

SELECT *
FROM sys.spatial_reference_systems
WHERE spatial_reference_id = 4326

【讨论】:

  • 返回米
  • 实际上,至少在 PostgreSQL 10.6 中,查询SELECT srtext FROM public.spatial_ref_sys WHERE srid = 4326; 返回UNITs 类型为"degree"
  • 巧合的是,即使 SQL Server 的查询 返回“米”,查看我的数据显示它度!这么多确定性。
  • 这如何回答geography::STDistancegeometry::STDistance之间单位差异的问题
【解决方案2】:

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

在您的情况下,使用带有 WGS84 (4326) 的 SqlGeometry,您的单位是度数。 所以 STDistance(), STArea(), ... 将返回度数。

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

【讨论】:

    【解决方案3】:

    几何学采用平面地图,地理学采用地球的形状。请记住,纬度和经度之间的距离取决于您在地球上的位置(在北极,经度之间的距离接近 0)。

    如果您想找出最大的差异,请在您的代码中添加一些更极端的示例...选择北极附近的一个点,再选择几度以外的另一个点。将其与赤道上的几个点进行比较...几何距离和地理距离是两个非常独立的术语

    【讨论】:

    • 是的,我开始觉得我在这方面被误导了......我读过一篇文章,其中一个人选择使用几何而不是地理来提高性能到你可以用geom设置的边界框,但我猜他正在查询一个非常小的数据集和小距离..我在距离@ 10英里及以下的距离上使用srid 4326的几何得到2倍的结果......我也没有看到任何真正的收获,所以我想我可能会放弃这个......
    • 我猜这取决于您要查找的内容。如果您要最接近另一个点,那么几何图形会很好地工作,因为它们是相对于彼此的。如果您正在寻找以米为单位的距离,则不能依赖几何。您的问题似乎与所问的问题不同……您这样做是为了提高性能吗?
    • 或多或少,但这是问题所在,以及为什么这不起作用:几何:244,853,地理:115,450 ....最初的问题是我运行了一个带有 3 个不同的查询地理多边形并得到一些非常奇怪的结果,当我使用几何运行相同的查询时,结果似乎“正确”。 (在那种情况下,它们比地理少 10 倍......)加上 sql server 不会呈现地理结果,所以我通过视觉确认几何查询似乎在空间结果查看器的情况下正常运行......
    猜你喜欢
    • 2022-07-09
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多