在C#中解码Protobuf重复字段数组的最有效方法

时间:2017-01-30 23:51:40

标签: c# arrays protocol-buffers

我正在处理以.pbf文件编码的多边形坐标数组。对于多面,几何对象具有带有序值的长度数组。

  • 第一个表示形状的总数(形状具有外形 环和任选的一个或多个内环)。
  • 第二个(和公式上)连续值是环的计数 对于每个形状,例如值为2表示接下来的两个项目 数组与它组合在一起。
  • 每组中的后续值包含环顶点的计数。

例如,一个具有4个形状的几何对象:1st具有一个孔,2nd具有none,3rd具有两个孔,第四个具有一个孔具有Lengths数组[4,2,4,3,1,3, 3,3,4,3,2,5,3]:

lengths diagram

我最初的想法是迭代数组,使用Skip和Take获取所需的值1)找到每个环计数值和2)每个环的顶点数。作为Protobuf的新手,我想知道是否有一些更有效的预先存在的方法来做到这一点。

var ringsVertexIndexList = new List<int>();

for (var index = 1; index < lengths.Count; index++)
{
    // Get the number of rings related to each shape
    var currentRingCount = lengths.Skip(index).First();

    for (var i = 1; i <= currentRingCount; i++)
    {
        var currentRing = lengths[index + i];

        ringsVertexIndexList.Add(currentRing);
    }

    // Advance index to end of current rings (incrementer will add 1 as it loops)
    index = index + currentRingCount;
}

1 个答案:

答案 0 :(得分:0)

经过一些研究和图解问题(我是一个视觉人),我提出了:

var lengths = feature.Geometry.Lengths.ToList().ConvertAll(x => (int) x); // int32

if (lengths.Count > 0)
{
    var coordsListStart = 0;
    var lengthsCursor = 1;

    var multipolyList = new List<Polygon>();

    while (lengthsCursor < lengths.Count)
    {
        var ringsCount = lengths[lengthsCursor];

        lengthsCursor++;

        var polygonLineStringsList = new List<LineString>();

        for (var move = 0; move < ringsCount; move++)
        {
            var ringVertexCount = lengths[lengthsCursor];

            // ring processing
            var coordsList = encodedCoordsSubList.GetRange(coordsListStart, ringVertexCount);

            var lineStr = BuildLineString(coordsList, true);

            polygonLineStringsList.Add(lineStr);

            // update start to new position
            coordsListStart += ringVertexCount;

            lengthsCursor++;
        }

        multipolyList.Add(new Polygon(polygonLineStringsList));
    }

    geoJsonFeature.Geometry = new MultiPolygon(multipolyList);
}

这可能不是最有效的,但它已经适用于我的所有测试集。值得注意的是,encodedCoordsSubList是一个包含所有x,y,z值的List<List<int>>

相关问题