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
Exemple #3
0
        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
Exemple #5
0
        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
        }