繁体   English   中英

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

[英]Most efficient way to decode Protobuf repeated field array in C#

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

  • 第一个表示形状的总数(形状具有外环和可选的一个或多个内环)。
  • 第二(和公式)连续值是每个形状的环的计数,例如,值2表示阵列中的下两个项与其组合。
  • 每组中的后续值包含环顶点的计数。

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

长度图

我最初的想法是迭代数组,使用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;
}

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

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>>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM