void WritePointcloud() { Console.WriteLine("[{0:hh:mm:ss}] Generating water...", DateTime.Now); List <XYZ> newPoints = new List <XYZ>(); foreach (var polygon in polygons) { var grid = polygon.GetGrid(1.0, x * 1000, y * 1000, (x + 1) * 1000, (y + 1) * 1000); newPoints.AddRange(grid); } Console.WriteLine("[{0:hh:mm:ss}] Writing LAZ...", DateTime.Now); lazReader.laszip_seek_point(0L);//read from the beginning again lazWriter = new laszip_dll(); lazWriter.header = lazReader.header; lazWriter.header.number_of_point_records += (uint)newPoints.Count; lazWriter.laszip_open_writer(destPath, true); var coordArray = new double[3]; for (var pointIndex = 0; pointIndex < numberOfPoints; pointIndex++) { lazReader.laszip_read_point(); lazReader.laszip_get_coordinates(coordArray); lazWriter.point = lazReader.point; //if (lazWriter.point.classification > 9) System.Diagnostics.Debugger.Break(); if (pointcloud.ContainsKey(pointIndex)) { lazWriter.point.classification = WATER_CLASSIFICATION; } lazWriter.laszip_write_point(); } Console.WriteLine("[{0:hh:mm:ss}] Adding water...", DateTime.Now); foreach (var gridPoint in newPoints) { lazWriter.point.classification = 9; lazWriter.point.point_source_ID = 1234; coordArray[0] = gridPoint.x; coordArray[1] = gridPoint.y; coordArray[2] = gridPoint.z; lazWriter.laszip_set_coordinates(coordArray); lazWriter.laszip_write_point(); } lazReader.laszip_close_reader(); lazWriter.laszip_close_writer(); }
//reads LAZ, builds KD tree, reads LAZ again and sets color & normal and writes private void EnrichLazWithRGBSAndNormals(string chunk) { var lazReader = new laszip_dll(); var compressed = true; var filePath = LidarFilesSavePath + tempfile2name(chunk); lazReader.laszip_open_reader(filePath, ref compressed); var numberOfPoints = lazReader.header.number_of_point_records; var coordArray = new double[3]; var kdTree = new KDTree(3); if (IncludeNormals) { Console.Write("[{0:hh:mm:ss}] Reading LAZ and building KD tree...", DateTime.Now); for (var pointIndex = 0; pointIndex < numberOfPoints; pointIndex++) { lazReader.laszip_read_point(); lazReader.laszip_get_coordinates(coordArray); kdTree.Add(coordArray); } Console.WriteLine("[DONE] "); } var img = GetOrthophotoImg(); Console.Write("[{0:hh:mm:ss}] Reading and writing LAZ...", DateTime.Now); lazReader.laszip_seek_point(0L);//read from the beginning again lazReader.laszip_open_reader(filePath, ref compressed); var lazWriter = new laszip_dll(); lazWriter.header = lazReader.header; lazWriter.laszip_open_writer(LidarFilesSavePath + current + ".laz", true); for (var pointIndex = 0; pointIndex < numberOfPoints; pointIndex++) { lazReader.laszip_read_point(); lazReader.laszip_get_coordinates(coordArray); lazWriter.point = lazReader.point; int[] pxCoordinates = FindClosestPxCoordinates(coordArray[0], coordArray[1]); int i = (pxCoordinates[0] - _bottomLeftX) * 2; int j = img.Height - 1 - ((pxCoordinates[1] - _bottomLeftY) * 2); //j index of image goes from top to bottom Color color = img.GetPixel(i, j); //binary int value lazReader.point.rgb = new[] { (ushort)(color.R << 8), (ushort)(color.G << 8), (ushort)(color.B << 8), (ushort)0 }; if (IncludeNormals) { var kNeighbours = kdTree.ApproximateNearest(coordArray, 20, 1000); var normal = GetNormal(coordArray, kNeighbours); var xt = (float)normal[0];//xt in LAS is float var yt = (float)normal[1]; var zt = (float)normal[2]; var xtBytes = BitConverter.GetBytes(xt); var ytBytes = BitConverter.GetBytes(yt); var ztBytes = BitConverter.GetBytes(zt); var waveformPacket = lazWriter.point.wave_packet; waveformPacket[17] = xtBytes[0]; waveformPacket[18] = xtBytes[1]; waveformPacket[19] = xtBytes[2]; waveformPacket[20] = xtBytes[3]; waveformPacket[21] = ytBytes[0]; waveformPacket[22] = ytBytes[1]; waveformPacket[23] = ytBytes[2]; waveformPacket[24] = ytBytes[3]; waveformPacket[25] = ztBytes[0]; waveformPacket[26] = ztBytes[1]; waveformPacket[27] = ztBytes[2]; waveformPacket[28] = ztBytes[3]; } lazWriter.laszip_write_point(); } lazReader.laszip_close_reader(); lazWriter.laszip_close_writer(); Console.WriteLine("[DONE]"); }//end readwrite function
public void Start() { var lazReader = new laszip_dll(); var compressed = true; var filePath = ResourceDirectoryPath + "/5-" + x + "-" + y + ".laz"; //var kdTree = new KDTree(3); Bitmap img = null; for (int i = 0; i < 4; i++) { try { img = GetOrthophotoImg(); break; } catch (Exception e) { Console.WriteLine("[{0:hh:mm:ss}] Image download failed...", DateTime.Now); Console.WriteLine("[{0:hh:mm:ss}] {1}", DateTime.Now, e.Message); Console.WriteLine(e.StackTrace); } } if (img == null) { throw new Exception(); } lazReader.laszip_open_reader(filePath, ref compressed); var numberOfPoints = lazReader.header.number_of_point_records; Console.WriteLine("[{0:hh:mm:ss}] Reading and writing LAZ...", DateTime.Now); lazReader.laszip_seek_point(0L);//read from the beginning again lazReader.laszip_open_reader(filePath, ref compressed); var lazWriter = new laszip_dll(); lazWriter.header = lazReader.header; lazWriter.laszip_open_writer(ResourceDirectoryPath + "/6-" + x + "-" + y + ".laz", true); for (var pointIndex = 0; pointIndex < numberOfPoints; pointIndex++) { var coordArray = new double[3]; lazReader.laszip_read_point(); lazReader.laszip_get_coordinates(coordArray); lazWriter.point = lazReader.point; int[] pxCoordinates = FindClosestPxCoordinates(coordArray[0], coordArray[1]); int i = (pxCoordinates[0] - _bottomLeftX) * 2; int j = img.Height - 1 - ((pxCoordinates[1] - _bottomLeftY) * 2);//j index of image goes from top to bottom i = Math.Max(Math.Min(i, img.Width - 1), 0); j = Math.Max(Math.Min(j, img.Height - 1), 0); Color color = img.GetPixel(i, j); //binary int value lazReader.point.rgb = new[] { (ushort)(color.R << 8), (ushort)(color.G << 8), (ushort)(color.B << 8), (ushort)0 }; lazWriter.laszip_write_point(); } lazReader.laszip_close_reader(); lazWriter.laszip_close_writer(); }
//reads LAZ, builds KD tree, reads LAZ again and sets color & normal and writes private void ReadWriteLaz() { var lazReader = new laszip_dll(); var compressed = true; var filePath = ResourceDirectoryPath + id + "-laz13.laz"; lazReader.laszip_open_reader(filePath, ref compressed); var numberOfPoints = lazReader.header.number_of_point_records; //var kdTree = new KDTree(3); var kdTree = new KdTree <double, object>(3, new KdTree.Math.DoubleMath(), AddDuplicateBehavior.Update); if (IncludeNormals) { Console.WriteLine("[#{0} {1:hh:mm:ss}] Reading LAZ and building KD tree...", id, DateTime.Now); for (var pointIndex = 0; pointIndex < numberOfPoints; pointIndex++) { var coordArray = new double[3]; lazReader.laszip_read_point(); lazReader.laszip_get_coordinates(coordArray); //Thread.Sleep(1); //kdTree.Add(coordArray); kdTree.Add(coordArray, null); //Console.WriteLine("Point {0} {1} {2}", coordArray[0], coordArray[1], coordArray[2]); } //Console.WriteLine("[DONE] "); Console.WriteLine("[#{0} {1:hh:mm:ss}] Balancing KD tree...", id, DateTime.Now); kdTree.Balance(); //Console.WriteLine("[DONE] "); } var img = GetOrthophotoImg(); Console.WriteLine("[#{0} {1:hh:mm:ss}] Reading and writing LAZ...", id, DateTime.Now); lazReader.laszip_seek_point(0L);//read from the beginning again lazReader.laszip_open_reader(filePath, ref compressed); var lazWriter = new laszip_dll(); lazWriter.header = lazReader.header; lazWriter.laszip_open_writer(ResourceDirectoryPath + "SloveniaLidarRGB" + id + ".laz", true); stw = new Stopwatch(); stw.Restart(); for (var pointIndex = 0; pointIndex < numberOfPoints; pointIndex++) { if (pointIndex % 100000 == 0) { double elaspedHours = stw.Elapsed.TotalHours; double finishedShare = (double)pointIndex / numberOfPoints; double totalHours = elaspedHours / finishedShare; double remainingHours = totalHours - elaspedHours; Console.WriteLine( "[#{0} {1:hh:mm:ss}] Finished " + (pointIndex / 1000) + "k / " + (numberOfPoints / 1000) + "k | " + Math.Round(remainingHours, 2) + " hours remaining", id, DateTime.Now); } var coordArray = new double[3]; lazReader.laszip_read_point(); lazReader.laszip_get_coordinates(coordArray); lazWriter.point = lazReader.point; int[] pxCoordinates = FindClosestPxCoordinates(coordArray[0], coordArray[1]); int i = (pxCoordinates[0] - _bottomLeftX) * 2; int j = img.Height - 1 - ((pxCoordinates[1] - _bottomLeftY) * 2); //j index of image goes from top to bottom Color color = img.GetPixel(i, j); //binary int value lazReader.point.rgb = new[] { (ushort)(color.R << 8), (ushort)(color.G << 8), (ushort)(color.B << 8), (ushort)0 }; if (IncludeNormals) { //var kNeighbours = kdTree.ApproximateNearest(coordArray, 20, 1000); var kNeighbours = kdTree.GetNearestNeighbours(coordArray, 20); var collection = new KDTreeNodeCollection <KDTreeNode>(20); for (int k = 0; k < 20; k++) { collection.Add(new KDTreeNode { Position = kNeighbours[k].Point }, 0); } var normal = GetNormal(coordArray, collection); lazReader.point.rgb[0] |= (byte)((normal[0] + 1.0) * 128.0); lazReader.point.rgb[1] |= (byte)((normal[1] + 1.0) * 128.0); lazReader.point.rgb[2] |= (byte)((normal[2] + 1.0) * 128.0); /*var xt = (float)normal[0];//xt in LAS is float * var yt = (float)normal[1]; * var zt = (float)normal[2]; * * var xtBytes = BitConverter.GetBytes(xt); * var ytBytes = BitConverter.GetBytes(yt); * var ztBytes = BitConverter.GetBytes(zt); * * var waveformPacket = lazWriter.point.wave_packet; * waveformPacket[17] = xtBytes[0]; * waveformPacket[18] = xtBytes[1]; * waveformPacket[19] = xtBytes[2]; * waveformPacket[20] = xtBytes[3]; * * waveformPacket[21] = ytBytes[0]; * waveformPacket[22] = ytBytes[1]; * waveformPacket[23] = ytBytes[2]; * waveformPacket[24] = ytBytes[3]; * * waveformPacket[25] = ztBytes[0]; * waveformPacket[26] = ztBytes[1]; * waveformPacket[27] = ztBytes[2]; * waveformPacket[28] = ztBytes[3];*/ } lazWriter.laszip_write_point(); } lazReader.laszip_close_reader(); lazWriter.laszip_close_writer(); //Console.WriteLine("[DONE]"); }//end readwrite function
private static void WriteLaz() { // --- Write Example var point = new Point3D(); var points = new List <Point3D>(); point.X = 1000.0; point.Y = 2000.0; point.Z = 100.0; points.Add(point); point.X = 5000.0; point.Y = 6000.0; point.Z = 200.0; points.Add(point); var lazWriter = new laszip_dll(); var err = lazWriter.laszip_clean(); if (err == 0) { // Number of point records needs to be set lazWriter.header.number_of_point_records = (uint)points.Count; // Header Min/Max needs to be set to extents of points lazWriter.header.min_x = points[0].X; // LL Point lazWriter.header.min_y = points[0].Y; lazWriter.header.min_z = points[0].Z; lazWriter.header.max_x = points[1].X; // UR Point lazWriter.header.max_y = points[1].Y; lazWriter.header.max_z = points[1].Z; // Open the writer and test for errors err = lazWriter.laszip_open_writer(FileName, true); if (err == 0) { double[] coordArray = new double[3]; foreach (var p in points) { coordArray[0] = p.X; coordArray[1] = p.Y; coordArray[2] = p.Z; // Set the coordinates in the lazWriter object lazWriter.laszip_set_coordinates(coordArray); // Set the classification to ground lazWriter.point.classification = 2; // Write the point to the file err = lazWriter.laszip_write_point(); if (err != 0) { break; } } // Close the writer to release the file (OS lock) err = lazWriter.laszip_close_writer(); lazWriter = null; } } if (err != 0) { // Show last error that occurred Debug.WriteLine(lazWriter.laszip_get_error()); } // --- Upon completion, file should be 389 bytes }