你好我想问一下之前做的WKB的解析方面的问题

正下雨和雪 发布于 2016/06/08 22:32
阅读 212
收藏 0

@八风不动 你好,想跟你请教个问题:我在sql server2008中存储了geography和geometry类型的数据,然后在从数据库中将数据读取出来,得到数据的经纬度坐标或者平面的坐标,但是利用C#进行读取时,总是提示读取的WKB无效。

//下面的sysql2是向数据库中插入一行数据,插入后geometry对应的字段线的值为LINESTRING(100 100,200 200),输入的是下面的紫色的值

 string sysql2="set identity_insert 一层注释 on DECLARE @g geometry,@g1 geography; "+"SET @g = geometry::STLineFromWKB(0x0102000000020000000000000000005940000000000000594000000000000069400000000000006940, 0);"+"set @g1=geography::STPointFromText('POINT(-122.360 47.656)', 4326); "+ "insert into 一层注释([ID],[Layer],[Text],[POINT_X],[POINT_Y],[POINT_Z],[geom],[charu],[geome]) values(0,'PUB_TEXT','实验',30,30,30,@g1,@g.STAsText(),@g);";


  string sysql="select * from 一层注释 where ID=0";
  SqlCommand sc = new SqlCommand(sysql,con);

 sc.ExecuteNonQuery();


                SqlDataReader sdr = sc.ExecuteReader();
                while (sdr.Read())
                {

//sdr.GetSqlBytes(8)对应的就是geometry类型的数据,
                    System.Data.SqlTypes.SqlBytes sqlbytes = sdr.GetSqlBytes(8);
                    byte[] sy = sqlbytes.ToSqlBinary().Value;
                    //sy的长度为38,sy中的值依次为0,0,0,0,1,20,0,0,0,0,0,0,89,64,0,0,0,0,0,0,89,64,0,0,0,0,0,0,105,64,0,0,0,0,0,0105,64,和我想象中的不相同,因为数据库中显示的是LINESTRING(100 100,200 200)
                    MessageBox.Show(sdr.GetSqlString(1).Value + "" + sy.Length);
                    for (int i = 0; i < sy.Length; i++)
                    {
                        //根据下面输出的值可以知道这里是按照每两位16进制进行16进制到十进制的变换的
                        MessageBox.Show(sy[i] + "");
                    }
//下面的句子中总是提醒熟知二进制输入无效                   

 SqlGeography sg = SqlGeography.STGeomFromWKB(sqlbytes, 4236);

//我觉得应该是上面少了那一句,但是想不起到底该怎么做,希望大神帮帮忙,先谢谢了


加载中
0
八风不动
八风不动
publicenumWKBByteOrder :byte
{
    /// <summary>
    /// XDR (Big Endian) Encoding of Numeric Types
    /// </summary>
    wkbXDR = 0,    // Big Endian
 
    /// <summary>
    /// NDR (Little Endian) Encoding of Numeric Types
    /// </summary>
    wkbNDR = 1     // Little Endian

}; 


字节顺序(Byte order)可以是0或1,分别表明little-endian或big-endian存储。little-endian和big-endian字节顺序也分别称为网络数据表示(NDR)和外部数据表示(XDR)。

0
正下雨和雪

@八风不动

不明白是什么意思,我只知道上面创建的是一条线,两个点的坐标分别为100,100和200,200

我也看了大神写的解析WKB的代码,上面输入的0x0102000000020000000000000000005940000000000000594000000000000069400000000000006940, 0中就是根据前两个字节确定正负,然后就是类型,然后是点的数量,再就是点的坐标值了,但是怎么个解析里,我想问的是是不是说从数据库中读出最终的坐标是不是需要进行一系列的不同进制之间的转换,在2008中没有相应的函数可以直接转换然后实现最终经纬度或者平面坐标的读取吗,R2中有反序列函数可以直接使用

0
八风不动
八风不动

字节序:http://baike.baidu.com/link?url=JBZoTN0fp8UqnVx9wOvsmcmxeYupe5KodDApq_rBMpPqlZENg3Di4OvtjVxfVyLf_cwZfKwffhpYzVOrQXD97_

Int类型4字节,float类型4字节,double 类型8字节。

0
八风不动
八风不动
SQL Server支持哪种字节序,你查下。
0
正下雨和雪
恩,好的,谢谢了,SQL SERVER 2008版本的SDK没有直接的方法用于调用读取坐标,12版的有,我看看吧
返回顶部
顶部