如何从SQL Server几何BLOB转换为其他东西?


14

我有来自第三方的CSV数据文件,该文件是导出的SQL Server表。他们只是做了一个,select * from foo然后将结果输出到一个文本文件,然后发送过来。

在他们的表中是Geometry类型的列,因此在我的原始文本中,我有类似“ 0xE610000010C47 ...”之类的信息。此刻,我已将其作为nvarchar加载到SQL Server的表中。

我期望自己最终可以返回到“几何”字段,但这似乎并不容易。 STGeomFromWKB不起作用,因为它实际上不是WKB。我不能将字符串转换为Geometry,因为它抱怨它不是WKT。

因此,有什么办法可以将这个值当作正常的几何BLOB传入SQL Server?我可以告诉SQL Server这样对待它吗?

我发现此链接至少可以帮助我回答有关SQL Server中内容的问题,但并不能完全理解SQLServer 2008的Geometry数据类型的格式是什么?


看起来像WKB(众所周知的二进制文件),上面有一个Esri描述edndoc.esri.com/arcsde/9.1/general_topics/…,但是格式是OGC(开放地理空间联盟),我想使用内置的文件会更容易一些所提供的链接或列出的一个msdn.microsoft.com/en-AU/library/bb933960.aspx上描述的功能,我认为问题在于您已将十六进制字符串作为文本而不是二进制导入了,但是我可以我在那里与SQL后端关系不大。也许您可以在stackexchange上询问超级用户或数据库管理员。
Michael Stimson

@Peter您是否找到这些解决方案来解决您的问题?
DPSSpatial

Answers:


9

当您将数据导入SQL Server时,将其放入VARBINARY(MAX)列。然后,您应该能够根据需要将其投射为Geometry或Geography。您将需要注意,在导入过程中不要更改字符串0xE6...。

另一种选择是进行动态查询以获取选择。我在下面放了几个转换示例。

-- As a varchar and binary
DECLARE @NV AS NVARCHAR(MAX) = '0xE610000001040E0000002AA57BA76F5446C027B8FD971024654007517714795446C00C42473D1624654094CFCDE3795446C0D3F576B91624654068507E9C7A5446C0D7BE805E18246540F2FC444A7C5446C0E93DDF6019246540B4CA4C697D5446C0D5DF5C0D1A2465401A0923AC7C5446C08183DE3F1A2465407599E1907B5446C0E2A8818B1A24654058B4805A7A5446C0A70261DE1A24654089729F5C775446C072080BDD1B2465401AAC24A8745446C057CB10FE1C2465403D16A5446E5446C05A20FEE21A246540658BA4DD685446C00907FFA3172465402AA57BA76F5446C027B8FD971024654001000000020000000001000000FFFFFFFF0000000003' 
DECLARE @NB AS VARBINARY(MAX) = 0xE610000001040E0000002AA57BA76F5446C027B8FD971024654007517714795446C00C42473D1624654094CFCDE3795446C0D3F576B91624654068507E9C7A5446C0D7BE805E18246540F2FC444A7C5446C0E93DDF6019246540B4CA4C697D5446C0D5DF5C0D1A2465401A0923AC7C5446C08183DE3F1A2465407599E1907B5446C0E2A8818B1A24654058B4805A7A5446C0A70261DE1A24654089729F5C775446C072080BDD1B2465401AAC24A8745446C057CB10FE1C2465403D16A5446E5446C05A20FEE21A246540658BA4DD685446C00907FFA3172465402AA57BA76F5446C027B8FD971024654001000000020000000001000000FFFFFFFF0000000003

-- Failing conversions
SELECT CAST(@NV AS Geometry)
SELECT CAST(CAST(@NV AS VARBINARY(MAX)) AS Geometry)
-- Correct conversion
SELECT CAST(@NB AS Geometry)
EXEC('SELECT CAST(' + @NV + ' AS Geometry)')

6

以@MickyT的答案为基础,由于您将要拥有一个表,其值已经位于WKB(或我们所谓的表)中,因此您希望编写将所有记录转换为几何的sql,而不必声明变量等。

因此,如果您从一个简单的临时表开始,它将复制WKB到一条记录中,它将看起来像这样:

select 0x3D0B0000010C80BAE380AE064841005149CD6EFD3941 as wkb

现在,如果您将其视为临时表并包装一些SQL,则其中有一列包含WKB,可以按照上述建议将其转换为varbinary:

select 
cast(temp.wkb as varbinary(max)) as geombinary
from 
(
select 0x3D0B0000010C80BAE380AE064841005149CD6EFD3941 as wkb
) as temp

其中temp.wkb可以是较大表中的列,其中包含来自CSV的WKB值

最后,使用MickyT描述的方法并将varbinary转换为几何:

select 
cast(geomconvert.geombinary as geometry) as geom
 from (
select 
cast(temp.wkb as varbinary(max)) as geombinary
from 
(
select 0x3D0B0000010C80BAE380AE064841005149CD6EFD3941 as wkb
) as temp
) as geomconvert

返回几何和空间结果:

在此处输入图片说明

编辑在哪里声明SRID?正如MickyT回答的那样,它在二进制文件中,您可以在该文件中再包装1个sql查询以进行测试:

select top 1 getsrid.geom.STSrid from (

select 
cast(geomconvert.geombinary as geometry) as geom
 from (
select 
cast(temp.wkb as varbinary(max)) as geombinary
from 
(
select 0x3D0B0000010C80BAE380AE064841005149CD6EFD3941 as wkb
) as temp
) as geomconvert

) as getsrid

在我的示例中,得出的结果是正确的,即2877(科罗拉多州状态平面):

在此处输入图片说明


1
SRID内置在Geometry二进制文件中。提供的二进制文件不是WKB,而是Geometry的实际SQL Servery二进制表示形式。
MickyT

@MickyT啊,是的!我将再发布一个代码段进行测试...谢谢!!!
DPSSpatial

是否可以在原始表中添加“几何”列,并使用“几何”更新该列?
PeterHorsbøllMøller15年

1
@PeterHorsbøllMøller我认为这是正确的举动,一旦转换就可以了。我将对此进行处理,然后再发布。
DPSSpatial 2015年

3

原始海报在这里,当我尝试完成注册时,没有链接原始帖子的登录。无论如何....

感谢您的所有帮助!我将在可能的情况下对每个答案进行投票,如果我能弄清楚如何将该帐户与原始帐户相关联,则可以标记一个答案。另外,在您使用了指针之后,我简直不敢错过使用CONVERT代替CAST。它使它变得容易得多。

我认为我的主要问题是使原始二进制“字符串”成为我可以使用的东西。以下是我如何解决的示例:

DECLARE @data TABLE (
  ID nvarchar(1024),
  ImportedGeometry nvarchar(max),
  FinalGeometry geometry
  )

  INSERT INTO @data (ID, ImportedGeometry) values ('1', '0xE6100000010C4703780B24B855C061C3D32B65093540')
  INSERT INTO @data (ID, ImportedGeometry) values ('2', '0xE6100000010C96438B6CE7D359C0BD5296218E853440')

select 
d.ID,
d.ImportedGeometry,
CONVERT(varbinary(max), d.ImportedGeometry, 1) as ConvertedGeometryBin,
(cast(CONVERT(varbinary(max), d.ImportedGeometry, 1) as geometry)) as FinalGeometry
from @data d

UPDATE @data
SET FinalGeometry = (cast(CONVERT(varbinary(max), ImportedGeometry, 1) as geometry))

select 
d.ID,
d.FinalGeometry,
d.FinalGeometry.STAsText(),
d.FinalGeometry.STSrid
from @data d

看起来不错!!!很好地记录了所有这些……有一天会派上用场!
DPSSpatial 2015年

这确实派上了用场-我们BI部门的一位同事独立地找到了这篇文章,并用它来获取SQL Server Integration Services(SSIS)在服务器之间来回传递几何,这在SSIS中是不存在的! !
DPSSpatial 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.