利用Arcengine的GP工具实现缓冲区分析功能

来源:互联网 发布:pps网络电视在线观看 编辑:程序博客网 时间:2024/06/03 23:04

在项目中经常会用到缓冲区分析这个功能,首先想用ENGINE的GP工具必须了解GIS里面的相应功能,在利用GIS做缓冲区时,会让操作者输入要建立缓冲区的图层和输出的路径,先知道这是必须的,其他的先不讨论,大概这这个样子,


首先在窗体上有一个Button按钮,点击事件,

 private void BufferButtonItem_ItemClick(object sender, ItemClickEventArgs e)
        {


            Frm3BufferAnalytics frmBuffer = new Frm3BufferAnalytics();
            frmBuffer.GetFpList = GetFeatureLayerList();
            frmBuffer.ShowDialog();
        }

出现如下窗体,


点击上面的“确定”按钮

 private void simpleButton1_Click(object sender, EventArgs e)
        {
            double bufferDistance;
            double.TryParse(txtBufferDistance.Text, out bufferDistance);
            if (0.0 == bufferDistance)
            {
                MessageBox.Show("缓冲距离不可为0!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
                return;
            }
            if (pFeatureLayers==null||pFeatureLayers.Count == 0)
            {
                MessageBox.Show("没有图层!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            IFeatureLayer layer = GetFeatureLayer((string)comboBoxEdit1.Text);
            if (layer == null) 
            {
                return;
            }
            Geoprocessor gp = new Geoprocessor();
         gp.OverwriteOutput = true;
            //create a new instance of a buffer tool
            ESRI.ArcGIS.AnalysisTools.Buffer buffer = new ESRI.ArcGIS.AnalysisTools.Buffer(layer, this.OutputPath, Convert.ToString(bufferDistance) + " " + (string)comboBoxEdit2.EditValue.ToString());
            //ESRI.ArcGIS.AnalysisTools.Buffer buffer = new ESRI.ArcGIS.AnalysisTools.Buffer(layer, this.OutputPath, "100"+" "+"Meters" );
            buffer.dissolve_option = "ALL";//这个要设成ALL,否则相交部分不会融合
          buffer.line_side = "FULL";//默认是"FULL",最好不要改否则出错
         buffer.line_end_type = "ROUND";//默认是"ROUND",最好不要改否则出错
            //execute the buffer tool (very easy :-))
            IGeoProcessorResult results = null;
            try
            {
                results = (IGeoProcessorResult)gp.Execute(buffer, null);
                MessageBox.Show("缓冲区建立成功!");
            }
            catch (Exception ex)
            {
                MessageBox.Show("缓冲区建立失败!");
               // txtMessages.Text += "Failed to buffer layer: " + layer.Name + "\r\n";
            }
        }

上个事件里面涉及的方法,这个是获得所选择的图层。

 private IFeatureLayer GetFeatureLayer(string selectedItem)
        {
            IFeatureLayer pFeatureLayer = null;
            foreach (IFeatureLayer item in pFeatureLayers)
            {
                if (item.Name == selectedItem)
                {
                    pFeatureLayer = item;
                    break;
                }
            }
            return pFeatureLayer; 
        }

这个方法是最上面主窗体上面的方法

 private List<IFeatureLayer> GetFeatureLayerList()
        {
            List<IFeatureLayer> plist = new List<IFeatureLayer>();
            GetLayerHelper pHelper = new GetLayerHelper();
            List<ILayer> pLayerList = pHelper.GetFeatureLayerList(this.MapCtl.ActiveView.FocusMap);
            foreach (ILayer item in pLayerList)
            {
                IFeatureLayer pFeatureLayer = item as IFeatureLayer;
                plist.Add(pFeatureLayer);
            }
            return plist;
        }

大家想要弄明白可以仔细的观察一下,

在这个窗体里面,定义入下的属性

 public partial class Frm3BufferAnalytics : Form
    {
        List<IFeatureLayer> pFeatureLayers = new List<IFeatureLayer>();
              public List<IFeatureLayer> GetFpList
        {
            set { this.pFeatureLayers = (List<IFeatureLayer>)value; }
            get { return this.pFeatureLayers ;}
        
        }

还有一个方法是获得地图上的图层对象,GetFeatureLayerList()

 public List<ILayer> GetFeatureLayerList(IMap pMap)
        {
            List<ILayer> myLayers = new List<ILayer>();
            UID layerFilter = new UIDClass();
            layerFilter.Value = "{40A9E885-5533-11d0-98BE-00805F7CED21}";
            IEnumLayer pEnumLayer = pMap.get_Layers(layerFilter, true);
                pEnumLayer.Reset();
                ILayer pLayer = pEnumLayer.Next();
                while (pLayer != null)
                {
                    myLayers.Add(pLayer);
                    pLayer = pEnumLayer.Next();
                }
                return myLayers ;
        }

以上就是整个Engine调用GP工具进行缓冲区分析的全部代码。

0 0