AE二次开发中几个功能速成归纳(符号设计器、创建要素、图形编辑、属性表编辑、缓冲区分析)

/*
 * 实习课上讲进阶功能所用文档,因为赶时间从网上抄抄改改,凑合能用,记录一下以备个人后用。
 *
 * -------------------------------------------------------------------
 *
 * 使用前提:已搭建好AE的GIS基本框架,包括TOC、mapcontrol、toolbar拖控件,mxd、shp文件载入显示,查看图层属性表等
 *
 * -------------------------------------------------------------------
 */
/* Form1中的using */

using System;

using System.Windows.Forms;

using ESRI.ArcGIS.Carto;

using ESRI.ArcGIS.Controls;

using ESRI.ArcGIS.Display;

using ESRI.ArcGIS.Geometry;

using ESRI.ArcGIS.Geodatabase;

using ESRI.ArcGIS.SystemUI;

using ESRI.ArcGIS.esriSystem;

using System.Drawing;

using System.Runtime.InteropServices;

using ESRI.ArcGIS.DataSourcesFile;

using System.Collections;

/*
 * 一、符号设计
 *
 * 在TOC的doubleclick事件中写入:
 */

esriTOCControlItem toccItem = esriTOCControlItem.esriTOCControlItemNone;

ILayer iLayer = null;

IBasicMap iBasicMap = null;

object unk = null;

object data = null;

axTOCControl1.HitTest( e.x, e.y, ref toccItem, ref iBasicMap, ref iLayer, ref unk, ref data ); /* 获取所点击图例及其图层 */

if ( e.button == 1 )

{
    if ( toccItem == esriTOCControlItem.esriTOCControlItemLegendClass )

    {
        ILegendClass pLC = new LegendClassClass();

        pLC = ( (ILegendGroup) unk).get_Class( (int) data ); /* 获取图例 */

        ISymbol pSym = pLC.Symbol; /* 获取图例的符号 */

        ESRI.ArcGIS.DisplayUI.ISymbolSelector pSS = new ESRI.ArcGIS.DisplayUI.SymbolSelectorClass(); /* 创建符号选择器 */

        bool a = false;

        pSS.AddSymbol( pSym );

        a = pSS.SelectSymbol( 0 ); /* 打开符号选择器 */

        if ( a )

        {
            pLC.Symbol = pSS.GetSymbolAt( 0 );
        }

        this.axMapControl1.ActiveView.Refresh();

        this.axTOCControl1.Refresh();
    }
}

/*
 * 二、创建要素
 *
 * 1.创建并添加shp新图层
 */

/* 点shp的创建并添加 */

private void 点ToolStripMenuItem_Click( object sender, EventArgs e )

{
    string pointshppath = "";

    SaveFileDialog spointdlg = new SaveFileDialog(); /* 打开保存文件对话框,设置保存路径和shp文件名 */

    if ( spointdlg.ShowDialog() == DialogResult.OK )

    {
        pointshppath = spointdlg.FileName;
    }else {
        return;
    }

/* 准备好要素类空对象 */

    IFeatureClass m_pointfeatureclass = null;

/* 从文件路径中分解出文件夹路径和文件名称 */

    int count = pointshppath.LastIndexOf ("\");

string folder = pointshppath.Substring(0, count);

string name = pointshppath.Substring(count + 1, pointshppath.Length - count - 1);

//根据文件夹路径创建工作空间工厂和工作空间

IWorkspace ipws;

IWorkspaceFactory ipwsf = new ShapefileWorkspaceFactoryClass();

ipws = ipwsf.OpenFromFile(folder, 0);

//转为要素工作空间

IFeatureWorkspace ifeatws;

ifeatws = ipws as IFeatureWorkspace;

//对shp文件的一些必要设置,除了红字部分外都不用改

IFields pFields = new FieldsClass();

IField pField = new FieldClass();

IFieldsEdit pFieldsEdit = pFields as IFieldsEdit;

IFieldEdit pFieldEdit = pField as IFieldEdit;

IGeometryDef ipGeodef = new GeometryDefClass();

IGeometryDefEdit ipGeodefEdit = ipGeodef as IGeometryDefEdit;

ISpatialReference ipSpatialRef;

IUnknownCoordinateSystem iunknowncoord = new UnknownCoordinateSystemClass();

ipSpatialRef = iunknowncoord;

ipGeodefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint;//确定你要生成的shp的几何类型(点线面)

ipSpatialRef.SetMDomain(-10000, 10000);

ipGeodefEdit.HasM_2 = false;

ipGeodefEdit.HasZ_2 = false;

ipGeodefEdit.SpatialReference_2 = ipSpatialRef;

pFieldEdit.Name_2 = "Shape ";

pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;

pFieldEdit.GeometryDef_2 = ipGeodef;

pFieldsEdit.AddField(pField);

//////////////////////////////////////////

//创建要素类并导出shp文件于预设文件路径

m_pointfeatureclass = ifeatws.CreateFeatureClass(name, pFields, null, null, esriFeatureType.esriFTSimple, "Shape ", " ");

//加载新创建的shp文件并调到图层显示顺序的最顶层

axMapControl1.AddShapeFile(folder,name);

axMapControl1.MoveLayerTo(0, axMapControl1.LayerCount - 1);

return;

}

//线shp的创建并添加

private void 线ToolStripMenuItem_Click(object sender, EventArgs e)

{

string lineshppath = " ";

SaveFileDialog slinedlg = new SaveFileDialog();//打开保存文件对话框,设置保存路径和shp文件名

if (slinedlg.ShowDialog() == DialogResult.OK)

{

lineshppath = slinedlg.FileName;

}

else

{

return;

}

//准备好要素类空对象

IFeatureClass m_linefeatureclass = null;

//从文件路径中分解出文件夹路径和文件名称

int count = lineshppath.LastIndexOf(" \ ");

string folder = lineshppath.Substring(0, count);

string name = lineshppath.Substring(count + 1, lineshppath.Length - count - 1);

//根据文件夹路径创建工作空间工厂和工作空间

IWorkspace ipws;

IWorkspaceFactory ipwsf = new ShapefileWorkspaceFactoryClass();

ipws = ipwsf.OpenFromFile(folder, 0);

//转为要素工作空间

IFeatureWorkspace ifeatws;

ifeatws = ipws as IFeatureWorkspace;

//对shp文件的一些必要设置,除了红字部分外都不用改

IFields pFields = new FieldsClass();

IField pField = new FieldClass();

IFieldsEdit pFieldsEdit = pFields as IFieldsEdit;

IFieldEdit pFieldEdit = pField as IFieldEdit;

IGeometryDef ipGeodef = new GeometryDefClass();

IGeometryDefEdit ipGeodefEdit = ipGeodef as IGeometryDefEdit;

ISpatialReference ipSpatialRef;

IUnknownCoordinateSystem iunknowncoord = new UnknownCoordinateSystemClass();

ipSpatialRef = iunknowncoord;

ipGeodefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolyline;//确定你要生成的shp的几何类型(点线面)

ipSpatialRef.SetMDomain(-10000, 10000);

ipGeodefEdit.HasM_2 = false;

ipGeodefEdit.HasZ_2 = false;

ipGeodefEdit.SpatialReference_2 = ipSpatialRef;

pFieldEdit.Name_2 = "Shape ";

pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;

pFieldEdit.GeometryDef_2 = ipGeodef;

pFieldsEdit.AddField(pField);

//////////////////////////////////////////

//创建要素类并导出shp文件于预设文件路径

m_linefeatureclass = ifeatws.CreateFeatureClass(name, pFields, null, null, esriFeatureType.esriFTSimple, "Shape ", " ");

//加载新创建的shp文件并调到图层显示顺序的最顶层

axMapControl1.AddShapeFile(folder,name);

axMapControl1.MoveLayerTo(0, axMapControl1.LayerCount - 1);

return;

}

//面shp的创建并添加

private void 面ToolStripMenuItem_Click(object sender, EventArgs e)

{

string polygonshppath = " ";

SaveFileDialog spolygondlg = new SaveFileDialog();//打开保存文件对话框,设置保存路径和shp文件名

if (spolygondlg.ShowDialog() == DialogResult.OK)

{

polygonshppath = spolygondlg.FileName;

}

else

{

return;

}

//准备好要素类空对象

IFeatureClass m_polygonfeatureclass = null;

//从文件路径中分解出文件夹路径和文件名称

int count = polygonshppath.LastIndexOf(" \ ");

string folder = polygonshppath.Substring(0, count);

string name = polygonshppath.Substring(count + 1, polygonshppath.Length - count - 1);

//根据文件夹路径创建工作空间工厂和工作空间

IWorkspace ipws;

IWorkspaceFactory ipwsf = new ShapefileWorkspaceFactoryClass();

ipws = ipwsf.OpenFromFile(folder, 0);

//转为要素工作空间

IFeatureWorkspace ifeatws;

ifeatws = ipws as IFeatureWorkspace;

//对shp文件的一些必要设置,除了红字部分外都不用改

IFields pFields = new FieldsClass();

IField pField = new FieldClass();

IFieldsEdit pFieldsEdit = pFields as IFieldsEdit;

IFieldEdit pFieldEdit = pField as IFieldEdit;

IGeometryDef ipGeodef = new GeometryDefClass();

IGeometryDefEdit ipGeodefEdit = ipGeodef as IGeometryDefEdit;

ISpatialReference ipSpatialRef;

IUnknownCoordinateSystem iunknowncoord = new UnknownCoordinateSystemClass();

ipSpatialRef = iunknowncoord;

ipGeodefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolygon;//确定你要生成的shp的几何类型(点线面)

ipSpatialRef.SetMDomain(-10000, 10000);

ipGeodefEdit.HasM_2 = false;

ipGeodefEdit.HasZ_2 = false;

ipGeodefEdit.SpatialReference_2 = ipSpatialRef;

pFieldEdit.Name_2 = "Shape ";

pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;

pFieldEdit.GeometryDef_2 = ipGeodef;

pFieldsEdit.AddField(pField);

//////////////////////////////////////////

//创建要素类并导出shp文件于预设文件路径

m_polygonfeatureclass = ifeatws.CreateFeatureClass(name, pFields, null, null, esriFeatureType.esriFTSimple, "Shape ", " ");

//加载新创建的shp文件并调到图层显示顺序的最顶层

axMapControl1.AddShapeFile(folder,name);

axMapControl1.MoveLayerTo(0, axMapControl1.LayerCount - 1);

return;

}

/*
2.在shp中绘制点线面要素并储存

课上只提到调用Toolbar里的工具:

使用流程:

开始编辑——>选择目标图层——>开启草图工具——>绘制新图形——>保存并停止编辑

而写代码方式的主要思路如下(没做撤销和双缓冲):
*/
//获取MapControl中的全部图层名称,并加入ComboBox

 //图层

 toolStripComboBox1.Visible = true;

 ILayer pLayer;

 //图层名称

 string strLayerName;

 for (int i = 0; i < this.axMapControl1.LayerCount; i++)

            {

                pLayer = this.axMapControl1.get_Layer(i);

                strLayerName = pLayer.Name;

                //图层名称加入ComboBox

                this.toolStripComboBox1.Items.Add(strLayerName);

            }

            //默认显示第一个选项

            this.toolStripComboBox1.SelectedIndex = 0;

//用三个int成员变量drawpoint、drawline、drawregion指示添加的是点、线还是面

//用三个IFeatureClass成员变量startpointshp、startlineshp、startpolygonshp来取出所选图层的要素类

//用一个点集数列IPointArray pts存储画线、面时连续产生的节点

//当combobox中选项变化时判断所选图层的要素类的几何类型并取出

IFeatureLayer layer = axMapControl1.get_Layer(this.toolStripComboBox1.SelectedIndex) as IFeatureLayer;

            if (layer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPoint)

            {

                startpointshp = layer.FeatureClass;

                drawpoint = 1;

                drawline = 0;

                drawregion = 0;

            }

            if (layer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolyline)

            {

                startlineshp = layer.FeatureClass;

                drawpoint = 0;

                drawline = 1;

                drawregion = 0;

            }

            if (layer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolygon)

            {

                startpolygonshp = layer.FeatureClass;

                drawpoint = 0;

                drawline = 0;

                drawregion = 1;

            }
//在onmousedown(onmouseup也行)中进行判断并创建新要素图形
if (e.button == 2 &&drawline ==0 &&drawpoint==0 && drawregion==0)

            {

                m_menuMap.PopupMenu(e.x, e.y, m_mapControl.hWnd);//没开启添加要素功能,则正常弹菜单项

            }

            if (e.button == 1 && drawpoint == 1)

            {

IPoint pt;

                pt = axMapControl1.ToMapPoint(e.x, e.y);

                IFeature pFeature = startpointshp.CreateFeature();

                pFeature.Shape = pt;

                pFeature.Store();

                this.axMapControl1.ActiveView.Refresh();

                return;

            }

            if (e.button == 1 && drawline == 1)//左键创建线的节点

            {

                IPoint pt;

                pt = axMapControl1.ToMapPoint(e.x, e.y);

                pts.Add(pt);

                return;

            }

            if (e.button == 2 && drawline == 1)//右键根据节点创建线

            {

                ESRI.ArcGIS.Geometry.IPolyline ipPolyline = new PolylineClass();

                ESRI.ArcGIS.Geometry.IPointCollection ipPointCol = (IPointCollection)ipPolyline;

                object missing = Type.Missing;

                for (int i = 0; i < pts.Count; i++)

                {

                    object t = pts.get_Element(i);

                    ESRI.ArcGIS.Geometry.Point p = (ESRI.ArcGIS.Geometry.Point)t;

                    if (p != null)

                    {

                        ipPointCol.AddPoint(p, ref missing, ref missing);

                    }

                }

                IPolyline polyline = ipPolyline;

                IFeature pFeature = startlineshp.CreateFeature();

                pFeature.Shape = polyline;

                pFeature.Store();

                this.axMapControl1.ActiveView.Refresh();

                pts.RemoveAll();

                return;

            }

            if (e.button == 1 && drawregion == 1)//左键创建面的节点

            {

                IPoint pt;

                pt = axMapControl1.ToMapPoint(e.x, e.y);

                pts.Add(pt);

                return;

            }

            if (e.button == 2 && drawregion == 1)//右键根据节点创建面

            {

                ESRI.ArcGIS.Geometry.IPolygon ipPolyGon = new PolygonClass();

                ESRI.ArcGIS.Geometry.IPointCollection ipPointCol = (IPointCollection)ipPolyGon;

                object missing = Type.Missing;

                for (int i = 0; i < pts.Count; i++)

                {

                    object t = pts.get_Element(i);

                    ESRI.ArcGIS.Geometry.Point p = (ESRI.ArcGIS.Geometry.Point)t;

                    if (p != null)

                    {

                        ipPointCol.AddPoint(p, ref missing, ref missing);

                    }

                }

                ipPointCol.AddPoint(pts.get_Element(0), ref missing, ref missing);//面的坐标串首尾坐标应一致(如P1-P2-P3-P4-P1)

                IPolygon polygon = ipPolyGon;

                IFeature pFeature = startpolygonshp.CreateFeature();

                pFeature.Shape = polygon;

                pFeature.Store();

                this.axMapControl1.ActiveView.Refresh();

                pts.RemoveAll();

                return;

            }

//结束创建时执行清理、重置

   drawpoint = 0;

            drawline = 0;

            drawregion = 0;

            pts.RemoveAll();

            startpointshp = null;

            startlineshp = null;

            startpolygonshp = null;

            this.toolStripComboBox1.Visible = false;

            this.toolStripComboBox1.Items.Clear();

 /*

3.shp中点线面要素的图形编辑

使用Toolbar

使用流程:

开始编辑——>选择目标图层——>开启编辑工具——>图形编辑——>保存并停止编辑

三、属性表编辑

1.在属性表窗体设计中加一个按钮用于更新数据

2.属性表类中至少应有如下成员对象,在表开启后这些值应都已经赋值或初始化
  * */

public DataTable attributeTable;//你的表

string tableName;//你的表的名字

public List array = new List();//你用来记录哪些行的数据被改变了的数列

public ILayer currentlayer;//你用来获取当前图层的对象其中,比如,attributeTable和tableName可在Load函数中赋值,currentlayer可在构造函数中赋值

/*
3.添加如下函数
 */

//在按钮的点击事件中添加如下代码

private void button1_Click(object sender, EventArgs e)

{

if (array.Count < 1)//没有记录到任何数据可能改变的行

{

MessageBox.Show(" 未 修改任何数据 ! ");

return;

}

array.Sort();

ILayer player = this.currentlayer;

UpdateFTOnDV(player, attributeTable, array.ToArray());

dataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically;//dataGridView1是你属性表中显示数据的视图

dataGridView1.Refresh();

}

//在表的CellValueChanged事件中添加如下代码

private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)

{

array.Add(e.RowIndex);//将有值改变的那个行的行号记录下来

}

//在属性表类中添加如下函数

public void UpdateFTOnDV(ILayer player, DataTable pdatatable, int[] array)

{

IFeatureLayer pFTClass = player as IFeatureLayer;

ITable pTable = pFTClass as ITable;

IRow pRow;

ICursor pCursor = pTable.GetRows(array, false);

for (int i = 0; i < array.Length; i++)

{

pRow = pCursor.NextRow();

int k = array[i];

for (int j = 2; j < pdatatable.Columns.Count; j++)

{

object pgridview = pdatatable.Rows[k][j];

object prow = pRow.get_Value(j);

if (prow.ToString() != pgridview.ToString())//当表格中值与shp文件属性表中值不同时发生替换

{

if (pgridview == System.DBNull.Value)

{

string skipinfo = "第 " + (k+1).ToString() + "行第 " + (j+1).ToString() + " 列 的数据 可 为 空 自动跳过修改 ";

MessageBox.Show(skipinfo);

continue;

}

pRow.set_Value(j, pgridview);

pRow.Store();

}

}

}

MessageBox.Show("数据保存 成 功 ! ");

}

/*
四、空间分析

以缓冲区分析为例,实现对某类地物周边一定范围内其他地物的统计与显示。
 */

//buffer类中的using

using System;

using System.Windows.Forms;

using ESRI.ArcGIS.Carto;

using ESRI.ArcGIS.Controls;

using ESRI.ArcGIS.Geoprocessing;

using ESRI.ArcGIS.Geoprocessor;

using ESRI.ArcGIS.Geodatabase;

using ESRI.ArcGIS.AnalysisTools;

using System.Collections;
/*

1.创建一个windows窗体类buffer.cs

2.对窗体进行设计

目标地物(上面的)下拉框的Name设为comboBox2

被统计地物(下面的)下拉框Name设为comboBox3

分析距离textBox的Name设为textBox1

按钮Name设为button1

3.添加相关代码
*/
//1>Buffer类中添加三个成员

private static int counter = 1;//用来对生成图层的计数

private AxMapControl axMapControl1;//用来获取主框架传进来的AxMapControl

private ArrayList flyr = new ArrayList();//用来存储生成的图层,便于结束分析后删除

//2>修改构造函数为

public buffer(AxMapControl mapControl)

{

InitializeComponent();

this.axMapControl1 = mapControl;

}

//3>在窗体设计布局中,双击Buffer的对话框,进入buffer_Load函数,添加以下代码

//MapControl中没有图层时返回

if (axMapControl1.LayerCount <= 0)

return;

ILayer pLayer;//图层

string strLayerName;//图层名称

//获取MapControl中的全部图层名称,并加入ComboBox

for (int i = 0; i < axMapControl1.LayerCount; i++)

{

pLayer = axMapControl1.get_Layer(i);

strLayerName = pLayer.Name;

comboBox2.Items.Add(strLayerName);

comboBox3.Items.Add(strLayerName);

}

//默认显示第一个选项

comboBox2.SelectedIndex = 0;

comboBox3.SelectedIndex = 0;

//3>在窗体设计布局中,双击按钮,进入click事件,添加以下代码

//获取所设置的缓冲区距离

string distance = this.textBox1.Text.ToString();

//给距离加上单位,默认为米

string para = distance + " Meters ";

//根据所选图层确定其数据源位置,即shp文件所在的文件夹路径

IDataLayer combo2 = (IDataLayer)axMapControl1.get_Layer(comboBox2.SelectedIndex);

IWorkspaceName ws = ((IDatasetName)(combo2.DataSourceName)).WorkspaceName;

string featurefolder = ws.PathName;

//使用gp处理工具

Geoprocessor gp = new Geoprocessor();

//允许覆盖同名文件

gp.OverwriteOutput = true;

//调用缓冲区工具

ESRI.ArcGIS.AnalysisTools.Buffer buffertool = new ESRI.ArcGIS.AnalysisTools.Buffer();

//设置输入图层路径和输出图层路径

buffertool.in_features = featurefolder+ " \ " + comboBox2.SelectedItem + ".shp ";

buffertool.out_feature_class = featurefolder + " \ " + comboBox2.SelectedItem + "_buffer " + counter.ToString() + ".shp ";

//设置缓冲区相关参数

buffertool.buffer_distance_or_field = para;

buffertool.dissolve_option = "ALL ";

//执行

try

{ gp.Execute(buffertool, null); }

catch (Exception ex)

{

MessageBox.Show("ERROR ");

return;

}

//对生成图层的计数

counter++;

//用生成的缓冲区与被统计地物进行叠置分析求交集

Intersect pIntersect = new Intersect();

int chooselayer = counter - 1;

Geoprocessor gp2 = new Geoprocessor();

gp2.OverwriteOutput = true;    //允许覆盖同名文件

FeatureLayer pFeatureLayer = new FeatureLayerClass();

//设置相关参数

object obj = gp2.GetEnvironmentValue("Extent ");

gp2.SetEnvironmentValue("Extent ", "MAXOF ");

obj = gp2.GetEnvironmentValue("OutputZFlag ");

gp2.SetEnvironmentValue("OutputZFlag ", "DEFAULT ");

obj = gp2.GetEnvironmentValue("OutputMFlag ");

gp2.SetEnvironmentValue("OutputMFlag ", "DEFAULT ");

obj = gp2.GetEnvironmentValue("QualifiedFieldNames ");

gp2.SetEnvironmentValue("QualifiedFieldNames ", "QUALIFIED ");

//把要求交的两个要素放到一个IGpValueTableObject中作为参数

IGpValueTableObject pObject = new GpValueTableObjectClass();

pObject.SetColumns(2);

object inputfeature = featurefolder + " \ " + comboBox3.SelectedItem + ".shp ";

pObject.AddRow(ref inputfeature);

object inputfeature2 = featurefolder + " \ " + comboBox2.SelectedItem + "_buffer " + chooselayer.ToString() + ".shp ";

pObject.AddRow(ref inputfeature2);

//设置输入图层路径和输出图层路径

pIntersect.in_features = pObject;

pIntersect.out_feature_class = featurefolder + " \ " + comboBox2.SelectedItem + "_insert " + chooselayer.ToString() + ".shp ";

pIntersect.join_attributes = "All ";

//执行

IGeoProcessorResult pResult = (IGeoProcessorResult)gp2.Execute(pIntersect, null);

//从求交的结果中提取Feature并做相关统计

IGPUtilities pGPUtil = new GPUtilitiesClass();

IFeatureClass pFC;

IQueryFilter pQF;

pGPUtil.DecodeFeatureLayer(pResult.GetOutput(0), out pFC, out pQF);

int count = pFC.FeatureCount(null);

IFeatureCursor pCursor = pFC.Insert(true);

pFeatureLayer.FeatureClass = pFC;

//将缓冲区载入地图中显示

axMapControl1.AddShapeFile(featurefolder + " \ ", comboBox2.SelectedItem + "_buffer " + chooselayer.ToString() + ".shp ");

axMapControl1.MoveLayerTo(0, axMapControl1.LayerCount - 1);

//获取生成的缓冲区对象

FeatureLayer bufferlayer = axMapControl1.get_Layer(axMapControl1.LayerCount - 1) as FeatureLayer;

//将求交得到的对象载入地图中显示

pFeatureLayer.Name = comboBox2.SelectedItem + " 周边 " + textBox1.Text + "米内的 " + comboBox3.SelectedItem;

axMapControl1.Map.AddLayer(pFeatureLayer);

//将生成的缓冲区和求交对象放到一个图层数组中,在关闭缓冲区分析工具后统一移出系统

flyr.Add(bufferlayer);

flyr.Add(pFeatureLayer);

//将缓冲区分析的结果放到属性表中并显示

ILayer layer = pFeatureLayer as ILayer;

FrmAttribute attributeTable = new FrmAttribute(layer, axMapControl1);

attributeTable.Show();

//4>在窗体的FormClosing事件中,添加以下代码

//删除所有生成的缓冲区和求交对象

foreach (FeatureLayer pFeatureLayer in flyr)

{

IDataLayer2 OnOff = pFeatureLayer as IDataLayer2;

OnOff.Disconnect();

axMapControl1.Map.DeleteLayer(pFeatureLayer);

}
/*
4.在主窗体中调用此模块

首先在菜单栏中新建一个选项如“周边设施分析”

之后双击该选项,添加如下代码
*/
buffer b = new buffer(axMapControl1);

b.Show();
/*
五、esriAddIn扩展项在ArcEngine中的添加

对原代码中接口适当修改,使其可用于ArcEngine二次开发工程中

1.在服务中引用“AE开发用”文件夹中的MappingTools.dll

2.菜单栏中创建对应菜单,在单击事件中加入调用代码,并在Form1类的顶端填写using MappingTools;
*/

//调用创建直方图时,是在mapcontrol1的onmousedown事件中触发创建直方图的函数

//首先到onmousedown中加入如下代码

if (zhifangtu == 1 && e.button==1)//开启了直方图功能且在地图上单击了鼠标左键时

{

Createzft (e.x,e.y);

}

//之后在Form1主类中加入如下函数

Public void Createzft(int x,int y)

{

MappingTools.CreateGraph a = new MappingTools.CreateGraph();

frmGraph frm = new frmGraph(this.axMapControl1);

frm.BasePoint = axMapControl1.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);

DialogResult re = frm.ShowDialog();

}
时间: 2024-10-11 12:17:29

AE二次开发中几个功能速成归纳(符号设计器、创建要素、图形编辑、属性表编辑、缓冲区分析)的相关文章

EBS OAF开发中如何实现功能页签(Global Tab)

(版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处:否则请与本人联系,违者必究) 功能页签的实现不需要任何编码,和subTab不一样,可以和subTab共存.其主要实现是靠配置,步骤如下: 1.      建立两个OAF页面的Function. 2.      为每个function分别建立一个HTML Tab 类型的菜单,并把相应的Function加入到菜单中,但不要声明Prompt,如下: 3.      建立一个Home Page类型的菜单,并把上面建立的两个HTM

网页开发中你不知道的一些功能

在网页开发中我们可能为完成一些特效感到苦恼,特别是JS不好的孩子们,下面整理的一些方法能使你起到事倍功半的效果. 进入网页时淡入淡出的效果 1 <meta http-equiv="Page-Exit"; content="blendTrans(Duration=1.0)"> 在头部head之间加入此代码,你会发现点击链接的时候,网页现实的是淡入淡出的效果.此代码含义如下:Page-Exit”(离开网页).”Site- Enter”(进入站点).”Site

php开发中Excel导入功能的具体实现方法

对于在做php开发项目中,一般的项目设计到最多用到的是Excel的导出功能,而对于其导入功能一般是很少见的,而且对于php开发中Excel的导入功能也要比导出功能开发起来更困难一些,那么今天就来分享一下php开发中Excel导入功能的具体实现步骤: 1.首先将下载下来的PHP Excel插件代码放入项目/Thinkphp/Extend/Vendor/下; 2.在模板添加导入功能; html代码实现如下:<form action="{:U('Turntable/imports')}"

CAD二次开发中浮动面板不浮动的问题

CAD二次开发中创建了一个浮动面板,想让它创建出来后以浮动状态显示, 但是DockSides.None设置完后,面板还是不浮动.搞了很久,最后原来是 需要先设置Visible,再设置DockSides,这样就好了. ps = new PaletteSet("PSCollectPart"); ps.Style = PaletteSetStyles.NameEditable | PaletteSetStyles.ShowPropertiesMenu | PaletteSetStyles.S

ActiveReports 9 新功能:可视化查询设计器(VQD)介绍

原文:ActiveReports 9 新功能:可视化查询设计器(VQD)介绍 在最新发布的ActiveReports 9报表控件中添加了多项新功能,以帮助你在更短的时间里创建外观绚丽.功能强大的报表系统,本文将重点介绍可视化数据查询设计器,无需手动编写任何SQL语句,主要内容如下: (一)访问可视化查询设计器 (二)可视化查询设计器包含的元素 可视化查询设计器提供的图形界面使用交互的创建查询和预览结果的方法帮助用户更简单的绑定数据.使用可视化查询设计交互界面,帮助不熟悉SQL的用户更容易的设计,

C#基础系列:开发自己的窗体设计器(PropertyGrid显示中文属性名)

既然是一个窗体设计器,那就应该能够设置控件的属性,设置属性最好的当然是PropertyGrid了,我们仅仅需要使用一个PropertyGrid.SelectedObject = Control就可以搞定,让PropertyGrid显示Control的所有属性.可是这里显示的属性名是英文的.对于我们开发人员来说这无可厚非,我们也乐于接受.并且让PropertyGrid显示中文属性名,这对于我们开发人员的使用来说显得多此一举.可是,对于我这种类型的一个应用工具,英文属性名对于很多客户来说可能就很难懂

个别二次开发电脑无法保存功能里面代码的解决方法

度量快速开发-平台在二次开发过程中,有极个别电脑上的开发客户端在二次开发的时候,书写的功能和事件中的代码,保存显示成功了的,但是重新打开后又没有. 排查方法:1.请检查客户端下面的autoupdate.exe,查看是否客户端是最新的,有没有升级文件未更新.2.如果是很久之前的客户端,中途升级多次后,突然出现,请检查客户端里面是否有升级异常的temp文件,有则删除.3.重新启动客户端,使用测试.4.客户端打开的时候,请使用管理员权限打开.5.卸载客户端,重新下载新客户端使用.6.检查电脑是否中毒,

多人语音直播系统开发中聊天室功能实现方案?

"直播+"不仅是视频.直播平台的尝试方向,也成为众多音乐平台的创新业务,而语音直播正是其中一种尝试.语音直播的用户更偏向年轻化,多为追求新鲜感的90后群体,他们有自己的行为处事方式,喜欢把孤独和无聊的时间用声音的方式宣泄.对于喜爱声音的这类群体来说,语音直播系统开发既保护了他们的隐私又让他们倍感亲切.那么从技术层面讲,多人语音直播系统开发中聊天室的功能实现需要特别注意哪些呢?一.语音直播系统开发的优势是什么?想必有人会问语音直播和传统的电台有什么不同呢?语音直播也有着自己的优势主要有以

深入理解iOS开发中的BitCode功能

前言 做iOS开发的朋友们都知道,目前最新的Xcode7,新建项目默认就打开了bitcode设置.而且大部分开发者都被这个突如其来的bitcode功能给坑过导致项目编译失败,而这些因为bitcode而编译失败的的项目都有一个共同点,就是链接了第三方二进制的库或者框架,而这些框架或者库恰好没有包含bitcode的东西(暂且称为东西),从而导致项目编译不成功.所以每当遇到这个情况时候大部分人都是直接设置Xcode关闭bitcode功能,全部不生成bitcode.也不去深究这一开关背后隐藏的原理.中枪