C# C语言中Protobuf重复场数组的最有效解码方法#

C# C语言中Protobuf重复场数组的最有效解码方法#,c#,arrays,protocol-buffers,C#,Arrays,Protocol Buffers,我正在使用在.pbf文件中编码的多边形坐标数组。对于多多边形,几何体对象具有一个具有有序值的长度数组 第一个表示形状的总数(形状具有外部 环和可选的一个或多个内圈) 第二个(公式化)连续值是环的计数 对于每个形状,例如,值2表示图形中的下两个项目 数组与它一起分组 每组中的后续值包含环顶点的计数 例如,具有4个形状的几何体对象:第一个有一个孔,第二个没有,第三个有两个孔,第四个有一个孔,其长度数组为[4,2,4,3,1,3,3,3,4,3,2,5,3]: 我最初的想法是遍历数组,使用Ski

我正在使用在.pbf文件中编码的多边形坐标数组。对于多多边形,几何体对象具有一个具有有序值的长度数组

  • 第一个表示形状的总数(形状具有外部 环和可选的一个或多个内圈)
  • 第二个(公式化)连续值是环的计数 对于每个形状,例如,值2表示图形中的下两个项目 数组与它一起分组
  • 每组中的后续值包含环顶点的计数
例如,具有4个形状的几何体对象:第一个有一个孔,第二个没有,第三个有两个孔,第四个有一个孔,其长度数组为[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 ringsVertexIndexList=new List();
对于(var index=1;index对于(var i=1;i经过一些研究和绘制问题图表(我是一个视觉人),我提出:

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);
}
var length=feature.Geometry.length.ToList().ConvertAll(x=>(int)x);//int32
如果(length.Count>0)
{
var coordsListStart=0;
var lengthsCursor=1;
var multipolyList=新列表();
while(长度或

这可能不是最有效的,但它对我所有的测试集都很有效。值得注意的是,EncodedCordAssubList是一个包含所有x、y、z值的
列表。

经过一些研究和绘制问题图表(我是一个视觉人),我想出了:

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);
}
var length=feature.Geometry.length.ToList().ConvertAll(x=>(int)x);//int32
如果(length.Count>0)
{
var coordsListStart=0;
var lengthsCursor=1;
var multipolyList=新列表();
while(长度或

这可能不是最有效的,但它对我所有的测试集都很有效。值得注意的是,EncodedCordAssubList是一个包含所有x、y、z值的
列表。

如果已经给出了编码,那么您的迭代逻辑相当有效。但是您真的需要在单个平面数组中编码吗?您不能使用分层消息结构?我尝试在HMS上搜索,尤其是与protobuf相关的,但没有找到任何有用的东西。因此我不确定如何继续。中的decodeMultiPolygon方法似乎可以作为指导。如果已经给出了编码,那么您的迭代逻辑相当有效。但是您真的需要在单个平面arr中编码吗是吗?你不能使用分层消息结构吗?我尝试在HMS上搜索,特别是与protobuf相关的,但没有找到任何有用的内容。因此我不确定如何继续。中的decodeMultiPolygon方法似乎可以作为指导。