예제 #1
0
        private IGdalAlg InitGdalAlg_IWD(string algParms)
        {
            #region 参数结构

            //var jsonParams_Test = new
            //{
            //    algParms = new
            //    {
            //        Power = 2,
            //        Smoothing = 0,
            //        Radius1 = 0,
            //        Radius2 = 0,
            //        NoDataValue = -9999
            //    }
            //};
            #endregion

            // 初始IDW权重参数
            GdalAlg_IWD gdalAlg   = new GdalAlg_IWD();
            var         paramsIDW = JsonConvert.DeserializeObject <dynamic>(algParms);
            gdalAlg.Power       = Convert.ToDouble(paramsIDW["Power"] + "");
            gdalAlg.Smoothing   = Convert.ToDouble(paramsIDW["Smoothing"] + "");
            gdalAlg.Radius1     = Convert.ToDouble(paramsIDW["Radius1"] + "");
            gdalAlg.Radius2     = Convert.ToDouble(paramsIDW["Radius2"] + "");
            gdalAlg.NoDataValue = Convert.ToDouble(paramsIDW["NoDataValue"] + "");

            return(gdalAlg);
        }
예제 #2
0
        /// <summary>分布图
        /// </summary>
        /// <param name="strParams">json参数</param>
        /// <returns></returns>
        private bool RunModel_Distribution()
        {
            // 解析参数
            var jsonParams = _Params;

            // 初始插值方法对象
            GdalAlg_IWD gdalAlg  = null;
            string      algType  = jsonParams["algType"] + "";
            string      algParms = JsonConvert.SerializeObject(jsonParams["algParms"]);

            switch (algType)
            {
            case "IDW":
                gdalAlg = (GdalAlg_IWD)InitGdalAlg_IWD(algParms);
                break;

            default:
                break;
            }

            // 初始格网生成参数
            string srcVectorFilename = jsonParams["srcData"]["srcVectorFilename"] + "";
            string srcTimeType       = jsonParams["srcData"]["srcTimeType"] + "";
            string strAtrrName       = jsonParams["algParms"]["algAtrrName"] + "";

            if (srcTimeType != "")
            {
                srcTimeType = "_" + srcTimeType + "";
            }
            double dCellSize         = Convert.ToDouble(jsonParams["algParms"]["algCellSize"] + "");
            double dEnvelope_offsetX = Convert.ToDouble(jsonParams["algParms"]["algEnvelope_offsetX"] + "");
            double dEnvelope_offsetY = Convert.ToDouble(jsonParams["algParms"]["algEnvelope_offsetY"] + "");
            double dNoDataValue      = -9999;

            string srcFileName           = Path.GetFileNameWithoutExtension(srcVectorFilename);
            string dstRasterFilename     = _FloderTemp + GdalCommon.CreateName(_FloderTemp, srcFileName, ".tiff") + ".tiff";
            bool   isUseClip             = Convert.ToBoolean(jsonParams["clipData"]["clipVaild"] + "");
            string clipVectorWhere       = jsonParams["clipData"]["clipWhere"] + "";
            string division              = clipVectorWhere != "" ? clipVectorWhere : "division";
            string clipVectorFilename    = GdalCommon.GetFile_Division(Convert.ToString(jsonParams["clipData"]["infoDivision"])) + division + ".geojson";
            string dstRasterFilenameClip = dstRasterFilename;

            if (isUseClip)
            {
                dstRasterFilenameClip = _FloderTemp + GdalCommon.CreateName(_FloderTemp, srcFileName, ".tiff") + "_Clip.tiff";
            }
            string strFileName = jsonParams["dstContour"]["dstFileName"] + "";

            strFileName   = strFileName != "" ? strFileName : _dtTag;  //GdalCommon.CreateName(_FloderTemp, "", ".geojson");
            _nameTag      = strAtrrName + srcTimeType + strFileName;
            _FloderOutput = _FloderOutput + "Distribution/" + gdalAlg.AlgName + "/";
            string outFilename = _FloderOutput + _nameTag + ".geojson";

            if (!Directory.Exists(_FloderOutput))
            {
                Directory.CreateDirectory(_FloderOutput);
            }

            // 初始插值源数据
            IGdalRead gdalRead = GdalRead_Factory.CreateGdalRead(srcVectorFilename);

            if (!gdalRead.InitDataSource(srcVectorFilename, Encoding.UTF8, 0, false))
            {
                Console.WriteLine(srcVectorFilename);
                this.InitError(string.Format("插值源数据{0}打开失败!数据不存在或文件错误!", Path.GetFileName(srcVectorFilename)), true);
                return(false);
            }

            // 调用IDW插值算法生成格网
            GdalTrans_Grid poTrans = new GdalTrans_Grid(gdalRead, gdalAlg);

            if (poTrans.TransToGrid(strAtrrName, dstRasterFilename, dCellSize, dEnvelope_offsetX, dEnvelope_offsetY) == false)
            {
                this.InitError("IDW插值算法生成格网出错!", true);
                return(false);
            }

            // 调用裁剪
            if (isUseClip)
            {
                GdalTrans_Clip poTrans_Clip = new GdalTrans_Clip();
                if (poTrans_Clip.ClipRaster(clipVectorFilename, "", dstRasterFilename, 1, dstRasterFilenameClip, dNoDataValue) == false)
                {
                    this.InitError("IDW插值格网裁剪出错!", true);
                    return(false);
                }
            }


            // 初始等值面提取参数
            double[] dLevelIntervals = jsonParams["dstContour"]["LevelIntervals"].ToObject <List <double> >().ToArray();
            double   dLevelBase      = Convert.ToDouble(jsonParams["dstContour"]["LevelBase"] + "");
            bool     isPolygon       = Convert.ToBoolean(jsonParams["dstContour"]["IsPolygon"] + "");

            // 调用等值面提取
            GdalTrans_Contour poTrans_Contour = new GdalTrans_Contour(gdalRead);

            poTrans_Contour.ContourGenerate(dstRasterFilenameClip, outFilename, 1, dLevelIntervals, dLevelBase, isPolygon);

            // 组装返回结果
            _ModeState = emModeState.Runout;
            _Datas     = new JObject();
            _Datas.Add("typeFile", "GeoJSON");
            _Datas.Add("typeAlg", algType);
            _Datas.Add("title", strAtrrName + srcTimeType);
            _Datas.Add("nameTag", _nameTag);
            _Datas.Add("outFile", outFilename);
            _dstRasterFile = dstRasterFilenameClip;
            return(true);
        }