Example #1
0
        private async Task ProcessRequest(IDeterminingPhenomenonRequest request)
        {
            Logger.Info($"Получен запрос (RequestId = {request.RequestId}) на обнаружение явления {request.Phenomenon}.");
            var polygon = new GeographicPolygon()
            {
                UpperLeft  = request.LeftUpper,
                LowerRight = request.RightLower
            };

            var processor = new DeterminingPhenomenonProcessor(Logger, request.DataFolders, request.ResultFolder, polygon, request.Phenomenon);

            bool isDetermined = processor.Proccess();

            var response = new DeterminingPhenomenonResponse
            {
                RequestId    = request.RequestId,
                IsDetermined = isDetermined
            };
            IDeterminingPhenomenonResponse resp =
                new DeterminingPhenomenonResponse {
                IsDetermined = false, RequestId = "asdasdasd"
            };
            var a = resp.IsDetermined;
            var b = resp.RequestId;
            await _busManager.Send <IDeterminingPhenomenonResponse>(BusQueueConstants.DeterminingPhenomenonResponsesQueueName, response);

            Logger.Info($"Обработан запрос (RequestId = {response.RequestId}) на обнаружение явления {request.Phenomenon}.");
        }
Example #2
0
        public static bool CloudValidation(string[] folders, GeographicPolygon polygon, string resultCloudMaskTifFilename, string resultCloudMaskPngFilename)
        {
            byte[]           cloudMask     = null;
            int              width         = 0;
            SpatialReference tifProjection = null;
            int              height        = 0;
            var              utmPolygon    = new UtmPolygon();

            foreach (var folder in folders)
            {
                var landsatData = new LandsatDataDescription(folder);
                var qaFile      = landsatData.ChannelBqa;

                using (var ds = Gdal.Open(qaFile, Access.GA_ReadOnly))
                {
                    double[] geotransform = new double[6];
                    ds.GetGeoTransform(geotransform);

                    utmPolygon = Helper.ConvertGeographicPolygonToUtm(polygon, ds);

                    using (var band = ds.GetRasterBand(1))
                    {
                        var projectionRef = ds.GetProjectionRef();
                        tifProjection = new SpatialReference(projectionRef);

                        var cuttedImageInfo = ClipImageHelper.GetCuttedImageInfoByPolygonData(utmPolygon, geotransform);

                        cloudMask = cloudMask ?? new byte[cuttedImageInfo.Width * cuttedImageInfo.Height];
                        cloudMask = GetCloudMaskByBandAndCoordinates(band, cuttedImageInfo, cloudMask);

                        width  = cuttedImageInfo.Width;
                        height = cuttedImageInfo.Height;
                    }
                }
            }

            if (cloudMask == null)
            {
                return(false);
            }

            double cloudedPointCount = cloudMask.Count(x => x != 0);

            var percentOfCloudedPoints = cloudedPointCount / cloudMask.Count();

            bool isValidCloudy = percentOfCloudedPoints < 0.14;

            tifProjection.ExportToWkt(out var inputShapeSrs);
            double[] argin = { polygon.UpperLeft.Latitude, 30, 0, polygon.UpperLeft.Longitude, 0, -30 };

            Helper.SaveDataInFile(resultCloudMaskTifFilename, cloudMask, width, height, DataType.GDT_Byte, argin, inputShapeSrs);
            DrawLib.DrawMask(cloudMask, width, height, resultCloudMaskPngFilename);

            return(isValidCloudy);
        }
        public static CuttedImageInfo GetCuttedImageInfoByPolygon(string filename, GeographicPolygon polygon)
        {
            CuttedImageInfo cuttedImageInfo;

            using (var ds = Gdal.Open(filename, Access.GA_ReadOnly))
            {
                double[] geotransform = new double[6];
                ds.GetGeoTransform(geotransform);

                var utmPolygon = Helper.ConvertGeographicPolygonToUtm(polygon, ds);

                cuttedImageInfo = GetCuttedImageInfoByPolygonData(utmPolygon, geotransform);
            }

            return(cuttedImageInfo);
        }
        public DeterminingPhenomenonProcessor(LogWriter logger, string[] dataFolders, string resultFolder, GeographicPolygon polygon,
                                              PhenomenonType phenomenon)
        {
            _logger       = logger;
            _dataFolders  = dataFolders;
            _resultFolder = resultFolder;
            _phenomenon   = phenomenon;
            _polygon      = polygon;

            _pathToCloudMaskTiffFile  = $@"{_resultFolder}{FilenamesConstants.PathToCloudMaskTiffFile}";
            _pathToCloudMaskPngFile   = $@"{_resultFolder}{FilenamesConstants.PathToCloudMaskPngFile}";
            _pathToDynamicFile        = $@"{_resultFolder}{FilenamesConstants.PathToDynamicFile}";
            _pathToEdgedDynamicFile   = $@"{_resultFolder}{FilenamesConstants.PathToEdgedDynamicFile}";
            _pathToVisibleImage       = $@"{_resultFolder}{FilenamesConstants.PathToVisibleImage}";
            _pathToVisibleDynamicFile = $@"{_resultFolder}{FilenamesConstants.PathToVisibleDynamicFile}";
            _pathToDynamicPointsJson  = $@"{_resultFolder}{FilenamesConstants.PathToDynamicGeoPointsJson}";
        }
Example #5
0
        public static GeographicPolygon ConvertUtmPolygonToGeographic(UtmPolygon utmPolygon, Dataset ds)
        {
            SpatialReference monUtm = new SpatialReference(ds.GetProjectionRef());

            var geoPolygon = new GeographicPolygon();

            SpatialReference monGeo = new SpatialReference(ds.GetProjectionRef());

            monGeo.ImportFromEPSG(4326);
            double[] res = new double[3];

            CoordinateTransformation coordTrans = new CoordinateTransformation(monUtm, monGeo);

            coordTrans.TransformPoint(res, utmPolygon.UpperLeft.Easting, utmPolygon.UpperLeft.Northing, 0);
            geoPolygon.UpperLeft.Longitude = res[0];
            geoPolygon.UpperLeft.Latitude  = res[1];

            coordTrans.TransformPoint(res, utmPolygon.LowerRight.Easting, utmPolygon.LowerRight.Northing, 0);
            geoPolygon.LowerRight.Longitude = res[0];
            geoPolygon.LowerRight.Latitude  = res[1];

            return(geoPolygon);
        }
        public static List <GeographicPoint> GetGeographicPointsByPointsIndexes(List <Point> points, string filename, GeographicPolygon polygon)
        {
            using (var ds = Gdal.Open(filename, Access.GA_ReadOnly))
            {
                var      georgrapicPoints = new List <GeographicPoint>();
                double[] geotransform     = new double[6];
                ds.GetGeoTransform(geotransform);

                var utmPolygon = Helper.ConvertGeographicPolygonToUtm(polygon, ds);

                var xinit = utmPolygon.UpperLeft.Easting;

                //utm-northing upperleft point
                var yinit = utmPolygon.UpperLeft.Northing;

                //размер пикселя
                var xsize = geotransform[1];
                var ysize = geotransform[5];

                var utmPoints = points.Select(p => new UtmPoint
                {
                    Easting  = xinit + xsize * p.X,
                    Northing = yinit - ysize * p.Y
                }
                                              );

                georgrapicPoints = utmPoints.Select(p => Helper.ConvertUtmPointToGeographic(p, ds)).ToList();

                return(georgrapicPoints);
            }
        }