C# 从命名坐标的数据表构建二维多边形列表
我有一个数据表zct(分区/多边形坐标表),其列定义如下:C# 从命名坐标的数据表构建二维多边形列表,c#,list,datatable,nested,polygon,C#,List,Datatable,Nested,Polygon,我有一个数据表zct(分区/多边形坐标表),其列定义如下: private void buildZoneDataTable() { // Add columns to the DataTable. zct.Columns.Add("Zone Name", System.Type.GetType("System.String")); zct.Columns.Add(&qu
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());
}
}
}
private void buildZonelList()
{
//迭代zct的所有行
对于(int i=0;i
下面是我的polyzone类的一个片段:
public class PolyZone
{
public string polyZoneName;
List<Point3D> pointList = new List<Point3D>(0);
Point3D polyCenter = new Point3D(0,0,0);
public PolyZone(string zoneName)
{
polyZoneName = zoneName;
}
public void add(Point3D point3D)
{
pointList.Append(point3D);
}
公共类多区域
{
公共字符串聚苯胺;
列表点列表=新列表(0);
Point3D多中心=新的Point3D(0,0,0);
公共多区域(字符串区域名称)
{
polyZoneName=zoneName;
}
公共空白添加(点3D点3D)
{
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;
}
公共列表BuildZonelList()
{
var zones=zct.AsEnumerable().GroupBy(x=>x.Field(“Zone”)).ToList();
List listOfPolyZones=新列表();
foreach(区域中的var区域)
{
PolyZone newZone=新的PolyZone(zone.Key);
添加(newZone);
foreach(区域中的数据行)
{
双x=行字段(“x_坐标”);
双y=行字段(“y_坐标”);
双z=ZoneyRender.elevation;
添加(新点3d(x,y,z));
}
}
多功能区的返回列表;
}
下面是我测试它的方法:
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());
}
}
}
private void ListZones和CoordsToolStripMenuItem\u单击(对象发送者,事件参数e)
{
listOfPolyZones=BuildZoneList();
foreach(多边形区域列表中的多边形区域)
{
MessageBox.Show(“Zone:+Zone.polyZoneName”);
foreach(区域中的点3D p3d.pointList)
{
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, 0);
public PolyZone(string zoneName)
{
polyZoneName = zoneName;
}
public void add(Point3D point3D)
{
pointList.Add(point3D);
}
}
类程序
{
静态void Main(字符串[]参数)
{
DataTable zct=新DataTable();
添加(“区域名称”,System.Type.GetType(“System.String”);
添加(“X_坐标”,System.Type.GetType(“System.Double”);
添加(“Y_坐标”,System.Type.GetType(“System.Double”);
添加(“Z_坐标”,System.Type.GetType(“System.Double”);
var zones=zct.AsEnumerable().GroupBy(x=>x.Field(“区域名称”)).ToList();
列表多区域=新列表();
foreach(区域中的var区域)
{
PolyZone newZone=新的PolyZone(zone.Key);
polyZones.Add(newZone);
foreach(区域中的数据行)
{
double x=double.Parse(行字段(“x_坐标”);
double y=double.Parse(行字段(“y_坐标”);
double z=double.Parse(行字段(“z_坐标”);
添加(新点3d(x,y,z));
}
}
}
}
公共类多功能区
{
公共字符串聚苯胺;
列表点列表=新列表(0);
Point3D多中心=新的Point3D(0,0,0);
公共多区域(字符串区域名称)
{
polyZoneName=zoneName;
}
公共空白添加(点3D点3D)
{
pointList.Add(point3D);
}
}
你的问题是什么?@JonasH,对不起,你的评论飞过我的头,你能帮我把它哑下来吗?这里没有SQL。啊,对不起,我假设数据源来自数据库,如果不是,你可以忽略我的评论。谢谢你的帮助,但这只让我走了一半,你能检查我的编辑吗?谢谢!将数据添加到数据表中(不是DataGridView)。您的编辑与上面的代码不同。