ArcGIS Server中Geoprocessing的使用
ArcGIS Server中Geoprocessing的使用 在ArcGIS Server中使用Geoprocessing有两种方式,一种是调用Geoprocessing服务,另外一种是直接调用后台的Geoprocessing的工具。这两种方式都可以使得ArcGIS Server编程变的简单,可以节省开发人员的很多开发工作量。
1 ArcGIS Server中直接调用Geoprocessing中的工具
ArcToolbox中的工具基本上都可以在Server中调用,这种调用方式和调用其它的ao组件没有什么大的区别,因为工具就在服务器上,运行也在服务器上,这些arctoolbox中的dll库位于类似的安装目录下,C:\Program Files\ArcGIS\DotNet\Toolboxes,这些工具的说明可以见ArcGIS Server 的.Net开发帮助,也可以桌面产品的帮助系统,包括里面的参数说明。附件中是.Net开发帮助中的所有的工具说明所在的位置。
下面是一个在ArcGIS Server中调用后台的Geoprocessing中的工具,调用的是DataManagermentTools-〉Features-〉Copy的工具。
protected void Button1_Click(object sender, EventArgs e)
{
IServerContext serverContext = null;
try
{
ESRI.ArcGIS.esriSystem.IVariantArray varray = null;
GISServerConnection serverConnection;
serverConnection = new GISServerConnection();
serverConnection.Connect("servername");
IServerObjectManager serverManager = serverConnection.ServerObjectManager;
serverContext = serverManager.CreateServerContext("", "");
//直接调用服务器上的Geoprocessing工具的GP的创建方式:
ESRI.ArcGIS.Geoprocessor.Geoprocessor gp = new ESRI.ArcGIS.Geoprocessor.Geoprocessor(serverContext);
ESRI.ArcGIS.DataManagementTools.CopyFeatures copyfeatures = new ESRI.ArcGIS.DataManagementTools.CopyFeatures();
varray = (IVariantArray)serverContext.CreateObject("esriSystem.VarArray");
//设置参数
string inputfile = @"D:\arcgis\ArcTutor\Tracking_Analyst\Simple";
string inputfeatureclass = "2000_hrcn.shp";
string outputfile = @"D:\arcgis\ArcTutor\Tracking_Analyst\Simple";
string outputfeatureclass = "output.shp";
copyfeatures.in_features = @inputfile + "\\" + inputfeatureclass;
copyfeatures.out_feature_class = @outputfile + "\\" + outputfeatureclass;
varray.Add(copyfeatures.in_features);
varray.Add(copyfeatures.out_feature_class);
//执行工具
gp.Execute(copyfeatures.ToolName + "_" + copyfeatures.Alias, varray, null);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
System.Diagnostics.Debug.WriteLine(ex.StackTrace);
}
finally
{
serverContext.ReleaseContext();
}
}
2 调用Geoprocessing的服务
在ArcGIS Server中调用GeoProcessing服务,首先要把工具发布到ArcGIS Server上,发布方式很简单,只需要在某个工具箱处点击右键,选择发布到ArcGIS Server上去就可以了,见附图
然后就可以在ArcGIS Server上调用这个服务了。。
下面是.Net ADF 控件来一个调用Geoprocessing的服务的例子,这个过程中使用的参数类都来自于ADF中,都来自于ESRI.ArcGIS.ADF.Web.DataSources这个库中。
protected void Button1_Click(object sender, EventArgs e)
{
IGeoprocessingResource igp = GeoprocessingResourceManager1.GetResource(0);
ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.GeoprocessingFunctionality agp =
(ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.GeoprocessingFunctionality)
igp.CreateFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IGeoprocessingFunctionality), null);
if (!agp.Initialized)
agp.Initialize();
string taskname = "copy";
ESRI.ArcGIS.ADF.Web.DataSources.GPToolInfo gpti = agp.GetTask(taskname);
//得到工具的参数信息
ESRI.ArcGIS.ADF.Web.DataSources.GPParameterInfo[] paramInfos = gpti.ParameterInfo;
//列出工具的参数类型
string parameternames = null;
ESRI.ArcGIS.ADF.Web.DataSources.GPParameterInfo paramInfo;
for (int i = 0; i < paramInfos.Length; i++)
{
paramInfo = paramInfos;
parameternames += paramInfo.Name;
if (i != paramInfos.Length - 1)
parameternames += ";";
}
//设置参数,这个时候需要结果上面得到的参数类型,以及帮助系统中的参数说明。
ESRI.ArcGIS.ADF.Web.DataSources.GPString gpDatatype = new ESRI.ArcGIS.ADF.Web.DataSources.GPString();
gpDatatype.Value = "ShapeFile";
ESRI.ArcGIS.ADF.Web.DataSources.GPString gpDataFile= new ESRI.ArcGIS.ADF.Web.DataSources.GPString();
gpDataFile.Value = @"D:\arcgis\ArcTutor\Tracking_Analyst\Simple\2000_hrcn.shp";
ESRI.ArcGIS.ADF.Web.DataSources.GPString gpDataFileout = new ESRI.ArcGIS.ADF.Web.DataSources.GPString();
gpDataFileout.Value = @"D:\arcgis\ArcTutor\Tracking_Analyst\Simple\2000_hrcnout.shp";
GPValue[] gpvalues = new GPValue[3];
gpvalues[0] = gpDataFile;
gpvalues[1] = gpDataFileout;
gpvalues[2] = gpDatatype;
string JobID;
//执行工具,得到JobID号,以便用它来得到结果。
JobID = agp.SubmitJob(taskname, gpvalues);
string returnstring = JobID + "," + taskname + "," + parameternames;
Thread.Sleep(2000);
//获得工具的运行结果
GPJobStatus(returnstring);
}
protected void GPJobStatus(string ea)
{
char[] parser_char = { ',' };
string[] messages = ea.Split(parser_char);
string JobID = messages[0];
string taskname = messages[1];
string[] parameternames = messages[2].Split(';');
IGeoprocessingResource igp = GeoprocessingResourceManager1.GetResource(0);
ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.GeoprocessingFunctionality agp =
(ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.GeoprocessingFunctionality)
igp.CreateFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IGeoprocessingFunctionality), null);
if (!agp.Initialized)
agp.Initialize();
if (agp.GetJobStatus(JobID) != JobStatus.Succeeded)
{
TextBox1.Text = "还没有完成,谢谢!";
return;
}
ESRI.ArcGIS.ADF.Web.DataSources.GPResult gpr = agp.GetJobResult(taskname, JobID, parameternames, false);
int ic = gpr.Messages.Length;
for (int i = 0; i < ic; i++)
{
TextBox1.Text = TextBox1.Text + gpr.Messages.MessageDesc.ToString();
}
GPValue[] gpvs = gpr.Values;
//可以直接得到GraphicsLayer,而不需自己再去生成,所以结果很容易就能加到Map控件上去。
GPFeatureGraphicsLayer gfl = (GPFeatureGraphicsLayer)gpvs[0];
FeatureGraphicsLayer glayer = gfl.Layer;
IEnumerable gfc = Map1.GetFunctionalities();
ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource gResource = null;
foreach (IGISFunctionality gfunc in gfc)
{
if (gfunc.Resource.Name == "copy")
{
gResource = (ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource)gfunc.Resource;
break;
}
}
if (gResource == null)
{ throw new Exception("No graphics layer."); }
gResource.Graphics.Tables.Clear();
gResource.Graphics.Tables.Add(glayer);
if (Map1.ImageBlendingMode == ImageBlendingMode.WebTier)
{
Map1.Refresh();
}
else if (Map1.ImageBlendingMode ==ImageBlendingMode.Browser)
{
Map1.RefreshResource(gResource.Name);
}
}
3 两者的比较
1) 使用场合不同,Geoprocessing服务作为一个标准的Web Services,可以通过标准的方式进行调用,适合在企业之间进行共享调用。而直接调用方式是使用DCOM的原理,和调用普通的AO组件的调用原理一样,适合在企业内部使用。
2) 结果所在目录不同:使用直接调用工具的方式,输出的结果是放在参数的指定目录下,比如上面例子中Copy的指定目录D:\arcgis\ArcTutor\Tracking_Analyst\Simple,那么结果就是在服务器的这个目录下。而使用Geoproessing服务方式调用工具,那么结果都是放在C:\arcgisserver\arcgisjobs\DataManagementTools_GPServer\J860384ADA84D428586196E5813E12742这样的目录下,最后一个文件夹的名称就是程序运行时候返回的JobID号码, 并且在程序得到的GPResult都会有一个GrapchisLayer这样的结果可以直接放在Map控件中进行显示。
1 ArcGIS Server中直接调用Geoprocessing中的工具
ArcToolbox中的工具基本上都可以在Server中调用,这种调用方式和调用其它的ao组件没有什么大的区别,因为工具就在服务器上,运行也在服务器上,这些arctoolbox中的dll库位于类似的安装目录下,C:\Program Files\ArcGIS\DotNet\Toolboxes,这些工具的说明可以见ArcGIS Server 的.Net开发帮助,也可以桌面产品的帮助系统,包括里面的参数说明。附件中是.Net开发帮助中的所有的工具说明所在的位置。
下面是一个在ArcGIS Server中调用后台的Geoprocessing中的工具,调用的是DataManagermentTools-〉Features-〉Copy的工具。
protected void Button1_Click(object sender, EventArgs e)
{
IServerContext serverContext = null;
try
{
ESRI.ArcGIS.esriSystem.IVariantArray varray = null;
GISServerConnection serverConnection;
serverConnection = new GISServerConnection();
serverConnection.Connect("servername");
IServerObjectManager serverManager = serverConnection.ServerObjectManager;
serverContext = serverManager.CreateServerContext("", "");
//直接调用服务器上的Geoprocessing工具的GP的创建方式:
ESRI.ArcGIS.Geoprocessor.Geoprocessor gp = new ESRI.ArcGIS.Geoprocessor.Geoprocessor(serverContext);
ESRI.ArcGIS.DataManagementTools.CopyFeatures copyfeatures = new ESRI.ArcGIS.DataManagementTools.CopyFeatures();
varray = (IVariantArray)serverContext.CreateObject("esriSystem.VarArray");
//设置参数
string inputfile = @"D:\arcgis\ArcTutor\Tracking_Analyst\Simple";
string inputfeatureclass = "2000_hrcn.shp";
string outputfile = @"D:\arcgis\ArcTutor\Tracking_Analyst\Simple";
string outputfeatureclass = "output.shp";
copyfeatures.in_features = @inputfile + "\\" + inputfeatureclass;
copyfeatures.out_feature_class = @outputfile + "\\" + outputfeatureclass;
varray.Add(copyfeatures.in_features);
varray.Add(copyfeatures.out_feature_class);
//执行工具
gp.Execute(copyfeatures.ToolName + "_" + copyfeatures.Alias, varray, null);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
System.Diagnostics.Debug.WriteLine(ex.StackTrace);
}
finally
{
serverContext.ReleaseContext();
}
}
2 调用Geoprocessing的服务
在ArcGIS Server中调用GeoProcessing服务,首先要把工具发布到ArcGIS Server上,发布方式很简单,只需要在某个工具箱处点击右键,选择发布到ArcGIS Server上去就可以了,见附图
然后就可以在ArcGIS Server上调用这个服务了。。
下面是.Net ADF 控件来一个调用Geoprocessing的服务的例子,这个过程中使用的参数类都来自于ADF中,都来自于ESRI.ArcGIS.ADF.Web.DataSources这个库中。
protected void Button1_Click(object sender, EventArgs e)
{
IGeoprocessingResource igp = GeoprocessingResourceManager1.GetResource(0);
ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.GeoprocessingFunctionality agp =
(ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.GeoprocessingFunctionality)
igp.CreateFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IGeoprocessingFunctionality), null);
if (!agp.Initialized)
agp.Initialize();
string taskname = "copy";
ESRI.ArcGIS.ADF.Web.DataSources.GPToolInfo gpti = agp.GetTask(taskname);
//得到工具的参数信息
ESRI.ArcGIS.ADF.Web.DataSources.GPParameterInfo[] paramInfos = gpti.ParameterInfo;
//列出工具的参数类型
string parameternames = null;
ESRI.ArcGIS.ADF.Web.DataSources.GPParameterInfo paramInfo;
for (int i = 0; i < paramInfos.Length; i++)
{
paramInfo = paramInfos;
parameternames += paramInfo.Name;
if (i != paramInfos.Length - 1)
parameternames += ";";
}
//设置参数,这个时候需要结果上面得到的参数类型,以及帮助系统中的参数说明。
ESRI.ArcGIS.ADF.Web.DataSources.GPString gpDatatype = new ESRI.ArcGIS.ADF.Web.DataSources.GPString();
gpDatatype.Value = "ShapeFile";
ESRI.ArcGIS.ADF.Web.DataSources.GPString gpDataFile= new ESRI.ArcGIS.ADF.Web.DataSources.GPString();
gpDataFile.Value = @"D:\arcgis\ArcTutor\Tracking_Analyst\Simple\2000_hrcn.shp";
ESRI.ArcGIS.ADF.Web.DataSources.GPString gpDataFileout = new ESRI.ArcGIS.ADF.Web.DataSources.GPString();
gpDataFileout.Value = @"D:\arcgis\ArcTutor\Tracking_Analyst\Simple\2000_hrcnout.shp";
GPValue[] gpvalues = new GPValue[3];
gpvalues[0] = gpDataFile;
gpvalues[1] = gpDataFileout;
gpvalues[2] = gpDatatype;
string JobID;
//执行工具,得到JobID号,以便用它来得到结果。
JobID = agp.SubmitJob(taskname, gpvalues);
string returnstring = JobID + "," + taskname + "," + parameternames;
Thread.Sleep(2000);
//获得工具的运行结果
GPJobStatus(returnstring);
}
protected void GPJobStatus(string ea)
{
char[] parser_char = { ',' };
string[] messages = ea.Split(parser_char);
string JobID = messages[0];
string taskname = messages[1];
string[] parameternames = messages[2].Split(';');
IGeoprocessingResource igp = GeoprocessingResourceManager1.GetResource(0);
ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.GeoprocessingFunctionality agp =
(ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.GeoprocessingFunctionality)
igp.CreateFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IGeoprocessingFunctionality), null);
if (!agp.Initialized)
agp.Initialize();
if (agp.GetJobStatus(JobID) != JobStatus.Succeeded)
{
TextBox1.Text = "还没有完成,谢谢!";
return;
}
ESRI.ArcGIS.ADF.Web.DataSources.GPResult gpr = agp.GetJobResult(taskname, JobID, parameternames, false);
int ic = gpr.Messages.Length;
for (int i = 0; i < ic; i++)
{
TextBox1.Text = TextBox1.Text + gpr.Messages.MessageDesc.ToString();
}
GPValue[] gpvs = gpr.Values;
//可以直接得到GraphicsLayer,而不需自己再去生成,所以结果很容易就能加到Map控件上去。
GPFeatureGraphicsLayer gfl = (GPFeatureGraphicsLayer)gpvs[0];
FeatureGraphicsLayer glayer = gfl.Layer;
IEnumerable gfc = Map1.GetFunctionalities();
ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource gResource = null;
foreach (IGISFunctionality gfunc in gfc)
{
if (gfunc.Resource.Name == "copy")
{
gResource = (ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource)gfunc.Resource;
break;
}
}
if (gResource == null)
{ throw new Exception("No graphics layer."); }
gResource.Graphics.Tables.Clear();
gResource.Graphics.Tables.Add(glayer);
if (Map1.ImageBlendingMode == ImageBlendingMode.WebTier)
{
Map1.Refresh();
}
else if (Map1.ImageBlendingMode ==ImageBlendingMode.Browser)
{
Map1.RefreshResource(gResource.Name);
}
}
3 两者的比较
1) 使用场合不同,Geoprocessing服务作为一个标准的Web Services,可以通过标准的方式进行调用,适合在企业之间进行共享调用。而直接调用方式是使用DCOM的原理,和调用普通的AO组件的调用原理一样,适合在企业内部使用。
2) 结果所在目录不同:使用直接调用工具的方式,输出的结果是放在参数的指定目录下,比如上面例子中Copy的指定目录D:\arcgis\ArcTutor\Tracking_Analyst\Simple,那么结果就是在服务器的这个目录下。而使用Geoproessing服务方式调用工具,那么结果都是放在C:\arcgisserver\arcgisjobs\DataManagementTools_GPServer\J860384ADA84D428586196E5813E12742这样的目录下,最后一个文件夹的名称就是程序运行时候返回的JobID号码, 并且在程序得到的GPResult都会有一个GrapchisLayer这样的结果可以直接放在Map控件中进行显示。