【问题标题】:How to compare geometry in SQL Server?如何比较 SQL Server 中的几何图形?
【发布时间】:2016-08-22 09:33:02
【问题描述】:

我使用的是 SQL Server 2012。

我的表中有geometry 类型的列:

POINT (34.8780917279395 32.1872894246816)

在另一个表中,我还有一个geometry 类型的列:

0xE6100000010CB3314B4F6570414073F29019F9174040

如何比较这些列,以确定它是否是同一点?

【问题讨论】:

  • 什么数据库?这两种是什么字段类型?
  • @ArtemNovikov 我用的是 SQLServer2012 和几何类型的字段。\
  • 您真的要比较 平等 的分数吗?通常,我希望计算 距离,然后确定它是否“足够接近”以用于您执行比较的任何目的。
  • @Damien_The_Unbeliever 因为它应该是两个相同的点,它们之间的距离必须为 0

标签: sql sql-server gis sqlgeometry


【解决方案1】:

对于第二个表,您需要将点从 WKB 转换为 geom 格式。尝试在下面获取几何图形并与第一点进行比较。

DECLARE @g geometry;   
SET @g = geometry::STGeomFromWKB(0xE6100000010CB3314B4F6570414073F29019F9174040, 0);  
SELECT @g.STAsText();  

【讨论】:

    【解决方案2】:

    这可能不是您将在文档中看到的内容。当我需要比较几何时,我通常会添加第二个几何列,其中包含几何的 MD5 哈希。该比较比传统的几何比较快。 sql语句也变得更清晰了。

    但是,保持 MD5-hash 更新存在额外的复杂性,而且这种方法也可能存在一些缺陷。

    【讨论】:

      【解决方案3】:

      只有在SRIDs 相等时才能比较几何。看看下面的例子(有意扩展):

      WITH Geometries AS
      (
          SELECT
              --Convert to geometry)
              CAST(0xE6100000010CB3314B4F6570414073F29019F9174040 AS geometry) GB,
              --Get SRID          
              CAST(0xE6100000010CB3314B4F6570414073F29019F9174040 AS geometry).STSrid STSrid
      )
      SELECT
          STSrid,--SRID, make sure point 'belongs' to correct SRID
          GB.STDistance(geometry::STPointFromText('POINT(34.8780917279395 32.1872894246816)', STSrid)) Distance
      FROM Geometries
      

      如果点是精确的副本,您也可以比较几何/二进制表示。 STDistance 更灵活。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-07
        • 2021-09-07
        • 1970-01-01
        • 2011-05-18
        相关资源
        最近更新 更多