从db创建shapefile后,几何坐标变为反向顺序

时间:2016-03-15 05:26:54

标签: c# shapefile dotspatial

我有一个名为' hitbgt'的数据库表。有一个列名称' the_geom'包含几何值。从db表中获取数据作为数据表,并基于它创建shapefile。代码如下..........

        DataTable dt = new DataTable();
        DbHandeler dbHandelerObj = new DbHandeler();
        string query = "Select st_asBinary(the_geom) as geom, * from hitbgt";

        try
        {
            dt = dbHandelerObj.GetDataTable(query);

            IFeature feature = new Feature();
            FeatureSet fs = new FeatureSet(FeatureType.Polygon);              

            foreach (DataColumn dc in dt.Columns)
            {
                if (dc.ColumnName != "the_geom" && dc.ColumnName != "geom")
                {
                    fs.DataTable.Columns.Add(dc.ColumnName, dc.DataType);
                }
            }

            foreach (DataRow dr in dt.Rows)
            {

                Byte[] data = (Byte[])dr["geom"];

                WkbReader wkbReader = new WkbReader();
                IGeometry geometry = wkbReader.Read(data);

                feature = fs.AddFeature(geometry);

                feature.DataRow.BeginEdit();                    
                foreach (DataColumn dc in fs.DataTable.Columns)
                {
                    feature.DataRow[dc.ColumnName] = dr[dc.ColumnName];                       
                }
                feature.DataRow.EndEdit(); 
            }

            fs.SaveAs("F:\\Test_value\\hitbgt_test.shp", true);
            fs.Close();

            MessageBox.Show("Done");
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

一切正常。但是当我从shapefile中检索geom数据时,多边形坐标值显示为顺时针方向,就像在数据库中一样。

        IList<Coordinate> shapeCorList = null;
        IFeatureSet fb = FeatureSet.Open("F:\\Test_value\\hitbgt_test.shp");
        foreach (IFeature ff in fb.Features)
        {
            if (ff.DataRow["cadid"].ToString() == "12345")
            {
                shapeGeometry = ff.BasicGeometry as IGeometry;
                shapeCorList = shapeGeometry.Coordinates;     
            }
        }

实施例: Db几何: &#34; POLYGON((35 10,45 45,15 40,10 20,35 10),(20 30,35 35,30,20,20 30))&#34; 形状几何: &#34; MULTIPOLYGON(((35 10,10 20,15 40,45 45,35 10),(20 30,30 20,35 35,20 30)))&#34;

任何人请帮助.........

我很烦心,因为它需要比较像.......

这样的东西
        foreach (DataRow dr in dt.Rows)
        {
            if (dr["cadid"].ToString() == "12345")
            {
                dbGeometry = reader.Read((Byte[])dr["geom"]);
                dbCorList = dbGeometry.Coordinates;                    
            }
        }          
        foreach (IFeature ff in fb.Features)
        {
            if (ff.DataRow["cadid"].ToString() == "12345")
            {
                shapeGeometry = ff.BasicGeometry as IGeometry;
                shapeCorList = shapeGeometry.Coordinates;
            }
        }

        bool equal = dbCorList.SequenceEqual(shapeCorList);

1 个答案:

答案 0 :(得分:2)

不是比较WKT字符串,而是将每个多边形加载到对象中,然后比较对象。 IGeometry.Equals不应该关心排序。