Python 解析MSDN几何数据类型

Python 解析MSDN几何数据类型,python,parsing,geometry,gis,msdn,Python,Parsing,Geometry,Gis,Msdn,我有一个数据库,其中一个字段给出空间坐标。我了解到该字段是序列化的MSDN几何体数据类型() 我想从Python访问这个数据库,我想知道是否有人知道几何体数据类型的格式,或者是否有任何库能够在Python中将其解析为一组地理坐标 该链接指出,Microsoft在设计该数据类型时使用了“开放地理空间联盟(OGC)标准”,这是否意味着空间坐标由该标准定义 还有其他人有这方面的经验吗 任何帮助都将不胜感激 如下面的评论所示(谢谢MarkJ!): 几何体是.NET数据类型,但使用自己的自定义序列化格式

我有一个数据库,其中一个字段给出空间坐标。我了解到该字段是序列化的MSDN几何体数据类型()

我想从Python访问这个数据库,我想知道是否有人知道几何体数据类型的格式,或者是否有任何库能够在Python中将其解析为一组地理坐标

该链接指出,Microsoft在设计该数据类型时使用了“开放地理空间联盟(OGC)标准”,这是否意味着空间坐标由该标准定义

还有其他人有这方面的经验吗


任何帮助都将不胜感激

如下面的评论所示(谢谢MarkJ!):

  • 几何体是.NET数据类型,但使用自己的自定义序列化格式;您可以选择整个列,然后通过在Reflector中打开Microsoft.SqlServer.Types.dll并从
  • 或者,您可以使用SQL server对该类型的支持从数据库中读取几何体数据的属性,例如从myTable中选择geocolumn.STX、geocolumn.STY
  • 或者您可以将整个值导出为,例如从myTable中选择geocolumn.AsGml()可由Python几何体库(如
我原本以为SQL Server将CLR数据类型作为序列化的.NET对象直接存储在表中,但结果证明这是错误的

“…如果有人知道几何体[数据类型]的格式…”

SQL Server的空间
几何体
地理
类型的二进制序列化格式在此处指定:

指定SQL Server管理的地理、几何、层次ID和CLR用户定义类型(UDT)结构的二进制格式

该规范编写得很好,二进制格式也很容易理解,因此自己实现二进制格式的基本解析器应该不会有太大问题

“…或任何能够在Python中将其解析为一组[地理坐标]的库…”

通过.NET interop使用Microsoft.SqlServer.Types反序列化这些类型: 如果您不想实现自己的反序列化程序(应该相当简单),但可以找到一种从Python(可能是通过?)与.NET程序集交互的方法,然后,以下提示可能会引起兴趣:

两种T-SQL类型
GEOMETRY
GEOGRAPHY
是作为.NET程序集(
Microsoft.SqlServer.types
)和非托管DLL(
SqlServerSpatial….DLL
)的组合实现的,后者执行上述二进制格式的反序列化操作,并包含几乎所有其他内容(即空间操作的例程)

如果您只对反序列化SQL Server空间数据感兴趣,并且注意不要在
SqlGeometry
SqlGeography
上调用任何空间函数,那么您可能可以使用
Microsoft.SqlServer.Types
为您反序列化空间二进制数据

Microsoft.SqlServer.Types
SqlServerSpatial….dll
可以作为.NET项目范围或系统范围的dll提供。此外,dll也会随SQL Server自动安装

已知文本(WKT)和已知二进制(WKB): 另一种选择是让SQL Server使用
选择geometryColumn.statext()
选择geometryColumn.StatInary()
将空间值转换为众所周知的文本(WKT)或
众所周知的二进制文件(WKB),然后查找可以解析这些标准交换格式的Python库


(警告一句:如果你沿着这条路线走下去,请小心你的数据是否包含圆弧。WKT和WKB数据格式有不同的版本。它们最初是作为开放地理空间联盟的简单要素访问规范的一部分指定的;该版本不了解圆弧。支持圆弧SQL/MM第3部分:空间标准中添加了曲线段,SQL Server实现了该标准。)

我明白-谢谢。我会有一个剧本,但微软的人究竟为什么会认为将一个对象序列化到数据库表是个好主意?这打破了分离规则!@nickcartwright@Rup内容不是序列化的.NET对象,而是几何体的表示。这是一件非常好的事情,因为这意味着你可以n使用SQL进行空间查询,例如“列出此办公室10英里内的所有客户”或“将客户加入办公室,以便每个客户与其最近的办公室配对”我对Python几何体支持或SQL server支持一无所知,但我希望Python SQL server连接能够将SQL server几何体转换为Python几何体。@MarkJ好的,我不是100%确定它是如何存储的,但它是一个.NET对象“平面空间数据类型geometry是作为公共语言运行库(CLR)实现的。”SQL Server中的数据类型。“如果在management studio中选择整列,则会得到一个二进制blob。我本来打算按原样选择一列,然后将其输入BinarySerializer,但SqlClient类会自动返回一个SqlGeometry对象,因此我无法从中得出任何结论。好吧,我错了-它是二进制序列化的,但不是作为一个整体对象。O在Reflector中打开Microsoft.SqlServer.Types.dll并查看SqlGeometry的Read()方法。使用GML格式可能会做得更好,您的类中可能已经支持GML格式
select geocolumn.AsGml()从myTable
中,可以复制Reflector中的SqlGeometry解析逻辑。好吧,我也错了,它是一个.Net对象!我想我的观点是,底层表示并不真正相关。“Microsoft的家伙”为在SQL Server中处理几何体提供了更高级别的抽象,这就是