首页 > 其他分享 >ArcGIS Pro SDK栅格颜色拉伸

ArcGIS Pro SDK栅格颜色拉伸

时间:2022-09-19 21:23:41浏览次数:70  
标签:ArcGIS max Pro 栅格 colors rasterLayer var new 255

protected override async void OnClick()
        {

            var rasterLayer = 
                MapView.Active.Map.GetLayersAsFlattenedList().OfType<ImageServiceLayer>().FirstOrDefault();
            if (rasterLayer == null)
            {
                MessageBox.Show("Please add a raster as layer 0", "Cannot find layer");
                return;
            }

            await QueuedTask.Run(async () =>
            {
                var renderer = rasterLayer.GetColorizer();

                var parametersMin = Geoprocessing.MakeValueArray(rasterLayer, "MINIMUM");
                var parametersMax = Geoprocessing.MakeValueArray(rasterLayer, "MAXIMUM");
                var minRes = await Geoprocessing.ExecuteToolAsync("GetRasterProperties_management", parametersMin);
                var maxRes = await Geoprocessing.ExecuteToolAsync("GetRasterProperties_management", parametersMax);

                var min = Convert.ToDouble(minRes.Values[0]);
                var max = Convert.ToDouble(maxRes.Values[0]);

                var layerCimRenderer = CreateStretchRendererFromScratch(min, max);

                //For examination in the debugger..
                string xmlDef = renderer.ToXml();
                string xmlDef2 = layerCimRenderer.ToXml();

                rasterLayer.SetColorizer(layerCimRenderer);

            });

        }

        /// <summary>
        /// Warning! You must call this method on the MCT!
        /// </summary>
        /// <returns></returns>
        private CIMRasterStretchColorizer CreateStretchRendererFromScratch(double min, double max)
        {
            //All of these methods have to be called on the MCT
            if (Module1.OnUIThread)
                throw new CalledOnWrongThreadException();

            var colors = getColors();

            var multiPartRamp = new CIMMultipartColorRamp
            {
                Weights = new double[colors.GetLength(0)]
            };
            CIMColorRamp[] rampValues = new CIMColorRamp[colors.GetLength(0)];
            for (int i = 0; i < colors.GetLength(0) - 1; i++)
            {
                var ramp = new CIMPolarContinuousColorRamp();
                var r = colors[i, 0];
                var g = colors[i, 1];
                var b = colors[i, 2];
                ramp.FromColor = new CIMRGBColor() { R = r, G = g, B = b };
                r = colors[i + 1, 0];
                g = colors[i + 1, 1];
                b = colors[i + 1, 2];
                ramp.ToColor = new CIMRGBColor() { R = r, G = g, B = b };
                ramp.PolarDirection = PolarDirection.Clockwise;
                rampValues[i] = ramp;
                multiPartRamp.Weights[i] = 1;
            }
            multiPartRamp.Weights[colors.GetLength(0) - 1] = 1;

            multiPartRamp.ColorRamps = rampValues;

            var colorizer = new CIMRasterStretchColorizer
            {
                ColorRamp = multiPartRamp,
                StretchType = RasterStretchType.StandardDeviations,
                StandardDeviationParam = 2,
                // in order to see the label on the layer we must add at least three values
                StretchClasses = new CIMRasterStretchClass[3]
            };
            colorizer.StretchClasses[0] = new CIMRasterStretchClass() { Value = min, Label = min.ToString() };
            colorizer.StretchClasses[1] = new CIMRasterStretchClass() { Value = max / 2 };
            colorizer.StretchClasses[2] = new CIMRasterStretchClass() { Value = max, Label = max.ToString() };

            return colorizer;
        }

        private int[,] getColors()
        {
            return new int[,] {{161,255,255,255},
                                {73,116,220,255},
                                {164,20,0,255},
                                {255,255,0,255}};
        }

 

标签:ArcGIS,max,Pro,栅格,colors,rasterLayer,var,new,255
From: https://www.cnblogs.com/gisoracle/p/16709108.html

相关文章