【问题标题】:Get geometry from a varchar(max) in an update query在更新查询中从 varchar(max) 获取几何图形
【发布时间】:2016-08-02 14:38:24
【问题描述】:

我在 varchar(max) 列中有一个充满 WKT(众所周知的文本)的表格。它的格式与几何形状完全相同。因此,例如,其中一个值是:

POLYGON ((174.893529167059 -37.0260462162965,174.89351593407 -37.0260221329151,174.893508034056 -37.0260077002766,174.893444415879 -37.0258916500588,174.893416916056 -37.0258414997842,174.893481733297 -37.0258186834198,174.893492016755 -37.0258150663863,174.89349653254 -37.025823316032,174.893512415978 -37.0258522827285,174.893556883897 -37.0259333832477,174.893591032956 -37.0259956661343,174.893604265986 -37.0260197504078,174.893575149738 -37.0260300006258,174.893529167059 -37.0260462162965))

但是,我需要将此 varchar(max) 字段转换为几何字段。不幸的是,SQL Server 需要一些其他信息才能做到这一点,所以我不能只将字段的类型从 varchar(max) 更改为 geometry。

我在同一个表 (MyGeometry) 中创建了一个空白几何列,但尝试转换它失败了。这是我的代码(其中 2193 是我正在处理的 CRS)。 WKT 是我的 varchar(max) 字段,MyGeometry 是我的新几何字段。

UPDATE       MY_TABLE
SET                MyGeometry = geometry::STPolyFromText('' + WKT + '', 2193)

编辑 - 当前返回说 WKT 无效(System.FormatException 24111 - 输入无效)。

这很奇怪,因为它与我在样式方面的其他一些输入完美匹配。

【问题讨论】:

    标签: sql-server geometry


    【解决方案1】:

    这样可以: 更新我的表 SET MyGeometry = geometry::STGeomFromText('POLYGON ((174.893529167059 -37.0260462162965,174.89351593407 -37.0260221329151,174.893508034056 -37.0260077002766,174.893444415879 -37.0258916500588,174.893416916056 -37.0258414997842,174.893481733297 -37.0258186834198,174.893492016755 -37.0258150663863,174.89349653254 -37.025823316032,174.893512415978 -37.0258522827285,174.893556883897 - 37.0259333832477,174.893591032956 -37.0259956661343,174.893604265986 -37.0260197504078,174.893575149738 -37.0260300006258,174.893529167059 -37.0260462162965))', 0)

    您可以将“POLYGON....”更改为您的 VARCHAR(MAX) 字段。

    最后为 0,仅当您使用地理时才与 SRID 相关。

    【讨论】:

    • 更新 MY_TABLE SET MyGeometry = geometry::STPolyFromText(WKT, 2193)
    • 您不需要在 WKT 上使用双单引号。 WKT 已经是文本。 (假设 WKT 是您的列名)
    • 尝试了UPDATE MY_TABLE SET MyGeometry = GEOMETRY::STPolyFromText(WKT,2193)(以及STGeomFromText)仍然没有运气。也许我那里确实有一些无效的几何图形,但我对此表示怀疑。
    • codeUPDATE MY_TABLE SET MyGeometry = GEOMETRY::STGeomFromText(WKT,2193).MakeValid();
    • 这适用于其中的一些,但不是全部。我认为他们中的一些人一定真的有一些无效的 WKT。
    【解决方案2】:

    你也可以试试:-

    UPDATE  MY_TABLE SET MyGeometry = GEOMETRY::STGeomFromText('POLYGON ((174.893529167059 -37.0260462162965,174.89351593407 -37.0260221329151,174.893508034056 -37.0260077002766,174.893444415879 -37.0258916500588,174.893416916056 -37.0258414997842,174.893481733297 -37.0258186834198,174.893492016755 -37.0258150663863,174.89349653254 -37.025823316032,174.893512415978 -37.0258522827285,174.893556883897 -37.0259333832477,174.893591032956 -37.0259956661343,174.893604265986 -37.0260197504078,174.893575149738 -37.0260300006258,174.893529167059 -37.0260462162965))',4326);
    

    传递的SRID的值应该是4326而不是0

    您可以查看以下网址。我在另一个类似的问题(较早的帖子)中找到了此信息,因此将其粘贴而不做任何更改

    我找到了解决方案,SQL Server 空间工具

    http://sqlspatialtools.codeplex.com/

    以下是解决我问题的方法。

    IsValidGeographyFromText(string inputWKT, int srid)

    检查输入的 WKT 是否可以表示有效的地理位置。此函数要求 WTK 坐标值是经度/纬度值,按此顺序并提供有效的地理 SRID 值。此函数即使在边缘条件下也不会抛出异常(即经度/纬度坐标反转为纬度/经度)。

    SqlGeography MakeValidGeographyFromText(string inputWKT, int srid)

    将输入的 WKT 转换为有效的地理实例。此函数要求 WKT 坐标值是经度/纬度值,按此顺序排列,并提供有效的地理 SRID 值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-16
      • 2012-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-10
      相关资源
      最近更新 更多