我有一个数据库,其中一个字段给出空间坐标。我了解到该字段是序列化的MSDN几何数据类型(http://msdn.microsoft.com/en-us/library/bb933973.aspx)。
我想从Python访问这个数据库,并且如果有人知道几何数据类型的格式,或者任何能够将其解析为Python中的一组地理坐标的库,那么它就会徘徊。
链接指出Microsoft在设计此数据类型时使用了“开放地理空间联盟(OGC)标准”,这是否意味着空间坐标是由此标准定义的?
是否有其他人有此经验?
非常感谢任何帮助!
答案 0 :(得分:3)
如下面的评论所示(感谢MarkJ!):
select geocolumn.STX, geocolumn.STY from myTable;
select geocolumn.AsGml() from myTable;
可以由Python几何库处理,例如http://gispython.org/ http://mapnik.org/ http://www.qgis.org/wiki/Python_Bindings 我原本以为SQL Server将CLR数据类型直接存储在表中的序列化.NET对象中,但事实证明这是错误的。
答案 1 :(得分:1)
" ...如果有人知道几何[数据类型]的格式......"
此处指定了SQL Server的空间GEOMETRY
和GEOGRAPHY
类型的二进制序列化格式:
[MS-SSCLRT]: Microsoft SQL Server CLR Types Serialization Formats
"指定由SQL Server管理的GEOGRAPHY,GEOMETRY,HIERARCHYID和CLR用户定义类型(UDT)结构的二进制格式。"
这个规范编写得很好,二进制格式很容易理解,因此自己实现二进制格式的基本解析器不应该是一个很大的问题。
" ...或任何能够在Python中将其解析为一组[地理坐标]的库..."
Microsoft.SqlServer.Types
反序列化这些类型:如果您不想实现自己的反序列化程序(这应该相当简单),但您可以找到一种从Python与.NET程序集交互的方法 - 也许是通过pythonnet? - ,然后可能会有以下提示:
两个T-SQL类型GEOMETRY
和GEOGRAPHY
实现为.NET程序集(Microsoft.SqlServer.Types
)的组合,它执行从/到二进制格式的解/序列化刚才提到的,以及一个非托管DLL(SqlServerSpatial….dll
),其中包含几乎所有其他内容(即空间操作的例程)。
如果您只对反序列化SQL Server空间数据感兴趣,并且注意不要在SqlGeometry
或SqlGeography
上调用任何空间函数,那么您可能是能够使用Microsoft.SqlServer.Types
为您反序列化空间二进制数据,然后inspecting it with an implementation of IGeometrySink110
that you have to provide to e.g. the SqlGeometry.Populate
method。
Microsoft.SqlServer.Types
和SqlServerSpatial….dll
既可以作为.NET项目范围NuGet package使用,也可以作为系统范围MSI installation package (SQLSysClrTypes.msi
)使用。 AFAIK DLL也会自动与SQL Server一起安装。
另一个选择是让SQL Server使用Well-Known Binary
或SELECT geometryColumn.STAsText()
将空间值转换为已知文本(WKT)或SELECT geometryColumn.STAsBinary()
(WKB),然后查找Python可以解析这些标准交换格式的库。
(提醒一句:如果您沿着这条路走下去,请注意,如果您的数据包含圆弧。有不同版本的WKT和WKB数据格式。它们首先被指定为简单功能访问规范的一部分开放地理空间联盟的开放;该版本对圆弧没有了解。在SQL / MM第3部分:空间标准中添加了对圆形曲线段的支持,SQL Server实现了这一点。)