2

我无法理解 SQL Server 中的数据类型地理位置如何......例如我有以下数据:

0xE6100000010CCEAACFD556484340B2F336363BCA21C0

我知道的:

0x 是十六进制的前缀

最后 16 个数字是经度:B2F336363BCA21C0(十进制格式的双倍)

最后 16 位之前的 16 位数字是纬度:CEAACFD556484340(十进制的双倍格式)

前 4 个数字是 SRID:E610(WGS84 的十六进制)

我不明白的是:

从 5 到 12 的数字:0000010C

这是什么?

从我读到的内容看来,这似乎与 WKB(众所周知的二进制)或 EWKB(扩展的众所周知的二进制)有关,无论如何我无法找到 EWKB 的定义......而对于 WKB,这应该是几何类型(4 字节整数)但该值与几何类型代码不匹配(此示例适用于一个点坐标)

你能帮助理解这种格式吗?

4

2 回答 2

1

SQL Server 中的空间类型(几何和地理)被实现为 CLR 数据类型。与任何此类数据类型一样,直接查询值时会得到二进制表示。不幸的是,它不是(据我所知)WKB,而是微软决定的最适合他们实施的任何格式。对于我们(用户),我们应该使用 MS 已发布的方法的已发布接口(例如地理方法参考)。也就是说,如果您好奇(而不是实际使用它),您应该只尝试破译 MS 二进制表示。

也就是说,如果您需要/想要使用 WKB,您可以!例如,您可以使用STGeomFromWKB()静态方法从您提供的 WKB 创建一个 geography 实例,并且STAsBinary()可以在 geography 实例上调用它以将 WKB 返回给您。

于 2017-03-05T05:56:54.060 回答
0

格式规范可以在这里找到:

https://msdn.microsoft.com/en-us/library/ee320529(v=sql.105).aspx

如该页面所示,它过去经常更改,但在过去 2 年中显着放缓

我目前需要深入研究将 JVM 代码序列化为 bcp 文件的规范,以便我可以使用 SQLServerBulkCopy 而不是普通 JDBC 将数据上传到表中(编写 bcp 文件比使用 JDBC 快 7 倍),但是事实证明这比我最初预期的要复杂。

使用 bcp 进行测试后,您可以通过指定行外格式 (varchar(max)) 来上传地理位置并存储众所周知的文本,SQL Server 会看到这一点并假设您想要基于它看到的 WKT 的地理位置。

于 2018-03-06T21:16:55.453 回答