⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 selecttooltask.cs

📁 C#开发的ArcGIS Server9.2地图选择控件
💻 CS
📖 第 1 页 / 共 3 页
字号:

            // perform the query
            System.Data.DataTable queryResults = lyrQuery.DoQuery();

            #endregion

            #region Convert results to graphics layer

            FeatureGraphicsLayer grLayer = null;
            if (queryResults != null)
            {
                System.Drawing.Color hiliteColor = SelectedSetColor;
                if (!RenderSelectedSet)
                    hiliteColor = System.Drawing.Color.Empty;

                grLayer =
                    ESRI.ArcGIS.ADF.Web.UI.WebControls.Converter.ToGraphicsLayer(
                    queryResults, hiliteColor, FeatureSelectionColor)
                    as FeatureGraphicsLayer;
            }
            
            if (grLayer == null)
            {
                Results = new SimpleTaskResult(
                    String.Concat(this.ID, ": No features found"), "");
                return;
            }
            #endregion

            #region Modify renderer and selected renderer

            if (grLayer != null)
            {
                FeatureSymbol symbol;

                // .Renderer present if RenderSelectedSet is true
                if (grLayer.Renderer != null)
                {
                    symbol =
                        ((ESRI.ArcGIS.ADF.Web.Display.Renderer.SimpleRenderer)grLayer.Renderer).Symbol;

                    // change polygon symbol to diagonal fill, using outline color
                    if (symbol is SimpleFillSymbol)
                    {
                        SimpleFillSymbol sfs = (SimpleFillSymbol)symbol;
                        sfs.BoundaryColor = SelectedSetColor;
                        sfs.BoundaryWidth = 2;
                        sfs.Transparency = 30;
                        sfs.FillType = PolygonFillType.FDiagonal;
                    }
                }

                symbol = ((ESRI.ArcGIS.ADF.Web.Display.Renderer.SimpleRenderer)grLayer.SelectedRenderer).Symbol;
                if (symbol is SimpleFillSymbol)
                {
                    symbol.Transparency = 0;
                    SimpleFillSymbol sfs = (SimpleFillSymbol)symbol;
                    sfs.BoundaryColor = FeatureSelectionColor;
                    sfs.BoundaryWidth = 2;
                    sfs.FillType = PolygonFillType.FDiagonal;
                    sfs.Color = FeatureSelectionColor;
                }
                
            #endregion

            #region Set Results for use by TaskResults

                GraphicsDataSet outputDataSet = new GraphicsDataSet();
                outputDataSet.DataSetName = String.Format("{0} - {1} ({2})",
                    ResultsTitle, grLayer.TableName, queryResults.Rows.Count);
                if (grLayer != null)
                    outputDataSet.Tables.Add(grLayer);

                Results = outputDataSet;
            }
            #endregion

            #region Turn off previous selections if enabled in properties

            if (HidePreviousSelections)
            {

                List<TaskResults> taskResList = Utilities.GetTaskResultsControls(
                    this.TaskResultsContainers, this.Page);
                //bool refreshTasks;
                List<string> resourcesToRefresh = new List<string>();

                // possible to have multiple TaskResults controls buddied to the task
                foreach (TaskResults taskRes in taskResList)
                {
                    //refreshTasks = false;
                    foreach (TreeViewPlusNode rNode in taskRes.Nodes)
                    {
                        if (rNode is TaskResultNode)
                        {
                            // Turn off only results from this instance of the selection task
                            if (((TaskResultNode)rNode).TaskID == this.UniqueID)
                            {
                                // Make sure the result node is actually a graphicslayer node
                                //  (No-features-found node will have a subnode, but not GraphicsLayerNode)
                                if (rNode.Nodes.Count > 0 &&
                                    rNode.Nodes[0] is GraphicsLayerNode)
                                {
                                    GraphicsLayerNode glNode = rNode.Nodes[0] as GraphicsLayerNode;
                                    // if layer is visible, turn it off
                                    if (glNode.GetVisibility(taskRes))
                                    {
                                        // must BOTH turn off checkbox AND turn off layer!
                                        glNode.Checked = false;
                                        glNode.SetVisibility(taskRes, false);

                                        // add resource to list if not already there
                                        string resourceName = glNode.GetResourceName(taskRes);
                                        if (resourcesToRefresh.IndexOf(resourceName) < 0)
                                            resourcesToRefresh.Add(resourceName);
                                    }
                                }
                            }
                        }
                    }

                    // must explicitly refresh resources if browser blends images
                    if (resourcesToRefresh.Count > 0)
                    {
                        if (mapCtrl.ImageBlendingMode == ImageBlendingMode.Browser)
                        {
                            foreach (string resourceName in resourcesToRefresh)
                                mapCtrl.RefreshResource(resourceName);

                            CallbackResults.CopyFrom(mapCtrl.CallbackResults);
                        }
                    }
                }
            }
            
            #endregion

            // Clean up query functionality
            lyrQuery.Close();
        }
        #endregion

        #region Private methods
       
        #region EnsureMapControl method
        private bool EnsureMapControl()
        {
            if (mapCtrl == null)
                mapCtrl = (ESRI.ArcGIS.ADF.Web.UI.WebControls.Map)Utilities.FindControlRecursive(Page, this.Map);
            // if Map property blank/null or not found, try to find first map in page
            if (mapCtrl == null)
            {
                List<Control> maps = Utilities.FindControls(typeof(Map), Page.Controls);
                if (maps.Count > 0)
                    mapCtrl = maps[0] as Map;
            }
            return (mapCtrl != null);
        }
        #endregion

        #region SetSelectionGeometry method
        /// <summary>
        /// Called by SelectTool, which passes in the user's tool geometry (point, rectangle, etc.).
        /// Sets up the selection on the map.
        /// </summary>
        /// <param name="selectionGeometry">Geometry for selection</param>
        protected internal void SetSelectionGeometry (ESRI.ArcGIS.ADF.Web.Geometry.Geometry selectionGeometry){
            
            EnsureMapControl();

            SelectionGeometry = selectionGeometry;
            
            // Call execute task via callback 
            //  (is there a way to do this directly that works with callback framework?)

            string layerList = String.Format("var gstLayers=document.getElementById(\"{0}\");", 
                ddlLayerList.ClientID);
            string layerValue = "var argument=\"layerId=\"+gstLayers.options[gstLayers.selectedIndex].value;";
            string taskCall = string.Format("var tmp=\"executeTask('\" + argument + \"', \\\"{0}\\\")\";",
                CallbackFunctionString);
            // Must include a delay, otherwise causes repeated client callback loop
            string timeoutCall = "window.setTimeout(tmp,200);";
            string jsString = String.Concat(layerList, layerValue, taskCall, timeoutCall);

            CallbackResult cbr = new CallbackResult(this, "javascript", new object[] { jsString });
            this.mapCtrl.CallbackResults.Add(cbr);

            ResetCursor(mapCtrl);
        }
        #endregion

        #region ResetCursor method
        private void ResetCursor(Map mapCtrl)
        {
            Object[] oa = new Object[1];

            // Issue with the map control as the context for callback: need to tell map to reset the cursor
            oa[0] = "map.divObject.style.cursor = 'pointer';";// map.cursor";

            CallbackResult cr1 = new CallbackResult(mapCtrl, "javascript", oa);
            mapCtrl.CallbackResults.Add(cr1);
        }
        #endregion

        #region ParseLayerId method
        private void ParseLayerId(string inputString, out string layerId, out string resourceName)
        {
            layerId = null; // String.Empty; 
            resourceName = null; // String.Empty;

            int dPos = inputString.IndexOf(idStringDelim);
            if (dPos > 0)
            {
                layerId = inputString.Substring(0, dPos);
                resourceName = inputString.Substring(dPos + idStringDelim.Length);
            }
        }
        #endregion

        #endregion

        #region Geometry serialization methods

        public static string SerializeGeometry(Geometry geometry)
        {
            string serGeom = String.Empty;
            StringBuilder sbGeom;

            if (geometry is Point)
            {
                Point p = (Point)geometry;
                serGeom = String.Format("{0}:{1}", p.X.ToString(), p.Y.ToString());
            }
            else if (geometry is Envelope)
            {
                Envelope env = (Envelope)geometry;
                serGeom = String.Format("{0}:{1}:{2}:{3}", env.XMin.ToString(),
                    env.YMin.ToString(), env.XMax.ToString(), env.YMax.ToString());
            }
            else if (geometry is Polyline)
            {
                Polyline pl = (Polyline)geometry;
                sbGeom = new StringBuilder();
                foreach (Path path in pl.Paths)
                    sbGeom.AppendFormat("{0}~", PointsToString(path.Points));
                sbGeom.Remove(sbGeom.Length - 1, 1);
                serGeom = sbGeom.ToString();
            }
            else if (geometry is Polygon)
            {
                Polygon poly = (Polygon)geometry;
                sbGeom = new StringBuilder();
                foreach (Ring ring in poly.Rings)
                    sbGeom.AppendFormat("{0}~", PointsToString(ring.Points));
                sbGeom.Remove(sbGeom.Length - 1, 1);
                serGeom = sbGeom.ToString();
            }

            return serGeom;
        }

        public static Geometry DeserializeGeometry(string geometryString, Type geometryType)
        {
            Geometry geom = null;
            string[] gArr;
            char[] xyDelim = new char[] { ':' };
            char ptDelim = '|';
            char pathDelim = '~';

            if (geometryType == typeof(Point))
            {
                gArr = geometryString.Split(xyDelim);
                geom = new Point(double.Parse(gArr[0]), double.Parse(gArr[1]));
            }
            else if (geometryType == typeof(Envelope))
            {
                gArr = geometryString.Split(xyDelim);
                geom = new Envelope(double.Parse(gArr[0]), double.Parse(gArr[1]),
                    double.Parse(gArr[2]), double.Parse(gArr[3]));
            }
            else if (geometryType == typeof(Polyline))
            {
                gArr = geometryString.Split(pathDelim);
                Polyline pLine = new Polyline();
                foreach (string pathStr in gArr)
                    pLine.Paths.Add(new Path(pathStr, ptDelim, xyDelim[0]));
                geom = pLine;
            }
            else if (geometryType == typeof(Polygon))
            {
                gArr = geometryString.Split(pathDelim);
                Polygon poly = new Polygon();
                foreach (string ringStr in gArr)
                    poly.Rings.Add(new Ring(ringStr, ptDelim, xyDelim[0]));
                geom = poly;
            }

            return geom;
        }

        private static string PointsToString(PointCollection ptColl)
        {
            StringBuilder sbPts = new StringBuilder();
            foreach (Point p in ptColl)
                sbPts.AppendFormat("{0}:{1}|", p.X.ToString(), p.Y.ToString());
            // remove last |
            sbPts.Remove(sbPts.Length - 1, 1);
            return sbPts.ToString();
        }
        #endregion
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -