AE邻近分析报告及渲染代码.docx
- 文档编号:10331878
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:40
- 大小:1.40MB
AE邻近分析报告及渲染代码.docx
《AE邻近分析报告及渲染代码.docx》由会员分享,可在线阅读,更多相关《AE邻近分析报告及渲染代码.docx(40页珍藏版)》请在冰点文库上搜索。
AE邻近分析报告及渲染代码
实验六:
基于最邻近模型的服务区分析
题目要求:
1)Form1主界面搭建:
2)Form2用于邻近分析和唯一值渲染的界面搭建:
*要注意的几点:
2.1首先将实验数据存放在系统工程文件夹>bin>Debug文件夹中,如图:
2.2后面需要添加一个EngineFunction.cs类:
结果如下:
2.3如果引用命名空间时出现了红波浪线,则需在解决方案资源管理器中添加引用,选择.NET环境下的以ESRI.ArcGIS开头的命名空间的引用,则代码中的红波浪则会消除,如图:
3)如果用于Visual2010+ArCGIS10.0所组成的ArcGISEngine中:
Program.cs中需添加一句话用于格式转换:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Windows.Forms;
namespace六
{
staticclassProgram
{
[STAThread]
staticvoidMain()
{
Application.EnableVisualStyles();
ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(newForm1());
}
}
}
4)Form1代码:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
usingESRI.ArcGIS.Controls;
usingESRI.ArcGIS.Carto;
usingESRI.ArcGIS.Geodatabase;
usingSystem.IO;
usingESRI.ArcGIS.Display;
usingESRI.ArcGIS.esriSystem;
usingESRI.ArcGIS.DataSourcesFile;
usingESRI.ArcGIS.Geometry;
namespace六
{
publicpartialclassForm1:
Form
{
publicForm1()
{
InitializeComponent();
}
privatevoidForm1_Load(objectsender,EventArgse)
{
}
privatevoid文件tToolStripMenuItem_Click(objectsender,EventArgse)
{
IWorkspaceFactorypWorkspaceFactory=newShapefileWorkspaceFactoryClass();
stringShpPath=Application.StartupPath+@"\服务区分析数据";
IWorkspacepWorkspace=pWorkspaceFactory.OpenFromFile(ShpPath,0);
IFeatureWorkspacepFeatureWorkspace=pWorkspaceasIFeatureWorkspace;
IFeatureClasspFeat1=pFeatureWorkspace.OpenFeatureClass("cubsoxaddr_prj.shp");
IFeatureLayerpFLayerPoint=newFeatureLayerClass();
pFLayerPoint.FeatureClass=pFeat1;
pFLayerPoint.Name=pFeat1.AliasName;
ILayerpLayerPoint=pFLayerPointasILayer;
IFeatureClasspFeat2=pFeatureWorkspace.OpenFeatureClass("chitrt_cent.shp");
IFeatureLayerpFLayerPeoplePoint=newFeatureLayerClass();
pFLayerPeoplePoint.FeatureClass=pFeat2;
pFLayerPeoplePoint.Name=pFeat2.AliasName;
ILayerpLayerPeoplePoint=pFLayerPeoplePointasILayer;
IFeatureClasspFCLine=pFeatureWorkspace.OpenFeatureClass("chitrt_polygon.shp");
IFeatureLayerpFLayerLine=newFeatureLayerClass();
pFLayerLine.FeatureClass=pFCLine;
pFLayerLine.Name=pFCLine.AliasName;
ILayerpLayerLine=pFLayerLineasILayer;
IMappMap=axMapControl1.Map;
pMap.AddLayer(pLayerLine);
pMap.AddLayer(pLayerPeoplePoint);
pMap.AddLayer(pLayerPoint);
axMapControl1.ActiveView.Refresh();
邻近分析ToolStripMenuItem.Enabled=true;
打开文件ToolStripMenuItem.Enabled=false;
}
privatevoid邻近分析_Click(objectsender,EventArgse)
{
IObjectCopyobjectCopy=newObjectCopyClass();
objecttoCopyMap=axMapControl1.Map;
objectcopiedMap=objectCopy.Copy(toCopyMap);
IMappMap=copiedMapasIMap;
Form2AccFrom=newForm2(pMap);
AccFrom.ShowDialog();
}
}
}
5)Form2代码:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
usingESRI.ArcGIS.Carto;
usingESRI.ArcGIS.Geodatabase;
usingESRI.ArcGIS.Display;
usingESRI.ArcGIS.Geometry;
usingSystem.Threading;
namespace六
{
publicpartialclassForm2:
Form
{
IMapMainMap=null;
IFeatureLayerServiceLayer=null;
IFeatureLayerResidualLayer=null;
IFeatureLayerResidulLayerPoint=null;
stringDmdFieldName=null;
publicForm2(IMapmainMap)
{
this.MainMap=mainMap;
ILayerpLayer=EngineFunction.GetLayerByName(MainMap,"chitrt_polygon");
IFeatureLayerpFeatureLayer=pLayerasIFeatureLayer;
EngineFunction.AddField(pFeatureLayer,"结果字段",esriFieldType.esriFieldTypeInteger);//添加一个字段"结果字段",用来保存计算结果
InitializeComponent();
for(inti=0;i { comboBox1.Items.Add(MainMap.get_Layer(i).Name); comboBox2.Items.Add(MainMap.get_Layer(i).Name); comboBox3.Items.Add(MainMap.get_Layer(i).Name); } comboBox1.SelectedIndex=0; comboBox2.SelectedIndex=1; comboBox3.SelectedIndex=2; comboBox4.SelectedIndex=12; } privatevoidForm2_Load(objectsender,EventArgse) { axMapControl1.Map=MainMap; button1.Enabled=false; } privatevoidcomboBox3_SelectedIndexChanged(objectsender,EventArgse) { comboBox4.Items.Clear(); ILayerpLayer=EngineFunction.GetLayerByName(MainMap,comboBox3.Text); IFeatureLayerpFeatureLayer=pLayerasIFeatureLayer; IFieldspFields=pFeatureLayer.FeatureClass.Fields; for(inti=0;i comboBox4.Items.Add(pFields.get_Field(i).Name); comboBox4.SelectedIndex=0; } publicstaticThreadCountThread=null; privatevoidbtn_Count_Click(objectsender,EventArgse) { label5.Visible=true; ServiceLayer=EngineFunction.GetLayerByName(MainMap,comboBox1.Text)asIFeatureLayer; ResidualLayer=EngineFunction.GetLayerByName(MainMap,comboBox3.Text)asIFeatureLayer; ResidulLayerPoint=EngineFunction.GetLayerByName(MainMap,comboBox2.Text)asIFeatureLayer; DmdFieldName=comboBox4.Text; btn_Count.Enabled=false; comboBox1.Enabled=false; comboBox2.Enabled=false; comboBox3.Enabled=false; comboBox4.Enabled=false; CountThread=newThread(newThreadStart(StartCount));//防止计算时,界面处于假死未响应状态,申请一个线程单独执行运算。 CountThread.Start(); } publicvoidStartCount() { JustContains(ServiceLayer,ResidualLayer,DmdFieldName,ResidulLayerPoint); } IWorkspaceEditpWorkspaceEdit; //ServiceLayer就是服务区图层,里面有两个点,分别代表两个队该图层文件名cubsoxaddr_prj //ResiduaLayer是居民区图层,因为最后要对它进行渲染,所有要把计算的结果保留到这个图层里,所以在这个图层里新建了一个字段,“计算结果”,也就是DmdFieldName变量该图层的文件名chitrt_polygon //ResidulLayerPoint在计算服务区与点之间的距离时,因为面和点的距离无法计算,所以就用面图层中,人口的矢量质心代替,每个面都对应一个点,这些点保存在ResidulLayerPoint图层中,该图层文件名chitrt_cent privatevoidJustContains(IFeatureLayerServiceLayer,IFeatureLayerResidualLayer,stringDmdFieldName,IFeatureLayerResidulLayerPoint) { IFeatureClasspResidulFeatureClass=ResidulLayerPoint.FeatureClass; intCountPoint=pResidulFeatureClass.FeatureCount(null); SetMaxNum(CountPoint); IQueryFilterpQueryFilter=newQueryFilterClass(); IFeatureCursorpResidulFeatCursor=pResidulFeatureClass.Search(null,false);//获取居民点图层中的所有要素,每个要素的FID和面图层的FID对应,由此关系来找到面图层中对应的要素 IFeaturepResidulFeature=pResidulFeatCursor.NextFeature();//读取第一个要素 intResidualFieldIndex=ResidualLayer.FeatureClass.Fields.FindField(DmdFieldName);//在居民要素图层中找到“结果字段对应的索引Index” IQueryFilterpQueryFilterServer=newQueryFilterClass(); pQueryFilterServer.WhereClause="FID=0"; IFeatureCubs=ServiceLayer.FeatureClass.Search(pQueryFilterServer,false).NextFeature();//获取小熊队的要素 pQueryFilterServer.WhereClause="FID=1"; IFeatureWhiteSox=ServiceLayer.FeatureClass.Search(pQueryFilterServer,false).NextFeature();//获取白袜队的要素 IPointCubsPoint=Cubs.ShapeasIPoint;//把小熊队要素转化为点 IPointWhiteSoxPoint=WhiteSox.ShapeasIPoint;//把白袜队要素转化为点 IDatasetpDataSet=ResidualLayer.FeatureClassasIDataset;//建立居民区图层的数据表 IWorkspacepWorkspace=pDataSet.Workspace;//获取数据表的工作空间 pWorkspaceEdit=pWorkspaceasIWorkspaceEdit;//建立工作空间编辑器 pWorkspaceEdit.StartEditing(false);//开始编辑 pWorkspaceEdit.StartEditOperation();//开启应用程序编辑操作 intiStep=1; while(pResidulFeature! =null)//循环遍历居民区点要素图层中的每一个要素 { intFID=ResidulLayerPoint.FeatureClass.Fields.FindField("FID");//获取要素的FID字段在表结构中的索引值 intFIDResult=Convert.ToInt32(pResidulFeature.get_Value(FID));//通过索引值获取对应要素的FID值 IQueryFilterpQueryFilterEdit=newQueryFilterClass(); pQueryFilterEdit.WhereClause="FID="+FIDResult;//通过居民区点要素图层中的FID找到居民区要素中相对应的要素 IFeatureCursorpEditCursor=ResidualLayer.FeatureClass.Search(pQueryFilterEdit,false);//获取该居民区要素集合 IFeatureEditFeature=pEditCursor.NextFeature();//因为只可能找到一个值,所以直接读取第一个要素就可以了 IPointpPoint=pResidulFeature.ShapeasIPoint;//居民区点图层要素转化为点符号 doubleDX1=MainMap.ComputeDistance(pPoint,CubsPoint);//计算该点符号与小熊队的距离 doubleDX2=MainMap.ComputeDistance(pPoint,WhiteSoxPoint);//计算该点符号与白袜队的距离 if(DX1 EditFeature.set_Value(ResidualFieldIndex,0);//把结果字段标记为0 else//如果与白袜队比较接近 EditFeature.set_Value(ResidualFieldIndex,1);//把结果字段标记为1 EditFeature.Store();//存储编辑 SetStepNum(iStep);//此处与实验无关,只是加载进度条显示而已 iStep++; pResidulFeature=pResidulFeatCursor.NextFeature();//继续读取下一个居民区点要素图层 } pWorkspaceEdit.StopEditOperation(); pWorkspaceEdit.StopEditing(true);//编辑完成 Application.DoEvents(); MessageBox.Show("计算完成! "); SetVisable(); } privatevoidbutton1_Click(objectsender,EventArgse) { //这里就是单一值渲染 IUniqueValueRendererpRender=newUniqueValueRendererClass(); pRender.FieldCount=1; pRender.set_Field(0,"结果字段"); pRender.set_FieldType(0,false); IRgbColorpRGB=newRgbColorClass(); pRGB.Red=0; pRGB.Green=255; pRGB.Blue=127; IFillSymbolpSymbol1=newSimpleFillSymbolClass(); pSymbol1.Outline.Width=0.4; pSymbol1.Color=pRGB; pRender.AddValue("0","小熊队",pSymbol1asISymbol); IRgbColorpRGB2=newRgbColorClass(); pRGB2.Red=255; pRGB2.Green=97; pRGB2.Blue=0; IFillSymbolpSymbol2=newSimpleFillSymbolClass(); pSymbol2.Outline.Width=0.4; pSymbol2.Color=pRGB2; pRender.AddValue("1","白袜队",pSymbol2asISymbol); ILayerppp=GetLayerByName(MainMap,"chitrt_polygon"); IGeoFeatureLayerpGeoFLayer=pppasIGeoFeatureLayer; pGeoFLayer.Renderer=pRenderasIFeatureRenderer; IActiveViewpView=axMapControl1.ActiveView; pView.ContentsChanged(); pView.PartialRefresh(esriViewDrawPhase.esriViewGeography,null,null); } publicstaticILayerGetLayerByName(IMappMap,StringlayerName) { ILayerlayer=null; for(inti=0;i { if(pM
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AE 邻近 分析 报告 渲染 代码