public unsafe IPointDataChunk Process(IPointDataChunk chunk) { if (chunk.PointCount > m_maxPointCountPerChunk) { m_maxPointCountPerChunk = chunk.PointCount; } // get the tile indices for this chunk var tileIndices = new HashSet <int>(); var lastIndex = -1; // JUST TESTING TO SEE IF I LIKE THIS WAY BETTER (slightly slower?) //var iterator = new SQuantizedPoint3DIterator(chunk); //while (iterator.IsValid) //{ // var p = iterator.Next(); // var y = (ushort)(((*p).Y - minY) * tilesOverRangeY); // var x = (ushort)(((*p).X - minX) * tilesOverRangeX); // ++m_grid.Data[y, x]; // // indexing // int tileIndex = PointCloudTileCoord.GetIndex(y, x); // if (tileIndex != lastIndex) // { // tileIndices.Add(tileIndex); // lastIndex = tileIndex; // } //} // JUST TESTING TO SEE IF I LIKE THIS WAY BETTER (slightly slower?) foreach (var pp in chunk.GetSQuantizedPoint3DEnumerator()) { //var p = (LASPointFormat1*)pp.GetPointer(); var p = pp.GetPointer(); var y = (((*p).Y - m_quantizedExtent.MinY) / m_grid.CellSizeY); var x = (((*p).X - m_quantizedExtent.MinX) / m_grid.CellSizeX); ++m_grid.Data[y, x]; // indexing int tileIndex = PointCloudTileCoord.GetIndex(y, x); if (tileIndex != lastIndex) { tileIndices.Add(tileIndex); lastIndex = tileIndex; } } //var pb = chunk.PointDataPtr; //while (pb < chunk.PointDataEndPtr) //{ // var p = (SQuantizedPoint3D*)pb; // var y = (ushort)(((*p).Y - minY) * tilesOverRangeY); // var x = (ushort)(((*p).X - minX) * tilesOverRangeX); // ++m_grid.Data[y, x]; // // indexing // int tileIndex = PointCloudTileCoord.GetIndex(y, x); // if (tileIndex != lastIndex) // { // tileIndices.Add(tileIndex); // lastIndex = tileIndex; // } // pb += chunk.PointSizeBytes; //} m_chunkTiles.Add(tileIndices.ToArray()); return(chunk); }
private PointCloudTile GetTileInternal(int row, int col) { var index = -1; return(m_tileIndex.TryGetValue(PointCloudTileCoord.GetIndex(row, col), out index) ? m_tiles[index] : null); }