ArcgisEngine开发总结集锦文档格式.docx
《ArcgisEngine开发总结集锦文档格式.docx》由会员分享,可在线阅读,更多相关《ArcgisEngine开发总结集锦文档格式.docx(132页珍藏版)》请在冰点文库上搜索。
26.基于AO/AE获取要素信息87
27.ArcEngine中拓扑的使用--90
28.ArcEngine渲染的使用93
29.利用ArcEngin进行空间分析的简单应用--100
30.IfeatureSelection:
SelectFeatures方法介绍105
31.常用数据入sde库的代码107
32.ArcEngine开发感想112
33.Geometry对象浅析114
34.AE开发中的一些基本方法
(1)数据连接125
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"
"
服务器名"
);
//服务器名
Instance"
端口"
//实例化端口
user"
用户名"
//SDE用户名
password"
密码"
//密码
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();
//刷新当前视图
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按照该元素的拓扑规则进行拓扑一致
(转载)
分类:
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)
geo.SpatialReference=flatref;
geo.Project(earthref);
doublexx=pt.X;
}实际上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);
caseesriGeometryType.esriGeometryPoint:
FlashPoint(mapControl,iActiveView.ScreenDisplay,iFeature.Shape);
default:
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;
iFillSymbol=newSimpleFillSymbol();
iFillSymbol.Style=esriSimpleFillStyle.esriSFSSolid;
iFillSymbol.Outline.Width=12;
iRgbColor.RGB