从命名坐标数据表构建二维多边形列表

问题描述

我有一个数据表 zct(区域/多边形坐标表),其中的列定义为:

private void buildZoneDataTable()
        {
            // Add columns to the DataTable.
            zct.Columns.Add("Zone Name",System.Type.GetType("System.String"));
            zct.Columns.Add("X_Coordinate",System.Type.GetType("System.Double"));
            zct.Columns.Add("Y_Coordinate",System.Type.GetType("System.Double"));
            coordDGV.DataSource = zct;
            foreach (DataGridViewColumn dgvcol in coordDGV.Columns)
            {
                dgvcol.sortMode = DataGridViewColumnSortMode.NotSortable;
            }

zct 的每一行都是我稍后渲染的多边形顶点的坐标,但现在我的目标是拥有所有命名区域/多边形及其多边形坐标的嵌套列表。

这是我迄今为止创建单个多边形区域的内容

        private void BuildZoneList()
        {
            //iterate through all rows of the zct
            for (int i = 0; i < zct.Rows.Count; i++)
            {
                //if first row,or row I has a different name start new zone
                if(i == 0 || zct.Rows[i][0] != zct.Rows[i-1][0])
                {
                //create new polyzone named by the first column 
                 polyZone pZone = new polyZone(zct.Rows[i][0].ToString());
                }           
            }
        }

这是我的 polyzone 类的片段:

    public class polyZone
    {

        public string polyZoneName;
        List<Point3D> pointList = new List<Point3D>(0);
        Point3D polyCenter = new Point3D(0,0);

        public polyZone(string zoneName)
        {
            polyZoneName = zoneName;
        }

        public void add(Point3D point3D)
        {
            pointList.Append(point3D);

        }

编辑:感谢 jdweng 的回答,我能够从列表中获取区域名称,但是我无法获取添加到列表中的点数。下面是我重写 BuildZoneList 方法方法

        public List<polyZone> BuildZoneList()
        {
            var zones = zct.AsEnumerable().GroupBy(x => x.Field<string>("Zone")).ToList();
            List<polyZone> listofpolyZones = new List<polyZone>();
            foreach(var zone in zones)
            {
                polyZone newZone = new polyZone(zone.Key);
                listofpolyZones.Add(newZone);

                foreach(DaTarow row in zone)
                {
                    double x = row.Field<double>("X_Coordinate");
                    double y = row.Field<double>("Y_Coordinate");
                    double z = ZoneyRender.elevation;
                    newZone.Add(new Point3D(x,y,z));
                }

            }
            return listofpolyZones;
        }

这是我测试它的方式:

private void listZonesAndCoordsToolStripMenuItem_Click(object sender,EventArgs e)
        {
            List<polyZone> listofpolyZones = BuildZoneList();
            foreach(polyZone zone in listofpolyZones)
            {
                MessageBox.Show("Zone:" + zone.polyZoneName);
                foreach(Point3D p3d in zone.pointList)
                {
                    MessageBox.Show("Zone:" + zone.polyZoneName + Environment.NewLine + p3d.ToString());
                }
            }
        }

带有区域名称的第一个 mBox 出现得很好,但是应该显示坐标的 mBox 永远不会弹出,让我认为列表是空的。有什么我想念的吗? 谢谢!

解决方法

尝试以下操作:

   class Program
    {
       static void Main(string[] args)
        {
           DataTable zct = new DataTable();
           zct.Columns.Add("Zone Name",System.Type.GetType("System.String"));
           zct.Columns.Add("X_Coordinate",System.Type.GetType("System.Double"));
           zct.Columns.Add("Y_Coordinate",System.Type.GetType("System.Double"));
           zct.Columns.Add("Z_Coordinate",System.Type.GetType("System.Double"));

           var zones = zct.AsEnumerable().GroupBy(x => x.Field<string>("Zone Name")).ToList();
           List<PolyZone> polyZones = new List<PolyZone>();
           foreach (var zone in zones)
           {
               PolyZone newZone = new PolyZone(zone.Key);
               polyZones.Add(newZone);

               foreach (DataRow row in zone)
               {
                   double x = double.Parse(row.Field<string>("X_Coordinate"));
                   double y = double.Parse(row.Field<string>("Y_Coordinate"));
                   double z = double.Parse(row.Field<string>("Z_Coordinate"));
                   newZone.add(new Point3D(x,y,z));
               }
           }


        }
 
    }
    public class PolyZone
    {

        public string polyZoneName;
        List<Point3D> pointList = new List<Point3D>(0);
        Point3D polyCenter = new Point3D(0,0);

        public PolyZone(string zoneName)
        {
            polyZoneName = zoneName;
        }

        public void add(Point3D point3D)
        {
            pointList.Add(point3D);

        }
    }