ArcgisEngine开发总结集锦.docx
《ArcgisEngine开发总结集锦.docx》由会员分享,可在线阅读,更多相关《ArcgisEngine开发总结集锦.docx(103页珍藏版)》请在冰豆网上搜索。
ArcgisEngine开发总结集锦
1.目录
2.用ArcEngine的工具条添加图层要素
发现AE比起其它的组件GIS来要好用的多
但也有一些bt的地方
比如说AE没有提供图层编辑的工具条
但最近因为程序里要添加图元
必须得开发图层编辑的功能
于是去找了找资料
发现自带的帮助里有一个MapEditing的示例
但是从AO的示例改造而来
需要从按钮写起
想想如果这样搞的话
倒不如直接用AO算了
一直想省点事
在AE自带的工具条上做点文章
其实AE中也有一组相似的编辑按钮,是用于编辑Graphics的
自然就有了一个想法:
能不能先生成一个Graphic,然后将其加载进来
代码分享
privatevoidForm1_Load(objectsender,System.EventArgse)
{
//清空图层
this.axMapControl1.Map.ClearLayers();
//加载服务器SDE地图信息
ESRI.ArcGIS.esriSystem.IpropertySetProset=newESRI.ArcGIS.esriSystem.PropertySetClass();
//属性集
ESRI.ArcGIS.Geodatabase.IWorkspaceFactoryFact;//工作空间仓库
ESRI.ArcGIS.Geodatabase.IWorkspaceWorkspace;//工作空间
Proset.SetProperty("Server","服务器名");//服务器名
Proset.SetProperty("Instance","端口");//实例化端口
Proset.SetProperty("user","用户名");//SDE用户名
Proset.SetProperty("password","密码");//密码
Proset.SetProperty("version","sde.DEFAULT");//连接版本
Fact=newESRI.ArcGIS.DataSourcesGDB.SdeWorkspaceFactoryClass();//实例化为SDE工作空间仓库
Workspace=Fact.Open(Proset,Int32.Parse(this.Handle.ToString()));//填入属性集
ESRI.ArcGIS.Geodatabase.IFeatureWorkspaceFeatureWorkspace;
FeatureWorkspace=WorkspaceasESRI.ArcGIS.Geodatabase.IFeatureWorkspace;//传递给Feature工作空间
ESRI.ArcGIS.Geodatabase.IFeatureClassFeatureClass;
FeatureClass=FeatureWorkspace.OpenFeatureClass("SDE.BBBB");//填充所需Feature集合
ESRI.ArcGIS.Carto.FeatureLayerFLayer=newESRI.ArcGIS.Carto.FeatureLayerClass();
FLayer.FeatureClass=FeatureClass;//将Feature加载到图层
axMapControl1.Map.AddLayer(FLayer);//加载图层
axMapControl1.Update();//更新空白区域
axMapControl1.Refresh();//刷新地图视窗
}
privatevoidForm1_Closed(objectsender,System.EventArgse)
{
ESRI.ArcGIS.esriSystem.IAoInitializeaoi=newESRI.ArcGIS.esriSystem.AoInitializeClass();
aoi.Shutdown();
}
privatevoidbutton1_Click(objectsender,System.EventArgse)
{
IGraphicsContainerSelectGraphicsContainerSelect=(IGraphicsContainerSelect)axMapControl1.Map;
if(GraphicsContainerSelect.ElementSelectionCount==0)//判断是否选中图斑
{
MessageBox.Show("请选中欲导入图斑!
");
return;
}
IWorkspaceEditWorkspaceEdit;
IFeatureLayerFeatureLayer;
IFeatureClassFeatureClass;
IFeatureFeature;
IDatasetDataset;
FeatureLayer=(IFeatureLayer)this.axMapControl1.get_Layer(0);//选中导入图层
FeatureClass=FeatureLayer.FeatureClass;//该图层的feature集
Dataset=(IDataset)FeatureClass;//该图层的数据集
WorkspaceEdit=(IWorkspaceEdit)Dataset.Workspace;//关联到编辑空间
WorkspaceEdit.StartEditing(true);//使之可编辑
WorkspaceEdit.StartEditOperation();//开始编辑
Feature=FeatureClass.CreateFeature();//创建空feature
Feature.Shape=GraphicsContainerSelect.SelectedElement(0).Geometry;//仅导入最新选中图斑,即多选时只有一个可以导入
Feature.Store();
WorkspaceEdit.StopEditOperation();
WorkspaceEdit.StopEditing(true);//结束编辑并保存
IGraphicsContainerGraphicsContainer=(IGraphicsContainer)GraphicsContainerSelect;
GraphicsContainer.DeleteAllElements();//删除graphic图层
axMapControl1.ActiveView.Refresh();//刷新当前视图
MessageBox.Show("ok");
}
3.ArcEngine中对Feature的编辑
对Feature的编辑分为以下几个部分
1.新建
2.修改
3.删除
涉及到的接口有以下几个
IWorkspaceEdit
IFeatureClass
IFeatureCursor
IFeature
其中IWorkspaceEdit用于启动编辑开始编辑操作结束编辑操作结束编辑
IFeatureClass是数据的所在地
IFeatureCursor是一个游标提供访问数据的接口和修改数据的接口
IFeature是对象的代表我们要编辑的目标
编辑的过程如下:
1.添加一个Feature
//假设space是一个IWorkspaceEdit
//参数表示是否需要使用Undo/Redo功能,该功能的粒度是EditOperator.
spaceEdit.StartEditing(false);
spaceEdit.StartEditOperator();
//添加一个Feature
IFeaturenewFea=feaClass.createFeature();
//为Feature添加属性设置图形
newFea.Store();//保存属性和图形
spaceEdit.StopEditOperator();//结束编辑操作
//结束编辑过程
//参数表示是否保存编辑
spaceEdit.StopEditing(true);
2.添加多个Feature
添加多个Feature也可以向上面一样使用多次就可以了
当时也可以使用IFeatureCursor来添加数据
3.修改Feature
添加Feature中的修改属性和图形部分就是
每次修改后一定要调用Store方法这样变化才可以保存下来
4.删除
IFeature有一个方法Delete可以用于删除当时经过测试发现对Shapefile
会抛出异常来。
IFeatureCuror有一个DeleteFeature方法可以用来删除当前的Feature,经测试
对所有的数据源类型都可以使用。
注意事项
1.不能设置Feature的OID
2.不能设置Feature的Area
3.不能设置Feature的Lenght
4.不能设置Feature的Shape字段,需要调用单独的方法来给Feature关联几何图形。
4.Feature的概念
Feature是二次开发中最常用的对象,feature是featureclass中一个记录,从object中派生出来的,因此也具有属性和方法,object又是从row中派生的,所以featureclass其实一张表,featured就是表中的一条记录,feature可以保存空间数据对象,要素中的几何型体对象定义了要素的类型,它可以保存的几何型体对象有点、点集、多边形、多义线。
这些都是些简单的要素对象,在有些情况下要素还可以参与拓扑、网络运算。
Feature相关接口
Feature有派生出很多类,如:
networkfeature、rastercatalogfeature、coverageannotationfeature、annotationfeature、dimensionfeature。
feature的主要接口是Ifeature,其中的Extent用来返回要素对象的包络线,显示要素的空间范围;Featuretype返回要素的类型;Shape返回要素的几何型体对象;ShapeCopy得到几何型体对象的一个拷贝。
IfeatureBuffer中的Shape得到缓冲要素的几何型体对象
IfeatureEdit中MoveSet、RotateSet、DeleteSet分别是移动、旋转、删除一个或者是多个要素组成的要素集上。
Split主要是用来分割几何型体的,通过点分割线,通过多义线分割多边形,分割后旧的被删除,新的要素自动产生。
因为每个要素都有对应的属性,要素改变了,其对应的属性也相应的要改变。
Splitattributes就是用来分割要素属性字段中的值。
该方法可以在Split方法执行后自动执行。
IfeatureDraw中的InvalidArea属性得到一个绘画的区域。
Draw在显示设备上绘制要素
IfeatureChanges中OriginalShape得到要素的最初几何类型,ShapeChanged指示要素的几何类型是否改变。
IfeatureSimplify中SimplifyGeometry按照该元素的拓扑规则进行拓扑一致
5.如何实现经度纬度到平面坐标的相互转换?
(转载)
分类:
WebGIS网络地理信息系统研究
现在好多人在使用ArcObject的时候都可能需要作经纬度和平面坐标的相互转换。
由于经纬度是球面坐标,平面坐标是X-Y的笛卡尔坐标系统,所以这是一个看起来比较难的问题。
好多人一上来就搬出地图学、地图投影学或者测绘学中的投影公式(如高斯投影或墨卡托投影),又是基准坐标又是角度的搞的人头都大了。
实际上要想实现这个功能非常easy。
ARCEngine中的IPoint就可以进行投影和反投影运算了。
投影过程(C#):
/// flatref投影的坐标系统,这里的54013是世界投影 ,世界投影所有经纬度都可以转换为平面坐标,但是由于投影面积大失真也会比较大(相当于把整个地球劈成一片片的,然后拉伸最后贴到平面上,失真当然大了)。
当然也可以选择精度更高的平面如:
esriSRProjCS_Beijing1954GK_23N 对应数值21483 仅仅把北京附近的地球平面拉伸铺在平面上,由于投影面积变小,所以投影经度提高。
但是由于面积变小,所以有些经度纬度不能转换,比如所美国的精度纬度用北京投影就投不了。
flatref=pfactory.CreateProjectedCoordinateSystem(54013);
//没什么说的,标准大地经纬度,可以将X-Y逆投影为经度和纬度
earthref=pfactory.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_NAD1983);
///将经纬度点转换为平面坐标。
privateIPointGetProject(doublex,doubley)
{
IPointpt=newPointClass();
pt.PutCoords(x,y);
IGeometrygeo=(IGeometry)pt;
geo.SpatialReference=earthref;
geo.Project(flatref);
returnpt;
}
///将平面坐标转换为经纬度。
privateIPointGetGeo(doublex,doubley)
{
IPointpt=newPointClass();
pt.PutCoords(x,y);
IGeometrygeo=(IGeometry)pt;
geo.SpatialReference=flatref;
geo.Project(earthref);
doublexx=pt.X;
returnpt;
}实际上IPoint的投影和任何地图都没什么大关系,完全可以不用地图,直接调用IPoint进行投影的转换
6.ArcEngine中使用上下左右键移动地图功能的实现
//闪烁目标
publicstaticvoidFlashFeature(AxMapControlmapControl,IFeatureiFeature,IMapiMap)
{
IActiveViewiActiveView=iMapasIActiveView;
if(iActiveView!
=null)
{
iActiveView.ScreenDisplay.StartDrawing(0,(short)esriScreenCache.esriNoScreenCache);
//根据几何类型调用不同的过程
switch(iFeature.Shape.GeometryType)
{
caseesriGeometryType.esriGeometryPolyline:
FlashLine(mapControl,iActiveView.ScreenDisplay,iFeature.Shape);
break;
caseesriGeometryType.esriGeometryPolygon:
FlashPolygon(mapControl,iActiveView.ScreenDisplay,iFeature.Shape);
break;
caseesriGeometryType.esriGeometryPoint:
FlashPoint(mapControl,iActiveView.ScreenDisplay,iFeature.Shape);
break;
default:
break;
}
iActiveView.ScreenDisplay.FinishDrawing();
}
}
//闪烁线
staticvoidFlashLine(AxMapControlmapControl,IScreenDisplayiScreenDisplay,IGeometryiGeometry)
{
ISimpleLineSymboliLineSymbol;
ISymboliSymbol;
IRgbColoriRgbColor;
iLineSymbol=newSimpleLineSymbol();
iLineSymbol.Width=4;
iRgbColor=newRgbColor();
iRgbColor.Red=255;
iLineSymbol.Color=iRgbColor;
iSymbol=(ISymbol)iLineSymbol;
iSymbol.ROP2=esriRasterOpCode.esriROPNotXOrPen;
mapControl.FlashShape(iGeometry,3,200,iSymbol);
}
//闪烁面
staticvoidFlashPolygon(AxMapControlmapControl,IScreenDisplayiScreenDisplay,IGeometryiGeometry)
{
ISimpleFillSymboliFillSymbol;
ISymboliSymbol;
IRgbColoriRgbColor;
iFillSymbol=newSimpleFillSymbol();
iFillSymbol.Style=esriSimpleFillStyle.esriSFSSolid;
iFillSymbol.Outline.Width=12;
iRgbColor=newRgbColor();
iRgbColor.RGB=System.Drawing.Color.FromArgb(100,180,180).ToArgb();
iFillSymbol.Color=iRgbColor;
iSymbol=(ISymbol)iFillSymbol;
iSymbol.ROP2=esriRasterOpCode.esriROPNotXOrPen;
iScreenDisplay.SetSymbol(iSymbol);
mapControl.FlashShape(iGeometry,3,200,iSymbol);
}
//闪烁点
staticvoidFlashPoint(AxMapControlmapControl,IScreenDisplayiScreenDisplay,IGeometryiGeometry)
{
ISimpleMarkerSymboliMarkerSymbol;
ISymboliSymbol;
IRgbColoriRgbColor;
iMarkerSymbol=newSimpleMarkerSymbol();
iMarkerSymbol.Style=esriSimpleMarkerStyle.esriSMSCircle;
iRgbColor=newRgbColor();
iRgbColor.RGB=System.Drawing.Color.FromArgb(0,0,0).To