1

「hitbgt」という名前のデータベース テーブルがあります。ジオメトリ値を含む列名「the_geom」があります。db テーブルからデータをデータテーブルとして取得し、それに基づいてシェープファイルを作成します。コードは以下のとおりです........

        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);
        }

すべて正常に動作します。しかし、シェープファイルから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 形状: "POLYGON((35 10, 45 45, 15 40, 10 20, 35 10),(20 30, 35 35, 30 20, 20 30))" 形状形状: "MULTIPOLYGON(((35 10 ,10 20,15 40,45 45,35 10),(20 30,30 20,35 35,20 30)))"

どなたか助けてください…………

次のようなものを比較する必要があるため、これに悩まされています.......

        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);
4

1 に答える 1

2

WKT 文字列を比較する代わりに、各ポリゴンをオブジェクトに読み込み、代わりにオブジェクトを比較します。 IGeometry.Equalsシーケンスを気にする必要はありません。

于 2016-03-15T14:12:29.643 に答える