ArcEngine多种数据源连接
1.企业数据库(SDE)
企业数据库需要使用SDE来管理,所以需要使用SDE的Workspace来表示连接。在AE接口中,Workspace是由Factory打开的。代码如下: // //准备连接参数
ESRI.ArcGIS.esriSystem.IPropertySet pPropSet=new PropertySetClass();
pPropSet.SetProperty("server","服务器机器名" );
pPropSet.SetProperty("instance","SDE运行的端口号");
pPropSet.SetProperty("user","用户名");
pPropSet.SetProperty("password","口令" );
pPropSet.SetProperty("version","版本");
SdeWorkspaceFactory sdeWkspFact=new SdeWorkspaceFactoryClass();
IFeatureWorkspace pFeaWksp=(IFeatureWorkspace)sdeWkspFact.Open(pPropSet,0);
其中唯一需要解释的可能就是版本(version).对于没有使用版本或者第一次连接(没有建立空间数据库,当然没有版本了). 该处使用sde.DEFAULT这个版本。这是默认的版本。
iPropertySet:: setProperty
public void setProperty(string name,object value)
IAoInitialize m_AoInitializa = new AoInitializeClass(); esriLicenseStatus pEsriLicenseStatus=m_AoInitializa.Initialize(esriLicenseProductCode.esriLicenseProductCodeEngineGeoDB); IPropertySet propSet = new PropertySetClass(); propSet.SetProperty("SERVER", "192.168.1.143"); propSet.SetProperty("INSTANCE", "5151"); propSet.SetProperty("USER", "myTestUser"); propSet.SetProperty("PASSWORD", "123456"); propSet.SetProperty("VERSION", "SDE.DEFAULT"); IWorkspaceFactory pwf = new SdeWorkspaceFactoryClass(); IFeatureWorkspace pFeatureWorkspace= (IFeatureWorkspace)(pwf.Open(propSet, 0)) ; IFeatureClassfeaClass=pFeatureWorkspace.OpenFeatureClass("要打开的Featureclass名字");
2.个人数据库(PersonalGeodatabase、FileGeodatabase)
ArcEngine中个人数据库为Access。
string filePath="E:\\tt.mdb";
AccessWorkspaceFactory fac=new AccessWorkspaceFactoryClass();
IFeatureWorkspace space=(IFeatureWorkspace)fac.OpenFromFile(filePath,0); 这是用的最多的一种方式.
如果是FileGeodatabasse,则将
FileGDBWorkspaceFactory pWSF = New FileGDBWorkspaceFactory;
IFeatureWorkspace pWS1= pWSF.OpenFromFile(sPath, 0);
如果用IPropertySet。如下:
//Personal Geodatabase e.g., database = "C:\\myData\\mypGDB.mdb"
public IWorkspace open_pGDB_Workspace(string database)
{
IPropertySet propertySet = new PropertySetClass();
propertySet.SetProperty("DATABASE", database);
IWorkspaceFactory workspaceFactory = new AccessWorkspaceFactoryClass();
return workspaceFactory.Open(propertySet, 0);
}
3.Shapefile文件
Shapefile和Access的打开方式有一点相同。也有差异。
//这是Shape所在的目录(注意:是目录)
string spacePath="E:\\shapefile";
IShapefileWorkspaceFactory fac=new ShapefileWorkspaceFactoryClass(); IFeatureWorkspace space=(IFeatureWorkspace)fac.OpenFromFile(spacePath,0);
IFeatureClass fc=space.openFeatureClass(“china”);
4.AutoCAD dwg文件
AutoCAD文件和一般的ESRI格式不同。所以代码会有一点点奇怪。假设有一个dwg文件为E:\\cad\\107.dwg 下面是打开的代码:
CadWorkspaceFactoryClass fac=new CadWorkspaceFactoryClass ();
String filePath="E:\\cad";
IFeatureWorkspace space=fac.OpenFromFile(filePath,0) as IFeatureWorkspace ;
下面是打开FeatureClass的代码:
//线
IFeatureClass polyline =space.OpenFeatureClass("107.dwg:Polyline");
IFeatureLayer layer=new CadFeatureLayerClass ();
layer.FeatureClass =polyline;
//点
IFeatureClass point=space.OpenFeatureClass ("107.dwg:Point");
layer=new CadFeatureLayerClass ();
layer.FeatureClass =point;
//面
IFeatureClass polygon=space.OpenFeatureClass ("107.dwg:Polygon");
layer=new CadFeatureLayerClass();
layer.FeatureClass =polygon;
//注记
IFeatureClass anno=space.OpenFeatureClass ("107.dwg:Annotation"); layer=new CadAnnotationLayerClass();
layer.FeatureClass =anno;
5.影像图文件
//文件路径
string filePath="E:\\image\\117.tif";
IRasterLayer rasterLayer=new RasterLayerClass();
rasterLayer.CreateFromFilePath(filePath );
6.数据库中的影像数据集。
//数据库连接
IWorkspace space=OpenSpace();
//打开数据库的方式
IRasterWorkspaceEx rasterSpace=(IRasterWorkspaceEx)space;
IRasterDataset rasterDataset=rasterSpace.OpenRasterDataset (setName.Name );
IRasterLayer rasLayer=new RasterLayerClass();
rasLayer.CreateFromDataset(rasterDataset);
IRasterWorkspaceEx:提供创建和打开栅格目录或栅格数据集的方法。
但是IRasterWorkspaceEx,IRasterWorkspace, IRasterWorkspace2都有OpenRasterDataset。IRasterWorkspace经常也可用于打开栅格数据,如: pWorkspaceFactory = new RasterWorkspaceFactoryClass();
pRasterWorkspace = (IRasterWorkspace)pWorkspaceFactory.OpenFromFile(filePath, 0);
IRasterDataset pRasterDataset = (IRasterDataset)pRasterWorkspace.OpenRasterDataset(fileName);
IRasterLayer pRasterLayer = new RasterLayerClass();
pRasterLayer.CreateFromDataset(pRasterDataset);
7.连接arcgisServer服务
主要用到该类IAGSServerConnectionFactory ,IAGSServerConnection 连接
public void ArcServer(){
string serverUrl="http://127.0.0.1:6080/arcgis/rest/services/SampleWorldCities/MapServer"; string serverIds="0"; string MapName = "图层"; string servertype = "services"; string[] ids = serverIds.Split(','); //图层id 0,1.. var tempserver = serverUrl.Substring(0, serverUrl.IndexOf(servertype)) + servertype; var tempgg = serverUrl.Substring(serverUrl.IndexOf(servertype)); var tempindex = servertype.Length + 1; var servername = tempgg.Substring(tempindex, tempgg.Substring(tempindex).IndexOf("/MapServer")); List<IAGSServerObjectName> tempServerObjectName = GetMapServer("http://127.0.0.1:6080/arcgis/rest/services", servername, false); if (tempServerObjectName.Count > 0) { var pServerObjectName = tempServerObjectName[0]; foreach (var i in ids) { IName pName = (IName)pServerObjectName; //访问地图服务 IAGSServerObject pServerObject = (IAGSServerObject)pName.Open(); IMapServer pMapServer = (IMapServer)pServerObject; int id = Convert.ToInt32(i); IRecordSet set = new RecordSet(); try { //查询 IQueryFilter qy = new QueryFilter(); set = pMapServer.QueryFeatureData(MapName, id, qy); ITable table = set.Table; IFeatureClass fc = table as IFeatureClass; if (found2) { qy.WhereClause = where; } IFeatureCursor cursor = fc.Search(qy, false); IFeature feature = null; ISpatialFilter sf = new SpatialFilterClass(); while ((feature = cursor.NextFeature()) != null) { //listFeature.Add(feature); //与本图层进行叠加 sf.Geometry = feature.ShapeCopy as IGeometry; sf.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects; int temp = this.m_FeatureClass.FeatureCount(sf); if (temp > 0) { pList.Add(feature); } } Marshal.ReleaseComObject(cursor); } catch { // listFeature = null;//当查询结果为空,即查询运算式出错时 } } }
}
//获取服务
public List<IAGSServerObjectName> GetMapServer(string pHostOrUrl, string pServiceName, bool pIsLAN)
{
List<IAGSServerObjectName> ListServerObjectName = new List<IAGSServerObjectName>();
string[] pServiceNameArr = pServiceName.Split(';');
//设置连接属性
IPropertySet pPropertySet = new PropertySetClass();
if (pIsLAN)
pPropertySet.SetProperty("machine", pHostOrUrl);
else
pPropertySet.SetProperty("url", pHostOrUrl);
//打开连接
IAGSServerConnectionFactory pFactory = new AGSServerConnectionFactory();
//Type factoryType = Type.GetTypeFromProgID(
// "esriGISClient.AGSServerConnectionFactory");
//IAGSServerConnectionFactory agsFactory = (IAGSServerConnectionFactory)
// Activator.CreateInstance(factoryType);
IAGSServerConnection pConnection = pFactory.Open(pPropertySet, 0);
//Get the image server.
IAGSEnumServerObjectName pServerObjectNames = pConnection.ServerObjectNames;
pServerObjectNames.Reset();
IAGSServerObjectName ServerObjectName = pServerObjectNames.Next();
while (ServerObjectName != null)
{
if (pServiceNameArr.Contains(ServerObjectName.Name) &&
(ServerObjectName.Type == "MapServer"))
{
ListServerObjectName.Add(ServerObjectName); break;
}
//if ((ServerObjectName.Name.ToLower() == pServiceName.ToLower()) &&
// (ServerObjectName.Type == "MapServer"))
//{
// ListServerObjectName.Add(ServerObjectName);
// //break;
//}
ServerObjectName = pServerObjectNames.Next();
}
Marshal.ReleaseComObject(pFactory);
//返回对象
return ListServerObjectName;
}
----------------------
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律