• ArcGis Server开发Web GIS新手体验(四)


    接(三)

    这一节主要贴代码算了,通过代码看一下一些简单功能的实现。偶快要放假了,静不下心来写了,写得也不好。说不定贴代码效果更好。

    1、获取所有图层

        ESRI.ArcGIS.Server.WebControls.WebMap webmap= Map1.CreateWebMap();
        
    try
        {
         ESRI.ArcGIS.Carto.IMapDescription descr 
    = webmap.MapDescription;   
         ddlLayers.Items.Clear();
         
    int id;
         
    for (int i=0;i<= descr.LayerDescriptions.Count-1;i++)
         {
          id 
    = descr.LayerDescriptions.get_Element(i).ID;
          ddlLayers.Items.Add(id.ToString() 
    + "," + webmap.LayerNameFromID(id));    //ddlLayers是一个DropDownList控件
         }
         
    if (ddlLayers.Items.Count>0)
         {
          ddlLayers.SelectedIndex
    =0;
         } 
                 
        }
        
    finally
        {
         webmap.Dispose();
        }


    2、通过图层的ID获取图层对象

        private IFeatureLayer GetFeatureLayer(int lyid)
      {
       WebMap webmap 
    = Map1.CreateWebMap();
       
    try
       {
        ILayer layer 
    = (webmap.MapServer as IMapServerObjects).get_Layer(webmap.DataFrame,lyid);
        
    if (layer==null)
         
    return null;
        
    else
        {
         
    return (layer as IFeatureLayer);
        }
       }
       
    finally
       {
        webmap.Dispose();
       }
          
      }


    3、新建一个多边形

      private void Map1_Polygon(object sender, ESRI.ArcGIS.Server.WebControls.PolygonEventArgs args)
      
    {
       
    if (args.ToolName == "newpolygon")
       
    {
        IFeatureLayer flayer 
    = GetCurFeatureLayer();        //获取当前活动图层了函数,这里就不贴了,就是调用GetFeatureLayer(int lyid)函数
        if (flayer == nullreturn;
        
        
    if (flayer.FeatureClass.ShapeType != ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon) 
        
    {
         
    string sc;
         sc 
    = "<script language=javascript>alert('当前图层何类型不对!')</script>";
         Page.RegisterClientScriptBlock(
    "ShapeTypeError",sc);
         
    return;
        }


        
    //生成多边形
        ESRI.ArcGIS.Server.IServerContext context;
        ESRI.ArcGIS.Server.WebControls.WebMap webmap 
    = Map1.CreateWebMap();
        webmap.ManageLifetime(flayer);
        context 
    = webmap.ServerContext;
        ESRI.ArcGIS.Geometry.IPolygon poly 
    = context.CreateObject("esriGeometry.Polygon"as ESRI.ArcGIS.Geometry.IPolygon; //'new ag.PolygonClass();
        webmap.ManageLifetime(poly);
        ESRI.ArcGIS.Geometry.IPoint pt;
        ESRI.ArcGIS.Geometry.IGeometryCollection ringcol 
    = context.CreateObject("esriGeometry.Polygon"as ESRI.ArcGIS.Geometry.IGeometryCollection;// new  PolygonClass();
        webmap.ManageLifetime(ringcol);
        ESRI.ArcGIS.Geometry.IPointCollection ptcol 
    =context.CreateObject("esriGeometry.Ring"as ESRI.ArcGIS.Geometry.IPointCollection;// new RingClass();
        webmap.ManageLifetime(ptcol);
        
    object obj=Type.Missing;
        
    for (int i=0;i<=args.Vectors.Length-1;i++)
        
    {
         pt 
    = webmap.ToMapPoint(args.Vectors[i].X,args.Vectors[i].Y);
         ptcol.AddPoint(pt,
    ref obj,ref obj);
        }

        ringcol.AddGeometry(ptcol 
    as IGeometry,ref obj,ref obj);    
        poly 
    = ringcol as IPolygon;    

        
    //将多边形写入到图层中
        ESRI.ArcGIS.Geodatabase.IFeature feature =  flayer.FeatureClass.CreateFeature();
        feature.Shape 
    = poly as IGeometry;
        feature.Store();
        webmap.Refresh();

        webmap.Dispose();
       }

      }



    4、矩形选择,获得选择集,并在地图上显示选中的对象。(这个功能花费了偶一天多的时间。)

      private void Map1_DragRectangle(object sender, ESRI.ArcGIS.Server.WebControls.ToolEventArgs args)
      
    {
       
    string strTool = args.ToolName.ToLower();
       
    if (strTool=="rectsel"
       
    {
        
    //取得当前层
        if (ddlLayers.SelectedValue=="")
         
    return;
        IFeatureLayer flayer 
    = GetCurFeatureLayer(); 
        
    if (flayer == nullreturn;
        
        
    //获得选择集
        int t1=Environment.TickCount;
        ESRI.ArcGIS.Server.WebControls.WebMap webmap 
    = Map1.CreateWebMap();
        ESRI.ArcGIS.Server.IServerContext ctx 
    = webmap.ServerContext;
        webmap.ManageLifetime(ctx);
        ESRI.ArcGIS.Geodatabase.IWorkspace ws 
    = (flayer.FeatureClass as ESRI.ArcGIS.Geodatabase.IDataset).Workspace;
        ESRI.ArcGIS.Geometry.IEnvelope env 
    = ctx.CreateObject("esriGeometry.Envelope"as ESRI.ArcGIS.Geometry.IEnvelope;
        webmap.ManageLifetime(ws);
        webmap.ManageLifetime(env);
        IPoint pt 
    = webmap.ToMapPoint(Convert.ToInt32(Request.Params.Get("maxx")),Convert.ToInt32(Request.Params.Get("maxy")));
        env.XMax 
    = pt.X;
        env.YMin 
    = pt.Y;
        pt 
    = webmap.ToMapPoint(Convert.ToInt32(Request.Params.Get("minx")),Convert.ToInt32(Request.Params.Get("miny")));
        env.XMin
    = pt.X;
        env.YMax 
    = pt.Y;    
        ESRI.ArcGIS.Geodatabase.ISpatialFilter filter 
    = ctx.CreateObject("esriGeodatabase.SpatialFilter"as ESRI.ArcGIS.Geodatabase.ISpatialFilter;
        webmap.ManageLifetime(filter);
        filter.SpatialRel 
    = ESRI.ArcGIS.Geodatabase.esriSpatialRelEnum.esriSpatialRelIntersects;
        filter.Geometry 
    = env as ESRI.ArcGIS.Geometry.IGeometry;
        filter.GeometryField 
    = flayer.FeatureClass.ShapeFieldName;
        ESRI.ArcGIS.Geodatabase.ISelectionSet sset 
    = flayer.FeatureClass.Select(filter,ESRI.ArcGIS.Geodatabase.esriSelectionType.esriSelectionTypeSnapshot,ESRI.ArcGIS.Geodatabase.esriSelectionOption.esriSelectionOptionNormal,ws);
       
        
    int t2=Environment.TickCount;
        
    int t3=t2-t1;    //t3是查询响应的时间,可以用来测试一下性能,呵呵    

        
    //显示选择集     
        int id;
        ESRI.ArcGIS.Geodatabase.IEnumIDs ids;
        ids 
    = sset.IDs;
        webmap.ManageLifetime(ids);
        ids.Reset();
        ESRI.ArcGIS.Geodatabase.IFIDSet fidset 
    = ctx.CreateObject("esriGeodatabase.FIDSet"as ESRI.ArcGIS.Geodatabase.IFIDSet;    
        id 
    = ids.Next(); 
        
    while (id>=0)
        
    {
         fidset.Add(id);
         id 
    =ids.Next();
        }

        IMapDescription desc 
    = webmap.MapDescription as IMapDescription;
        webmap.ManageLifetime(desc);
        ILayerDescription ldesc 
    = desc.LayerDescriptions.get_Element(flyid);
        webmap.ManageLifetime(ldesc);
        ldesc.SelectionFeatures 
    = fidset;

        
    //将选择信息保存在session中
        Session["selection"= sset;
        Session[
    "layerid"= flyid;

        webmap.Refresh();

        webmap.Dispose();
         
       }


      }



    5、删除选中的对象

      private void DeleteSel()
      
    {
       
    if (Session["layerid"]==nullreturn;
       
    if (Session["selection"== nullreturn;

       
    int layerid = (int)Session["layerid"];
       
    if (layerid == -1return;
       ESRI.ArcGIS.Geodatabase.ISelectionSet sset 
    = Session["selection"as ESRI.ArcGIS.Geodatabase.ISelectionSet;
       
    if (sset == nullreturn;

       WebMap webmap 
    = Map1.CreateWebMap();
       IFeatureLayer layer 
    = GetFeatureLayer(layerid);
       
    if (layer==nullreturn;
       webmap.ManageLifetime(layer);
       webmap.ManageLifetime(sset);
       ESRI.ArcGIS.Geodatabase.IEnumIDs ids 
    = sset.IDs;
       webmap.ManageLifetime(ids);
       ids.Reset();
       
    int id;
       id 
    = ids.Next();
       ESRI.ArcGIS.Geodatabase.IFeature feature;
       ESRI.ArcGIS.Server.IServerContext ctx 
    = webmap.ServerContext;
       webmap.ManageLifetime(ctx);
       
    //将selectionset转化为featurecursor对象
       ESRI.ArcGIS.Geodatabase.IFeatureCursor fcursor;
       ESRI.ArcGIS.Geodatabase.ICursor cursor;
       sset.Search(
    null,false,out cursor);
       fcursor 
    =  cursor as ESRI.ArcGIS.Geodatabase.IFeatureCursor;
       ESRI.ArcGIS.esriSystem.ISet pDeleteSet 
    = ctx.CreateObject("esriSystem.Set"as ESRI.ArcGIS.esriSystem.Set; 
       webmap.ManageLifetime(pDeleteSet);

       
    //设置ISet对象
       feature = fcursor.NextFeature();
       
    while (feature != null)
       
    {
        pDeleteSet.Add(feature);
        feature 
    = fcursor.NextFeature();
       }


       ESRI.ArcGIS.Geodatabase.IFeatureEdit fedit;
       pDeleteSet.Reset();
       fedit 
    = pDeleteSet.Next() as ESRI.ArcGIS.Geodatabase.IFeatureEdit;
       
    while (fedit != null)
       
    {
        fedit.DeleteSet(pDeleteSet);
        fedit 
    = pDeleteSet.Next() as ESRI.ArcGIS.Geodatabase.IFeatureEdit;
       }


       Session.Remove(
    "layerid");
       Session.Remove(
    "selection");

       webmap.Refresh();

       webmap.Dispose();
      }




     

  • 相关阅读:
    Oracle从入门到精通(笔记)
    MongoDB教程(笔记)
    深入浅出Oracle:DBA入门、进阶与诊断案例(读书笔记2)
    深入浅出Oracle:DBA入门、进阶与诊断案例(读书笔记1)
    获取本周、本季度、本月、上月的开始日期、结束日期
    TortoiseSVN新人使用指南
    Eclipse创建java web工程
    supersock问题
    UDP错误10054:远程主机强迫关闭了一个现有的连接
    【转】javascript深入理解js闭包
  • 原文地址:https://www.cnblogs.com/watsonyin/p/319424.html
Copyright © 2020-2023  润新知