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;
}

 

----------------------

 

posted @ 2022-05-11 16:31  小鱼写代码的过往  阅读(213)  评论(0编辑  收藏  举报