我正在尝试将Polygon
数据从 MySQL 提取到我的 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
尝试POINT
构建POLYGON
.
证明:
但!!!POLYGON
通过下一个 SQL 查询,我在 MySQL 中有确切的对象:
SELECT GeometryType(GeomFromText(AsWKT(object))) as `type`,
AsWKT(object) as `data` FROM geo.data
证明:
那是关于BLOB
对象的。
从 System.String 解析几何
BLOB
现在......让我们想象一下带有注释获取的原始来源。
让我们看一下这些行:
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 服务器的数据绑定提供完整的结构。