【发布时间】:2013-10-09 00:16:56
【问题描述】:
我正在尝试从 MySQL 获取 Polygon 数据到我的 C# 应用程序中。
我已经在一张表中准确定义了地理数据所在的Polygon 字段。
证明:
SELECT GeometryType(GeomFromText(AsWKT(object))) as `type` FROM geo.data;
返回:
所以表中的对象很好,并且定义正确。
C#中有源代码:
主线是(73-76):
//var polygon = (byte[])reader["object"];
//var obj = new MySqlGeometry(MySqlDbType.Blob, polygon);
var polygon = reader["object"].ToString();
var obj = MySqlGeometry.Parse(polygon);
我已经评论过,但这并不是向您介绍这两种操作的障碍:
- 通过下一次反序列化检索为
BLOB - 通过
MySqlGeometry.Parse(System.String)方法解析获取的字符串
BLOB 检索
好吧,我将从代码的注释部分开始,让我们想象一下,这些行没有注释,并且没有第 75 行和第 76 行进行字符串解析。
还有另一个更正,发送到 MySQL 服务器的 SQL 查询必须如下所示:
SELECT AsWKB(object) as 'object' FROM geo.data
我刚刚在 SQL 查询中将函数 AsWKT() 更改为 AsWKB()(在 MySQL 中从文本格式转换为二进制格式)。
所以,这个查询的结果是:
在行:
var polygon = (byte[])reader["object"];
var obj = new MySqlGeometry(MySqlDbType.Blob, polygon);
您可以看到我正在获取 BLOB 对象,然后将其转换为 System.Byte[] 数组,然后我才尝试构建 MySqlGeomerty,但很遗憾,似乎就是这样MySQL 库将此对象标识为POINT,而不是POLYGON。
证明:
但是!!!通过下一个 SQL 查询,我在 MySQL 中有确切的 POLYGON 对象:
SELECT GeometryType(GeomFromText(AsWKT(object))) as `type`,
AsWKT(object) as `data` FROM geo.data
证明:
那是关于 BLOB 对象的。
从 System.String 解析几何
现在...让我们想象一下带有评论的BLOB fetching 的原始来源。
让我们看看行:
var polygon = reader["object"].ToString();
var obj = MySqlGeometry.Parse(polygon);
并且应将 C# 应用程序源代码中的 SQL 查询更改为:
SELECT AsWKT(object) as 'object' FROM geo.data
是的...用于 .NET 的 MySQL 库据称提供了另一种几何造型,来自 System.String。
但是,当我尝试解析 var polygon(正如您在上面看到的那样正确检索)时,我遇到了下一个错误:
System.FormatException: String does not contain a valid geometry value
证明:
所有这些看起来,MySQL 库都没有为来自 MySQL 服务器的数据绑定提供完整的结构。
【问题讨论】:
标签: c# mysql serialization geometry blob