ArcGIS Server中通过C#添加或修改空间数据
2011-06-02 16:42 何朝阳 阅读(1768) 评论(0) 收藏 举报最近在项目中需要动态添加或修改图层中的边坡点,经过差不多一天的努力,终于实现了这个功能,其中:
①如果数据源中使用了Group Layer,则得到的图层不是需要编辑的目标层,而是Group Layer层,如下图,得到的图层为“业务数据”,而我需要编辑的是“边坡”图层,所以这个时候就必须要对获得的图层进行判断,看是否为IGroupLayer或ICompositeLayer:

//如果得到的layer是Group Layer
if (layer is ESRI.ArcGIS.Carto.IGroupLayer || layer is ESRI.ArcGIS.Carto.ICompositeLayer)
{
ESRI.ArcGIS.Carto.ICompositeLayer Igrouplayer = (ESRI.ArcGIS.Carto.ICompositeLayer)layer;
layer = Igrouplayer.get_Layer(layer_index);
}
②判断图层中是否存在字段以及添加字段的时候总是出错,后来才发现,在添加字段的时候,必须先停止编辑(wse.StopEditOperation(); wse.StopEditing(true);),或在开始编辑之前进行添加字段的操作;
操作结果如下图,速度还是比较令人满意:

全部代码如下:
#region 在地图上修改或添加边坡点
/// <summary>
/// 在地图上修改或添加边坡点。
/// </summary>
/// <param name="MapResourceManager1">要编辑的地图资源</param>
/// <param name="mapResourceName">MapResourceItem的名称</param>
/// <param name="targetLayerName">要编辑的图层的名称</param>
/// <param name="bh">边坡编号</param>
/// <param name="name">边坡名称</param>
/// <param name="X">边坡点的经度</param>
/// <param name="Y">边坡点的纬度</param>
public static bool AddPoint(MapResourceManager MapResourceManager1, string mapResourceName, string targetLayerName, string bh, string name, double X, double Y)
{
try
{
if (!MapResourceManager1.Initialized) MapResourceManager1.Initialize();
IGISResource gisresource = (IGISResource)MapResourceManager1.GetResource(mapResourceName);
bool supportquery = gisresource.SupportsFunctionality(typeof(IQueryFunctionality));
if (supportquery)
{
IQueryFunctionality qfunc = (IQueryFunctionality)gisresource.CreateFunctionality(typeof(IQueryFunctionality), null);
string[] lids;
string[] lnames;
qfunc.GetQueryableLayers(null, out lids, out lnames);
//获取图层ID
int layer_index = 0;
for (int i = 0; i < lnames.Length; i++)
{
if (lnames[i] == targetLayerName)
{
layer_index = i;
break;
}
}
ESRI.ArcGIS.ADF.Web.QueryFilter myQueryFilter = new ESRI.ArcGIS.ADF.Web.QueryFilter();
myQueryFilter.ReturnADFGeometries = true;
myQueryFilter.WhereClause = string.Format("BH='{0}'", bh);
DataTable dt = qfunc.Query(null, lids[layer_index], myQueryFilter);
if (qfunc.Resource is ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapResourceLocal)
{
MapResourceLocal mr = (MapResourceLocal)qfunc.Resource;
ESRI.ArcGIS.Server.IServerContext serverContext = null;
serverContext = mr.ServerContextInfo.ServerContext;
ESRI.ArcGIS.Geometry.IPoint point = new ESRI.ArcGIS.Geometry.PointClass();
point.X = X;
point.Y = Y;
ESRI.ArcGIS.Carto.IMapServerObjects mso = (ESRI.ArcGIS.Carto.IMapServerObjects)mr.MapServer;
ESRI.ArcGIS.Carto.ILayer layer = mso.get_Layer(mr.MapServer.DefaultMapName, layer_index);
//如果得到的layer是Group Layer
if (layer is ESRI.ArcGIS.Carto.IGroupLayer || layer is ESRI.ArcGIS.Carto.ICompositeLayer)
{
ESRI.ArcGIS.Carto.ICompositeLayer Igrouplayer = (ESRI.ArcGIS.Carto.ICompositeLayer)layer;
layer = Igrouplayer.get_Layer(layer_index);
}
ESRI.ArcGIS.Carto.IFeatureLayer fl = (ESRI.ArcGIS.Carto.IFeatureLayer)layer;
IDataset dataset = fl.FeatureClass as IDataset;
IWorkspace workspace = dataset.Workspace;
IWorkspaceEdit wse = dataset.Workspace as IWorkspaceEdit;
IFeatureClass featureclass = fl.FeatureClass as IFeatureClass;
if (featureclass.FindField("BH") == -1)
{
IField pField = new FieldClass();
IFieldEdit pFieldEdit = pField as IFieldEdit;
pFieldEdit.Length_2 = 100;
pFieldEdit.Name_2 = "BH";
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
featureclass.AddField(pField);
}
if (featureclass.FindField("Name") == -1)
{
IField pField = new FieldClass();
IFieldEdit pFieldEdit = pField as IFieldEdit;
pFieldEdit.Length_2 = 254;
pFieldEdit.Name_2 = "Name";
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
featureclass.AddField(pField);
}
IFeature feature;
wse.StartEditing(false);
wse.StartEditOperation();
if (dt != null && dt.Rows.Count > 0)
{
//修改
int fid = (int)(dt.Rows[0][0]);
feature = featureclass.GetFeature(fid);
}
else
{
//添加
feature = featureclass.CreateFeature();
}
feature.Shape = point as IGeometry;
feature.set_Value(feature.Fields.FindField("BH"), bh);
feature.set_Value(feature.Fields.FindField("Name"), name);
feature.Store();
wse.StopEditOperation();
wse.StopEditing(true);
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
catch
{
return false;
}
}
#endregion
版权声明:
本文原创发表于博客园,作者为何朝阳,博客http://www.cnblogs.com/hechaoyang/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。
本文原创发表于博客园,作者为何朝阳,博客http://www.cnblogs.com/hechaoyang/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。
浙公网安备 33010602011771号