Esempio n. 1
0
        protected async Task Load(RecordSet layer)
        {
            (long, Pipeline)result = await LoadAsync(layer);

            Pipeline          pipeline = result.Item2;
            PointViewIterator views    = pipeline.Views;

            if (views != null)
            {
                PointView view = views != null ? views.Next : null;
                if (view != null)
                {
                    features = BakedPointCloud.Initialize(view.GetBpcData());
                    view.Dispose();
                }
                views.Dispose();
            }
            pipeline.Dispose();
        }
Esempio n. 2
0
        protected Task <int> Load()
        {
            TaskCompletionSource <int> tcs1 = new TaskCompletionSource <int>();
            Task <int> t1 = tcs1.Task;

            t1.ConfigureAwait(false);

            // Start a background task that will complete tcs1.Task
            Task.Factory.StartNew(() => {
                RecordSet layer      = _layer as RecordSet;
                string ex            = Path.GetExtension(layer.Source).ToLower();
                string sourcetype    = null;
                Datasource ds        = null;
                string proj          = null;
                double scalingFactor = 0;
                string headerString;
                features = new List <DMesh3>();

                // Determine the DAL to be used to load the data.
                // GDAL data is loaded throu PDAL to get a mesh - but the pipeline is radically different
                //
                if (".2dm .nc .dat .adf .out .grb .hdf .slf .sww .xdmf .xmdf .tin".Contains(ex))
                {
                    sourcetype = "mdal";
                }
                else if (".bpf .json .e57 .mat .txt .las .nitf .npy .csd .pcd .ply .pts .qi .rxp .rdbx .sbet .slpk .bin .xyz ".Contains(ex) || new Regex(@"\.m\d\d").IsMatch(ex))
                {
                    sourcetype = "pdal";
                }
                else
                {
                    sourcetype = "gdal";
                }

                //Loading through PDAL
                if (sourcetype != "mdal")
                {
                    List <object> pipe = new List <object>();

                    // Set up the pipline for GDAL data
                    // Get the metadata thjrough GDAL first
                    if (sourcetype == "gdal")
                    {
                        Dataset raster = Gdal.Open(layer.Source, Access.GA_ReadOnly);
                        int numBands   = raster.RasterCount;
                        if (numBands <= 0)
                        {
                            throw new NotSupportedException($" No Data in file {layer.Source}");
                        }
                        proj = raster.GetProjection();

                        //Make the header string from the number of bands - assume band-1 is elevation
                        headerString = "Z";
                        for (int i = 1; i < numBands; i++)
                        {
                            headerString += $",M{i}";
                        }

                        pipe.Add(new {
                            type     = "readers.gdal",
                            filename = layer.Source,
                            header   = headerString
                        });

                        //get the null value and filter out null data
                        Band band1 = raster.GetRasterBand(1);
                        double noDataValue;
                        int hasval;
                        band1.GetNoDataValue(out noDataValue, out hasval);
                        if (hasval == 1)
                        {
                            if (noDataValue < 0)
                            {
                                pipe.Add(new {
                                    type   = "filters.range",
                                    limits = $"Z[{noDataValue + 1}:]"
                                });
                            }
                            else
                            {
                                pipe.Add(new {
                                    type   = "filters.range",
                                    limits = $"Z[:{noDataValue - 1}]"
                                });
                            }
                        }

                        // Get the size and pixel size of the raster
                        // if the raster has more than 40,000 data points, using poisson sampling to down size
                        long datapoints = raster.RasterXSize * raster.RasterYSize;
                        if (datapoints > 40000)
                        {
                            try {
                                double[] geoTransform = new double[6];
                                raster.GetGeoTransform(geoTransform);
                                if (geoTransform == null && geoTransform[1] == 0)
                                {
                                    throw new Exception();
                                }
                                scalingFactor = Math.Sqrt(datapoints / 40000d * geoTransform[1]);
                            } catch {
                                scalingFactor = Math.Sqrt(datapoints / 40000d);
                            };

                            pipe.Add(new {
                                type   = "filters.sample",
                                radius = scalingFactor
                            });
                        }
                        band1.FlushCache();
                        band1.Dispose();
                        raster.FlushCache();
                        raster.Dispose();
                        // special treatment for .xyz files that are not handled well by the defaults
                    }
                    else if (ex == ".xyz")
                    {
                        pipe.Add(new {
                            type     = "readers.text",
                            filename = layer.Source,
                        });
                    }

                    // for PDAL data - use the default reader
                    else
                    {
                        pipe.Add(layer.Source);
                    }

                    // if there is a filter definituion in the RecordSet, add that
                    if (layer.Properties.Filter != null)
                    {
                        foreach (Dictionary <string, object> item in layer.Properties.Filter)
                        {
                            pipe.Add(item);
                        }
                    }

                    // if there is a Color Interpolation definition in the RecordSet, add that
                    if (layer.Properties.ColorInterp != null)
                    {
                        Dictionary <string, object> ci = new Dictionary <string, object>(layer.Properties.ColorInterp);
                        ci.Add("type", "filters.colorinterp");
                        ci["dimension"] = "Z";
                        pipe.Add(ci);
                    }

                    // create a Mesh using Delaunay traingulation
                    pipe.Add(new {
                        type = "filters.delaunay"
                    });

                    // serialize the pipeline to json
                    string json = JsonConvert.SerializeObject(new {
                        pipeline = pipe.ToArray()
                    });

                    Debug.Log(json);

                    // create and run the piplene
                    Pipeline pipeline = new Pipeline(json);
                    long pointCount   = pipeline.Execute();
                    using (PointViewIterator views = pipeline.Views) {
                        views.Reset();
                        while (views.HasNext())
                        {
                            PointView view = views.Next;
                            if (view != null)
                            {
                                DMesh3 mesh = view.getMesh();
                                mesh.RemoveMetadata("properties");
                                // set the CRS based on what is known
                                if (proj != null)
                                {
                                    mesh.RemoveMetadata("CRS");
                                    mesh.AttachMetadata("CRS", proj);
                                }
                                if (layer.ContainsKey("Crs") && layer.Crs != null)
                                {
                                    mesh.RemoveMetadata("CRS");
                                    mesh.AttachMetadata("CRS", layer.Crs);
                                }
                                ;
                                features.Add(mesh);
                            }
                        }
                    }
                    pipeline.Dispose();
                }
                else
                {
                    // for MDAL files - load the mesh directly
                    ds = Datasource.Load(layer.Source);

                    for (int i = 0; i < ds.meshes.Length; i++)
                    {
                        DMesh3 mesh = ds.GetMesh(i);
                        mesh.RemoveMetadata("properties");
                        mesh.AttachMetadata("properties", new Dictionary <string, object> {
                            { "Name", ds.meshes[i] }
                        });
                        // set the CRS based on what is known
                        if (proj != null)
                        {
                            mesh.RemoveMetadata("CRS");
                            mesh.AttachMetadata("CRS", proj);
                        }
                        if (layer.ContainsKey("Crs") && layer.Crs != null)
                        {
                            mesh.RemoveMetadata("CRS");
                            mesh.AttachMetadata("CRS", layer.Crs);
                        }
                        ;
                        features.Add(mesh);
                    }
                }
                tcs1.SetResult(1);
            });
            return(t1);
        }
Esempio n. 3
0
        protected Task <int> Load(RecordSet layer)
        {
            Task <int> t1 = new Task <int>(() => {
                List <object> pipe = new List <object>();

                string ex = Path.GetExtension(layer.Source).ToLower();
                if (ex == ".xyz")
                {
                    pipe.Add(new {
                        type     = "readers.text",
                        filename = layer.Source,
                    });
                }
                else
                {
                    pipe.Add(layer.Source);
                }

                if (layer.Properties.Filter != null)
                {
                    foreach (Dictionary <string, object> item in layer.Properties.Filter)
                    {
                        pipe.Add(item);
                    }
                }

                if (layer.ContainsKey("Crs") && layer.Crs != null && layer.Crs != "")
                {
                    string crs;
                    AppState.instance.mapProj.ExportToProj4(out crs);
                    pipe.Add(new {
                        type    = "filters.reprojection",
                        in_srs  = layer.Crs,
                        out_srs = crs
                    });
                }

                if (layer.Properties.ColorInterp != null)
                {
                    Dictionary <string, object> ci = new Dictionary <string, object>(layer.Properties.ColorInterp);
                    ci.Add("type", "filters.colorinterp");
                    pipe.Add(ci);
                }

                pipe.Add(new {
                    type     = "filters.projpipeline",
                    coord_op = "+proj=axisswap +order=1,3,2"
                });

                string json = JsonConvert.SerializeObject(new {
                    pipeline = pipe.ToArray()
                });

                Pipeline pipeline = new Pipeline(json);
                if (pipeline.Valid == false)
                {
                    throw new System.NotSupportedException("Layer : " + layer.Id + "  - PDAL Pipeline is not valid - check Layer configuration");
                }
                long pointCount         = pipeline.Execute();
                PointViewIterator views = pipeline.Views;
                if (views != null)
                {
                    PointView view = views != null ? views.Next : null;
                    if (view != null)
                    {
                        features = BakedPointCloud.Initialize(view.GetBpcData());
                        view.Dispose();
                    }
                    views.Dispose();
                }
                pipeline.Dispose();
                return(1);
            });

            t1.Start(TaskScheduler.FromCurrentSynchronizationContext());
            return(t1);
        }