8 c# mysql geometry serialization blob
我正在尝试Polygon从MySQL 获取数据到我的C#应用程序中.
我在一个表中确切地定义了Polygon地理数据所在的字段.
证明:
SELECT GeometryType(GeomFromText(AsWKT(object))) as `type` FROM geo.data;
Run Code Online (Sandbox Code Playgroud)
返回:

因此表中的对象很好并且正确定义.
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);
Run Code Online (Sandbox Code Playgroud)
我评论过,但这不是告诉你这两个操作的障碍:
BLOB与下一个反序列化一样MySqlGeometry.Parse(System.String)方法解析获取的字符串BLOB检索
好吧,我将从注释的代码部分开始,让我们想象一下,这些行是未注释的,并且没有使用字符串解析的第75行和第76行.
还有另一个更正,发送到MySQL服务器的SQL查询必须如下所示:
SELECT AsWKB(object) as 'object' FROM geo.data
Run Code Online (Sandbox Code Playgroud)
我刚刚将SQL查询函数AsWKT()更改为AsWKB()(从MySQL的文本到二进制格式化程序).
因此,此查询的结果将是:

在线:
var polygon = (byte[])reader["object"];
var obj = new MySqlGeometry(MySqlDbType.Blob, polygon);
Run Code Online (Sandbox Code Playgroud)
您可以看到我正在获取该BLOB对象,然后将其转换为System.Byte[]数组,然后我才尝试构建它MySqlGeomerty,但是非常可惜并且似乎是MySQL库将此对象识别为a POINT,而不是a POLYGON.
证明:

但!!!POLYGON通过下一个SQL查询,我在MySQL中拥有完全对象:
SELECT GeometryType(GeomFromText(AsWKT(object))) as `type`,
AsWKT(object) as `data` FROM geo.data
Run Code Online (Sandbox Code Playgroud)
证明:

这是关于BLOB对象的.
从System.String解析几何
现在......让我们想象一下带注释的原始来源BLOB.
我们来看看这些台词:
var polygon = reader["object"].ToString();
var obj = MySqlGeometry.Parse(polygon);
Run Code Online (Sandbox Code Playgroud)
并将C#app源代码中的SQL查询更改为:
SELECT AsWKT(object) as 'object' FROM geo.data
Run Code Online (Sandbox Code Playgroud)
是的......用于.NET的MySQL库据称提供了另一种几何形状的图形System.String.
但是,当我试图解析var polygon,正如你在上面看到的那样正确检索时,我得到了下一个错误:
System.FormatException: String does not contain a valid geometry value
Run Code Online (Sandbox Code Playgroud)
证明:

所有这些看起来都是这样,MySQL库没有为MySQL服务器提供数据绑定的完整结构.
小智 0
我也在MySQL官方论坛上问过类似的问题,在这里:
http://forums.mysql.com/read.php?38,596620,596620
Oracle 团队的一位男士... Roberto Ezequiel Garcia Ballesteros回答我,MySQL .NET 驱动程序当前不支持这种类型的几何图形:
http://forums.mysql.com/read.php?38,596620,596746#msg-596746
嗨奥列格,
恐怕我们只支持点而不支持多边形。对不起给您带来不便。
干杯,罗伯托