ArcGIS Server 9.3 纵断面分析的一些重要代码。

 首先是在前台写一个框选的js函数,然后将获得的四个顶点的坐标通过callback函数传到后台,如下进行:

public static string VerticalAnaysis(double Xmin, double Ymin, double Xmax, double Ymax,ESRI.ArcGIS.ADF.Web.UI.WebControls.Map map)
       {
           try
           {
               ESRI.ArcGIS.ADF.Web.Geometry.Envelope pEnve = new ESRI.ArcGIS.ADF.Web.Geometry.Envelope(Xmin, Ymin, Xmax, Ymax);

               object[] oa = new object[1];
               if (map.Scale > 8000)
               {
                   oa[0] = "Ext.MessageBox.alert('提示','为了使用纵断面分析,请把地图比例尺放大到8000以内');";
                   CallbackResult pRst = new CallbackResult(null, null, "javascript", oa);
                   map.CallbackResults.Add(pRst);
                   return map.CallbackResults.ToString(); ;
               }

               ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality pMapFun = (ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality)map.GetFunctionality("管线");
               ESRI.ArcGIS.ADF.Web.DataSources.IGISResource pMapRes = pMapFun.Resource;

               string sJS = string.Empty;
               if (pMapRes.SupportsFunctionality(typeof(IQueryFunctionality)))
               {
                   IQueryFunctionality pQueryFun = pMapRes.CreateFunctionality(typeof(IQueryFunctionality), null) as IQueryFunctionality;
                   string[] sLyrIDs, sLyrNames;
                   pQueryFun.GetQueryableLayers(null, out sLyrIDs, out sLyrNames, ESRI.ArcGIS.ADF.Web.FeatureType.Line);
                   if (sLyrNames.Length > 0)
                   {
                       string m_VCrsLyrname = String.Empty;
                       ArrayList pRowLst = null;
                       if (map.Page.Session["VCrossLyrName"] != null)
                           m_VCrsLyrname = map.Page.Session["VCrossLyrName"].ToString();
                       if (map.Page.Session["VCrossLst"] != null)
                           pRowLst = map.Page.Session["VCrossLst"] as ArrayList;
                       ESRI.ArcGIS.ADF.Web.SpatialFilter pQFilter = new ESRI.ArcGIS.ADF.Web.SpatialFilter();
                       pQFilter.MaxRecords = 100;
                       pQFilter.ReturnADFGeometries = true;
                       pQFilter.Geometry = pEnve;
                       ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer glayer = null;
                       DataTable pDT = new DataTable();
                       for (int i = 0; i < sLyrNames.Length; i++)
                       {
                           if (m_VCrsLyrname == string.Empty)
                           {
                               pDT = pQueryFun.Query(null, sLyrIDs[i], pQFilter);
                               if (pDT.Rows.Count > 0)
                               {
                                   ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality pMapFun1 = map.GetFunctionality("TempEle") as ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality;
                                   //if (pMapFun1 == null) return "";
                                   ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource pGraRes = pMapFun1.Resource as ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource;
                                   //if (pGraRes.Graphics == null) return "";

                                   if (!pGraRes.Graphics.Tables.Contains(sLyrNames[i]))
                                   {
                                       glayer = new ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer();
                                       glayer.TableName = sLyrNames[i];
                                       map.Page.Session["VCrossLyrName"] = sLyrNames[i];
                                       m_VCrsLyrname = sLyrNames[i];
                                       pGraRes.Graphics.Tables.Add(glayer);

                                   }
                                   else
                                   {
                                       map.Page.Session["VCrossLyrName"] = sLyrNames[i];
                                       m_VCrsLyrname = sLyrNames[i];
                                       glayer = pGraRes.Graphics.Tables[m_VCrsLyrname] as ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer;
                                       if (glayer.Rows.Count > 0)
                                           glayer.Rows.Clear();
                                   }
                                   pGraRes.DisplaySettings.Transparency = 0;
                                   ESRI.ArcGIS.ADF.Web.Display.Graphics.GraphicsLayer pGraLyr = ESRI.ArcGIS.ADF.Web.Converter.ToGraphicsLayer(pDT);
                                   if (pRowLst == null)
                                   {
                                       pRowLst = new ArrayList();
                                       map.Page.Session["VCrossLst"] = pRowLst;
                                   }
                                   for (int j = 0; j < pDT.Rows.Count; j++)
                                   {
                                       pRowLst.Add(pDT.Rows[j]);
                                       ESRI.ArcGIS.ADF.Web.Geometry.Geometry pSelGeo = pGraLyr.GeometryFromRow(pDT.Rows[j]) as ESRI.ArcGIS.ADF.Web.Geometry.Geometry;
                                       ESRI.ArcGIS.ADF.Web.Display.Graphics.GraphicElement pGraEle = new ESRI.ArcGIS.ADF.Web.Display.Graphics.GraphicElement(pSelGeo, System.Drawing.Color.Red);
                                       glayer.Add(pGraEle);
                                   }


                                   pDT.Dispose();
                                   if (map.ImageBlendingMode == ImageBlendingMode.WebTier)
                                       map.Refresh();
                                   else
                                       map.RefreshResource("TempEle");

                               }
                               pDT.Dispose();

                           }
                           else if (m_VCrsLyrname == sLyrNames[i])
                           {
                               pDT = pQueryFun.Query(null, sLyrIDs[i], pQFilter);
                               if (pDT.Rows.Count > 0)
                               {
                                   ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality pMapFun1 = map.GetFunctionality("TempEle") as ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality;
                                   ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource pGraRes = pMapFun1.Resource as ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource;
                        
                                   // ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer glayer = null;
                                   if (!pGraRes.Graphics.Tables.Contains(sLyrNames[i]))
                                   {
                                       glayer = new ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer();
                                       glayer.TableName = sLyrNames[i];
                                       map.Page.Session["VCrossLyrName"] = sLyrNames[i];
                                       m_VCrsLyrname = sLyrNames[i];
                                       pGraRes.Graphics.Tables.Add(glayer);
                                   }
                                   else
                                   {
                                       glayer = pGraRes.Graphics.Tables[m_VCrsLyrname] as ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer;
                                   }
                                   pGraRes.DisplaySettings.Transparency = 0;

                                   ESRI.ArcGIS.ADF.Web.Display.Graphics.GraphicsLayer pGraLyr = ESRI.ArcGIS.ADF.Web.Converter.ToGraphicsLayer(pDT);
                                   for (int j = 0; j < pDT.Rows.Count; j++)
                                   {
                                       pRowLst.Add(pDT.Rows[j]);
                                       ESRI.ArcGIS.ADF.Web.Geometry.Geometry pSelGeo = pGraLyr.GeometryFromRow(pDT.Rows[j]) as ESRI.ArcGIS.ADF.Web.Geometry.Geometry;
                                       ESRI.ArcGIS.ADF.Web.Display.Graphics.GraphicElement pGraEle = new ESRI.ArcGIS.ADF.Web.Display.Graphics.GraphicElement(pSelGeo, System.Drawing.Color.Red);
                                       glayer.Add(pGraEle);
                                   }
                                   if (map.ImageBlendingMode == ImageBlendingMode.WebTier)
                                       map.Refresh();
                                   else
                                       map.RefreshResource("TempEle");

                               }
                           }
                       }

                       if (pRowLst.Count > 0)
                       {
                           ArrayList pLst =commCls.WriteData(glayer, pMapRes as ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapResourceLocal, pRowLst);
                           if (pLst != null)
                           {
                               map.Page.Session["DMFX"] = pLst;
                               //sJS = "var win=window.open('VerAnaResult.aspx','','left=0,top=0,width=1024,height=650,toolbar=no,location=no,status=yes,menubar=no,scrollbars=no,resizable=no');win.focus();";
                               sJS = "var win=new ShowWindow('纵断面分析', 'VerAnaResult.aspx', 1024, 700,100,120,true);win.show();";
                               object[] oa1 = new object[1];
                               oa1[0] = sJS;
                               CallbackResult rst1 = new CallbackResult(map.Page, "javascript", oa1);
                               map.CallbackResults.Add(rst1);
                             return map.CallbackResults.ToString();
                           }

                       }
                       map.Page.Session.Remove("VCrossLyrName");
                       map.Page.Session.Remove("VCrossLst");
                       pDT.Dispose();

                   }
               }
           }
           catch (Exception ex)
           {
               SystemLog.WriteLog("纵断面分析出错!", ex);
              
           }
           return "";
       }

//在管段数据中必须得包括起点高程、起点埋深,终点高程,终点埋深。

 public class commCls
   {
       //写纵断面数据
       public static ArrayList WriteData(ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer pGraLyr, ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapResourceLocal pMapLocalRes, ArrayList pRowsLst)
       {
           try
           {
               if (pGraLyr == null) return null;
               if (pGraLyr.Rows.Count < 1) return null;
               IServerContext pSC = pMapLocalRes.ServerContextInfo.ServerContext;

               using (ESRI.ArcGIS.ADF.ComReleaser pComRelease = new ESRI.ArcGIS.ADF.ComReleaser())
               {
                   IMapServerObjects pMapOjbs = pMapLocalRes.MapServer as IMapServerObjects;
                   pComRelease.ManageLifetime(pMapOjbs);
                   IMap pMap = pMapOjbs.get_Map(pMapLocalRes.DataFrame);
                   pComRelease.ManageLifetime(pMap);
                   IFeatureLayer pFlyr = null;
                   for (int i = 0; i < pMap.LayerCount; i++)
                       if (pMap.get_Layer(i).Name == pGraLyr.TableName)
                       {
                           pFlyr = pMap.get_Layer(i) as IFeatureLayer;
                           pComRelease.ManageLifetime(pFlyr);
                           break;
                       }
                   if (pFlyr == null) return null;
                   DataTable pDTT = ESRI.ArcGIS.ADF.Web.Converter.ToDataTable(pGraLyr);
                   string s = pDTT.TableName;
                    // public string TypeName;         //管线类型名称(大类)
                    //public string TypeCode;         //管线类型代码(大类)
                   //public string SubTypeName;      //管线类型名称(小类)
                   //public string subTypeCode;      //管线类型代码(小类)

                   //public float SurfH1;            //起点地面高程 ★
                   //public float SurfH2;            //终点地面高程 ★

                   //public string Exp1;             //起始点号
                   //public string Exp2;             //终止点号
                   //public float Deep1;   //起点埋深
                   //public float Deep2;             //终点埋深
                   //public string Ds;               //管径(取自字段值)

 

                   string sSaveStr ="\"浙江省天然气\",\"纵断面分析\",\"1234\"" + Environment.NewLine, sExp = "/";
                   ArrayList arFileData = new ArrayList();
                   arFileData.Add("\"浙江省天然气\",\"纵断面分析\",\"1234\"");

                   int FldExp1, FldExp2, FldEla1, FldEla2, FldD1, FldD2, FldDs,FldHD;
                   string Exp1, Exp2;
             
                           FldExp1 = (pRowsLst[0] as DataRow).Table.Columns.IndexOf("STARTPOINT");
                   FldExp2 = (pRowsLst[0] as DataRow).Table.Columns.IndexOf("ENDPOINT");
                   FldEla1 = (pRowsLst[0] as DataRow).Table.Columns.IndexOf("SELAVATION");
                   FldEla2=(pRowsLst[0] as DataRow).Table.Columns.IndexOf("EELAVATION");
                   FldD1 = (pRowsLst[0] as DataRow).Table.Columns.IndexOf("SDEPTH");
                   FldD2 = (pRowsLst[0] as DataRow).Table.Columns.IndexOf("EDEPTH");
                   FldDs = (pRowsLst[0] as DataRow).Table.Columns.IndexOf("PIPEDIAMETER");
                   FldHD = (pRowsLst[0] as DataRow).Table.Columns.IndexOf("HORIZONTALDISTANCE");
                                 string SubName = pGraLyr.TableName;
                                  string pipeColor = "0";
                                  ESRI.ArcGIS.ADF.Web.Geometry.Geometry pAdfGeo = null;
                   ESRI.ArcGIS.ADF.Web.Geometry.Point pPnt = null;
                   ESRI.ArcGIS.ADF.Web.Geometry.Point pPnt1 = null;
                   string FtrString = String.Empty;
                   double H = 0, H1=0,Deep1, Deep2, H2 = 0;
                   for (int iR = 0; iR < pGraLyr.Rows.Count; iR++)
                   {
                       string sPrjNo = string.Empty, sEPrjNo = string.Empty;
                     
                           pAdfGeo = pGraLyr.GeometryFromRow(pGraLyr.Rows[iR]);
                           pPnt = (pAdfGeo as ESRI.ArcGIS.ADF.Web.Geometry.Polyline).Paths[0].Points[0];
                           int n1 = (pAdfGeo as ESRI.ArcGIS.ADF.Web.Geometry.Polyline).Paths.Count;
                           int n2 = (pAdfGeo as ESRI.ArcGIS.ADF.Web.Geometry.Polyline).Paths[n1-1].Points.Count;
                          
                       Deep1 = Math.Round(Convert.ToDouble((pRowsLst[iR] as DataRow)[FldD1]), 2);
                           Deep2 = Math.Round(Convert.ToDouble((pRowsLst[iR] as DataRow)[FldD2]), 2);
                           H1 = Math.Round(Convert.ToDouble((pRowsLst[iR] as DataRow)[FldEla1]), 2);
                           H2 = Math.Round(Convert.ToDouble((pRowsLst[iR] as DataRow)[FldEla2]), 2);
                       //获得管段起始点和终止点的高程
                           FtrString = pPnt.X.ToString() + "," + pPnt.Y.ToString() + "," + pipeColor + "," + (H1 + Deep1).ToString() + "," + H1.ToString() + "," + (pRowsLst[iR] as DataRow)[FldDs].ToString();
                           arFileData.Add(FtrString);
                           pPnt1 = (pAdfGeo as ESRI.ArcGIS.ADF.Web.Geometry.Polyline).Paths[n1-1].Points[n2-1];
                           FtrString = pPnt1.X.ToString() + "," + pPnt1.Y.ToString() + ","  + pipeColor + "," + (H2 + Deep2).ToString() + "," + H2.ToString() + "," + (pRowsLst[iR] as DataRow)[FldDs].ToString();
                           arFileData.Add(FtrString);
                       
                   
                    }
             
                    return arFileData;  
                }                        
            }
           catch (Exception Err)
           {
               string s = Err.Message;
               return null;
           }
       }

接着就是自己将结果 arFileData展示出来了。


    

posted @ 2009-03-01 17:21  周文  阅读(972)  评论(0编辑  收藏  举报