C# C语言中Protobuf重复场数组的最有效解码方法#
我正在使用在.pbf文件中编码的多边形坐标数组。对于多多边形,几何体对象具有一个具有有序值的长度数组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
- 第一个表示形状的总数(形状具有外部 环和可选的一个或多个内圈)
- 第二个(公式化)连续值是环的计数 对于每个形状,例如,值2表示图形中的下两个项目 数组与它一起分组
- 每组中的后续值包含环顶点的计数
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方法似乎可以作为指导。