我正在处理以.pbf文件编码的多边形坐标数组。对于多面,几何对象具有带有序值的长度数组。
例如,一个具有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;
}
答案 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>>
。