【问题标题】:What is SRID 0 for geometry columns?几何列的 SRID 0 是什么?
【发布时间】:2014-08-07 16:51:10
【问题描述】:

所以我将几何列添加到空间表并使用一些 msdn 引用我最终将 SRID 指定为 0,如下所示:

  update dbo.[geopoint] set GeomPoint = geometry::Point([Longitude], [Latitude], 0) 

但是,我认为这是一个错误,但在必须更新列之前,0 实际上是默认值 = 4326 吗?只要我在查询中将 SRID 指定为 0,查询就可以工作,但与我拥有的地理字段相比,我得到了奇怪的结果...... SRID 0 在 sys.spatial_reference_systems 中不存在,我无法挖掘任何关于它的信息。任何帮助将不胜感激。

【问题讨论】:

    标签: sql sql-server geospatial


    【解决方案1】:

    从技术上讲,SRID 为 0 并不存在,它只是意味着没有 SRID——即,如果您忘记设置它,则为默认值。因此,从技术上讲,您仍然可以执行距离、相交和所有其他查询,只要这两组几何的 SRID 为 0。如果您有一个 SRID 为 0 的几何字段和另一个具有实际存在的 SRID 的字段,你很可能会得到非常奇怪的结果。我记得在这种情况下没有从空间查询中获得任何结果时我挠了挠头,而 SQL Server 没有抱怨,只有 0 个结果(对于值得的东西,Postgis 实际上会失败,并发出关于不匹配 SRID 的警告)。

    在我看来,您应该始终明确设置几何(或地理,自然始终为 4326)的 SRID,因为它不仅可以防止奇怪的查询结果,而且意味着您可以从一个坐标系转换为其他。能够从 lat/lon (4326) 即时转换为 Spherical Mercator (3857),如在 Google Maps/Bing 中使用的那样,以米为单位,或一些本地坐标系,例如 27700,英国国家网格,也以米为单位,可能非常有用。据我所知,SQL Server 不支持从一种 SRID 转换为另一种,但由于空间类型本质上是 CLR 类型,因此如果您需要这样做,可以使用 .NET 库,请参阅Transform/ Project a geometry from one SRID to another 以获取示例。

    如果您决定更改几何形状,您可以执行以下操作:

    UPDATE your_table SET newGeom = geometry::STGeomFromWKB(oldGeom.STAsBinary(), SRID);
    

    这将创建一个新列或就地执行:

    UPDATE geom SET geom.STSrid=4326;
    

    其中 4326 只是一个示例 SRID。

    http://spatialreference.org/ 上有一个很好的 SRID 参考,尽管这与您在 sys.spatial_reference_systems 中找到的信息基本相同。

    【讨论】:

    • 您是否只是接受然后不接受此答案(显然是您的特权)。我问是因为我的编辑同时消失了,所以我不知道 SO 是否有暂时的问题,或者您是否认为答案在某种程度上缺乏。
    • 谢谢,重新编码当时的列 :-) -- 我确实接受并取消接受然后重新接受,因为我要发布后续信息,但我没有任何数据可以询问我的下一个问题——我首先添加几何列的原因是我在使用地理运行多点半径计数时得到了非常奇怪的结果,结果实际上是使用几何计算的结果的 10%(请注意,srid 为 0。 .)...但我会等到我重新转换列。
    • 我现在更多地使用 Postgis,它比 SQL Server 更麻烦,但也允许动态重新投影。我有一个包含 4.5 亿行的表,我在创建它时忘记设置 SRID。它仍然让我很痛苦,因为在更新期间我没有空间来重写表。我会解决它,但故事的寓意总是设置 SRID :-)
    • 虽然设置 SRID 绝对是个好主意,但几何与地理的问题是另一个问题。我建议你阅读这篇文章,msdn.microsoft.com/en-us/library/bb964711.aspx,如果你还没有的话。
    • 明白,一旦我重新编码了这些代码,如果我仍然看到不稳定的结果,我会跟进。如果我的目标是 +/- 5%,那没关系,使用0 SRID 我在 +120% :P.
    【解决方案2】:

    SRID 是一种考虑到您测量的距离不是在一个平坦的无限平面上而是在一个长椭圆体上的方法。它们对 geography 数据类型有意义,但对几何没有意义。因此,如果您正在进行地理计算(作为“与我拥有的地理领域相比”的陈述),请创建地理点而不是几何点。为了对任何地理空间数据进行计算(例如“查找从这一点到另一点的距离”),所涉及的所有对象的 SRID 必须相同。

    TL;DR: 点在笛卡尔平面上吗?使用几何。点在地球上吗?使用地理。

    【讨论】:

    • 我很确定这是不正确的。几何和地理都有 STSrid 方法(msdn.microsoft.com/en-us/library/bb933851.aspxmsdn.microsoft.com/en-us/library/cc280766.aspx)。有很多使用笛卡尔平面的投影 SRID 示例,例如UTM、State Planar 等。另外,如果我错了,请纠正我,但我相信您可以将地理用于投影坐标(以及几何),但不能将几何用于大地坐标。
    • 我愿意在这里犯错。但是本着教育的精神,在几何示例中,哪里可以找到 SRID 的定义呢?也就是说,SRID 13 和 23 的 WKT 在哪里?它们肯定不在 sys.spatial_reference_systems 中,谷歌搜索也没有发现任何东西。
    • 是的,那些不是有效的 SRID,例如,我希望那些只是自定义的 SRID。我做了一个实验来检查,我实际上能够将地理 SRID(在本例中为 4326)插入几何列,这对我来说非常奇怪。然而,这确实表明我上面所说的部分不正确。尽管您断言将 SRID 用于几何类型没有意义,但我仍然会提出异议,因为投影 SRID 中的任何操作都只是普通的旧欧几里得几何。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    相关资源
    最近更新 更多