我正在使用Mapbox构建交互式地图,并想在特定区域绘制一个多边形,如图here所示。为此,我需要使用数据库中的X,Y和Z坐标动态填充3D数组。我要实现的数组结构是:
[
[
[
[xCoordinate1, yCoordinate1, zCoordinate1],
[xCoordinate2, yCoordinate2, zCoordinate2],
[xCoordinate3, yCoordinate3, zCoordinate3]
]
]
]
我一直在尝试使用C#完成此任务。在我的应用程序中,我初始化了一个3D列表,如下所示:
List<List<List<List<double>>>> coordinates = new List<List<List<List<double>>>>();
接下来,我遍历数据库中的坐标,以便将它们添加到数组中:
foreach (var coordinate in Coordinates) {
coordinates.Add({ coordinate.X, coordinate.Y, coordinate.Z })
}
但是,这不会在所需位置添加值,并引发IndexOutOfBounds异常。我还尝试过初始化数组,如下所示:
double[, , ,] coordinates = {
{
{
{ coordinate.X, coordinate.Y, coordinate.Z },
{ coordinate.X, coordinate.Y, coordinate.Z },
{ coordinate.X, coordinate.Y, coordinate.Z }
}
}
};
使用这种方法时,我也无法按照应格式化的方式格式化数组。有人可以告诉我如何使用复杂的3D阵列,以便获得所需的结构吗?
总结:
int[,,,] array3D = new int[,,,] {
{
{
{ 1, 2, 3 },
{ 4, 5, 6 }
//How can I add more here dynamically?
}
}
};
array3D[0, 0, 0, 3] = { 7, 8, 8 }; //This doesn't do the trick :(
答案 0 :(得分:1)
您无法更改多维数组的大小,但这没关系,因为您的JSON确实代表了一个数组数组。
从(可扩展的)坐标列表开始
var coords = new List<double[]>
{
new double[] { 1,2,3 },
new double[] { 4,5,6 },
};
// later
coords.Add(new double[] { 7, 8, 9 });
然后转换为JSON结构以进行导出。您显示了一个由坐标数组(array)组成的数组。
var json = new double[][][][] {
new double[][][] {
coords.ToArray()
}
};
这是恢复坐标的方式
foreach (var item in json[0][0])
{
Debug.WriteLine($"Point=({item[0]}, {item[1]}, {item[2]})");
}
在输出窗口中,您看到
// Point=(1, 2, 3)
// Point=(4, 5, 6)
// Point=(7, 8, 9)
答案 1 :(得分:0)
如果我理解正确,那么您将仅获得2D列表,其中第一个列表包含坐标集(即(x,y,z)),而第二个列表仅包含一堆第一列表,如下所示:
List<List<double>> coords = new List<List<double>>();
coords.Add(new List<double> { 24, 54, 46 });
coords.Add(new List<double> { 32, 45, 48 });
Console.WriteLine(coords[1][1]);
//Outputs 45.
//Note: xCoord = 24, yCoord = 54, zCoord = 46 in the first list entry
您可以将其作为单独的方法或扩展方法,在其中将坐标作为参数传递。也可以遍历列表以获取特定的x,y或z坐标(如果需要在代码中进行搜索)。