C#+AE缓冲区分析

布满荆棘的人生 2023-08-17 16:04 252阅读 0赞

趁着这次总结的机会,就想着把这几个星期编的小功能都写成博客记录下来,省的之后遗忘,我写这些东西也算是给自己加深印象吧,鱼的记忆哈哈。

一、AE缓冲区接口和类

还是老生常谈,先来了解实现缓冲区功能都需要那些接口和类:
GP工具:也就是Geoprocessor类,这其中主要是封装了输入路径、输出路径还有就是可以调用各种工具的函数方法。它给我的感觉类似于原来我是一亩地一亩地的打农药,突然有一天来了一架飞机直接在天上散农药,一下子活就干完了。这GP工具就是那飞机,它大大的提高了效率。
Buffer类:这里注意了这是AnalysisTools下的Buffer类,我记得有两个buffer类,下图是Buffer类中的参数设置表。
在这里插入图片描述图有点不清晰,我就只能截一点相对重要的信息。
在这里插入图片描述

二、功能的实现

2.1功能实现代码

  1. private IActiveView pActiveView;
  2. private AxMapControl mapControl;
  3. //通过构造函数获取MapControl控件
  4. public BufferAnalysis(AxMapControl mainmapControl)
  5. : this()
  6. {
  7. mapControl = mainmapControl;
  8. pActiveView = mainmapControl.ActiveView;
  9. }
  10. //输出路径
  11. private void button1_OutputPath_Click(object sender, EventArgs e)
  12. {
  13. SaveFileDialog saveDlg = new SaveFileDialog();
  14. saveDlg.Filter = "Shapefile(*.shp)|*.shp";
  15. if (saveDlg.ShowDialog() != DialogResult.OK) return;
  16. textBox2_OutputPath.Text = saveDlg.FileName;
  17. }
  18. //生成窗体函数
  19. private void BufferAnalysis_Load(object sender, EventArgs e)
  20. {
  21. if (mapControl == null || pActiveView.FocusMap.LayerCount == 0)
  22. {
  23. return;
  24. }
  25. IEnumLayer layers = pActiveView.FocusMap.get_Layers();
  26. layers.Reset();
  27. ILayer layer = layers.Next();
  28. while (layer != null)
  29. {
  30. comboBox1_ChooseLayer.Items.Add(layer.Name);
  31. layer = layers.Next();
  32. }
  33. }
  34. //确认分析
  35. private void button2_OK_Click(object sender, EventArgs e)
  36. {
  37. double bufferDistance = Convert.ToDouble(textBox1_BufferDistance.Text.Trim());
  38. if (bufferDistance == 0.0)
  39. {
  40. MessageBox.Show("缓冲区距离有误!");
  41. return;
  42. }
  43. if (comboBox1_ChooseLayer.Text == string.Empty)
  44. {
  45. MessageBox.Show("输入图层不能为空!");
  46. return;
  47. }
  48. if (textBox2_OutputPath.Text == string.Empty)
  49. {
  50. MessageBox.Show("输出路径不能为空!");
  51. return;
  52. }
  53. int index = comboBox1_ChooseLayer.SelectedIndex;
  54. string name = getLayerPath(pActiveView.FocusMap.get_Layer(index));
  55. string outPath = textBox2_OutputPath.Text.Trim();
  56. Geoprocessor pGp = new Geoprocessor();
  57. pGp.OverwriteOutput = true; //允许运算结果覆盖现有文件,可无
  58. ESRI.ArcGIS.AnalysisTools.Buffer pBuffer = new ESRI.ArcGIS.AnalysisTools.Buffer();
  59. //获取缓冲区分析图层
  60. ILayer pLayer = pActiveView.FocusMap.get_Layer(index);
  61. IFeatureLayer featLayer = pLayer as IFeatureLayer;
  62. //IFeatureCursor cursor = featLayer.Search(null, false);
  63. //IFeature feaClass = cursor.NextFeature();
  64. pBuffer.in_features = featLayer;
  65. pBuffer.out_feature_class = outPath; //输出路径
  66. pBuffer.buffer_distance_or_field = bufferDistance; //缓冲区参数
  67. pBuffer.dissolve_option = "NONE"; //融合缓冲区重叠交叉部分,如果不融合填"ALL"
  68. pGp.Execute(pBuffer, null); //执行
  69. string pFolder = System.IO.Path.GetDirectoryName(outPath); //得到字符串中文件夹位置
  70. string pFileName = System.IO.Path.GetFileName(outPath); //得到字符串中文件名字
  71. mapControl.AddShapeFile(pFolder, pFileName); //往地图控件里添加文件
  72. mapControl.ActiveView.Refresh(); //激活窗口刷新
  73. this.Close();
  74. }
  75. //获取图层源路径
  76. private string getLayerPath(ILayer pLayer)
  77. {
  78. IDatasetName pDatasetName = (pLayer as IDataLayer2).DataSourceName as IDatasetName;
  79. IWorkspaceName pWorkspaceName = pDatasetName.WorkspaceName;
  80. return pWorkspaceName.PathName +"\\" +pLayer.Name+".shp";
  81. }

为了省事,我直接将代码整个复制过来了哈哈。

2.2功能实现效果

在这里插入图片描述在这里插入图片描述

三、过程总结

GP工具的出现大大的提升了编程的速度,但是这也使得我们变得“肤浅”,不过现在对我这种小白来讲现在的主要矛盾其实还是学习怎么使用GP工具,其他的日后再说吧哈哈。

发表评论

表情:
评论列表 (有 0 条评论,252人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C#+AE缓冲区分析

    趁着这次总结的机会,就想着把这几个星期编的小功能都写成博客记录下来,省的之后遗忘,我写这些东西也算是给自己加深印象吧,鱼的记忆哈哈。 一、AE缓冲区接口和类 还是老生常

    相关 缓冲区

    用户对流进行操作时,不是直接对设备进行数据读写交换的,而是有个中间区即缓冲区给数据缓冲。例如系统标准输出函数,在获取到用户输出数据时,系统会把数据暂时存放在缓冲,然后等待刷新缓

    相关 printf行缓冲区分析总结

    标准C库glibc的printf,   这里就要区分一下标准库函数和系统调用了。   系统调用是内核提供给上层程序的接口,能够实现内核和上层之间的交互,系统调用在内核中的实