ArcGis Server開發Web GIS新手體驗(四)
接(三)
這一節主要貼代碼算了,通過代碼看一下一些簡單功能的實現。偶快要放假了,靜不下心來寫了,寫得也不好。說不定貼代碼效果更好。
1、獲取所有圖層
ESRI.ArcGIS.Server.WebControls.WebMap webmap= Map1.CreateWebMap();
try
{
ESRI.ArcGIS.Carto.IMapDescription descr = webmap.MapDescription;
ddlLayers.Items.Clear();
int id;
for (int i=0;i<= descr.LayerDescriptions.Count-1;i++)
{
id = descr.LayerDescriptions.get_Element(i).ID;
ddlLayers.Items.Add(id.ToString() + "," + webmap.LayerNameFromID(id)); //ddlLayers是一個DropDownList控件
}
if (ddlLayers.Items.Count>0)
{
ddlLayers.SelectedIndex=0;
}
}
finally
{
webmap.Dispose();
}
try
{
ESRI.ArcGIS.Carto.IMapDescription descr = webmap.MapDescription;
ddlLayers.Items.Clear();
int id;
for (int i=0;i<= descr.LayerDescriptions.Count-1;i++)
{
id = descr.LayerDescriptions.get_Element(i).ID;
ddlLayers.Items.Add(id.ToString() + "," + webmap.LayerNameFromID(id)); //ddlLayers是一個DropDownList控件
}
if (ddlLayers.Items.Count>0)
{
ddlLayers.SelectedIndex=0;
}
}
finally
{
webmap.Dispose();
}
2、通過圖層的ID獲取圖層對象
private IFeatureLayer GetFeatureLayer(int lyid)
{
WebMap webmap = Map1.CreateWebMap();
try
{
ILayer layer = (webmap.MapServer as IMapServerObjects).get_Layer(webmap.DataFrame,lyid);
if (layer==null)
return null;
else
{
return (layer as IFeatureLayer);
}
}
finally
{
webmap.Dispose();
}
}
{
WebMap webmap = Map1.CreateWebMap();
try
{
ILayer layer = (webmap.MapServer as IMapServerObjects).get_Layer(webmap.DataFrame,lyid);
if (layer==null)
return null;
else
{
return (layer as IFeatureLayer);
}
}
finally
{
webmap.Dispose();
}
}
3、新建一個多邊形
private void Map1_Polygon(object sender, ESRI.ArcGIS.Server.WebControls.PolygonEventArgs args)
{
if (args.ToolName == "newpolygon")
{
IFeatureLayer flayer = GetCurFeatureLayer(); //獲取當前活動圖層了函數,這里就不貼了,就是調用GetFeatureLayer(int lyid)函數
if (flayer == null) return;
if (flayer.FeatureClass.ShapeType != ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon)
{
string sc;
sc = "<script language=javascript>alert('當前圖層何類型不對!')</script>";
Page.RegisterClientScriptBlock("ShapeTypeError",sc);
return;
}
//生成多邊形
ESRI.ArcGIS.Server.IServerContext context;
ESRI.ArcGIS.Server.WebControls.WebMap webmap = Map1.CreateWebMap();
webmap.ManageLifetime(flayer);
context = webmap.ServerContext;
ESRI.ArcGIS.Geometry.IPolygon poly = context.CreateObject("esriGeometry.Polygon") as ESRI.ArcGIS.Geometry.IPolygon; //'new ag.PolygonClass();
webmap.ManageLifetime(poly);
ESRI.ArcGIS.Geometry.IPoint pt;
ESRI.ArcGIS.Geometry.IGeometryCollection ringcol = context.CreateObject("esriGeometry.Polygon") as ESRI.ArcGIS.Geometry.IGeometryCollection;// new PolygonClass();
webmap.ManageLifetime(ringcol);
ESRI.ArcGIS.Geometry.IPointCollection ptcol =context.CreateObject("esriGeometry.Ring") as ESRI.ArcGIS.Geometry.IPointCollection;// new RingClass();
webmap.ManageLifetime(ptcol);
object obj=Type.Missing;
for (int i=0;i<=args.Vectors.Length-1;i++)
{
pt = webmap.ToMapPoint(args.Vectors[i].X,args.Vectors[i].Y);
ptcol.AddPoint(pt,ref obj,ref obj);
}
ringcol.AddGeometry(ptcol as IGeometry,ref obj,ref obj);
poly = ringcol as IPolygon; 
//將多邊形寫入到圖層中
ESRI.ArcGIS.Geodatabase.IFeature feature = flayer.FeatureClass.CreateFeature();
feature.Shape = poly as IGeometry;
feature.Store();
webmap.Refresh();
webmap.Dispose();
}
}

4、矩形選擇,獲得選擇集,并在地圖上顯示選中的對象。(這個功能花費了偶一天多的時間。)
private void Map1_DragRectangle(object sender, ESRI.ArcGIS.Server.WebControls.ToolEventArgs args)
{
string strTool = args.ToolName.ToLower();
if (strTool=="rectsel")
{
//取得當前層
if (ddlLayers.SelectedValue=="")
return;
IFeatureLayer flayer = GetCurFeatureLayer();
if (flayer == null) return;
//獲得選擇集
int t1=Environment.TickCount;
ESRI.ArcGIS.Server.WebControls.WebMap webmap = Map1.CreateWebMap();
ESRI.ArcGIS.Server.IServerContext ctx = webmap.ServerContext;
webmap.ManageLifetime(ctx);
ESRI.ArcGIS.Geodatabase.IWorkspace ws = (flayer.FeatureClass as ESRI.ArcGIS.Geodatabase.IDataset).Workspace;
ESRI.ArcGIS.Geometry.IEnvelope env = ctx.CreateObject("esriGeometry.Envelope") as ESRI.ArcGIS.Geometry.IEnvelope;
webmap.ManageLifetime(ws);
webmap.ManageLifetime(env);
IPoint pt = webmap.ToMapPoint(Convert.ToInt32(Request.Params.Get("maxx")),Convert.ToInt32(Request.Params.Get("maxy")));
env.XMax = pt.X;
env.YMin = pt.Y;
pt = webmap.ToMapPoint(Convert.ToInt32(Request.Params.Get("minx")),Convert.ToInt32(Request.Params.Get("miny")));
env.XMin= pt.X;
env.YMax = pt.Y;
ESRI.ArcGIS.Geodatabase.ISpatialFilter filter = ctx.CreateObject("esriGeodatabase.SpatialFilter") as ESRI.ArcGIS.Geodatabase.ISpatialFilter;
webmap.ManageLifetime(filter);
filter.SpatialRel = ESRI.ArcGIS.Geodatabase.esriSpatialRelEnum.esriSpatialRelIntersects;
filter.Geometry = env as ESRI.ArcGIS.Geometry.IGeometry;
filter.GeometryField = flayer.FeatureClass.ShapeFieldName;
ESRI.ArcGIS.Geodatabase.ISelectionSet sset = flayer.FeatureClass.Select(filter,ESRI.ArcGIS.Geodatabase.esriSelectionType.esriSelectionTypeSnapshot,ESRI.ArcGIS.Geodatabase.esriSelectionOption.esriSelectionOptionNormal,ws);
int t2=Environment.TickCount;
int t3=t2-t1; //t3是查詢響應的時間,可以用來測試一下性能,呵呵 
//顯示選擇集
int id;
ESRI.ArcGIS.Geodatabase.IEnumIDs ids;
ids = sset.IDs;
webmap.ManageLifetime(ids);
ids.Reset();
ESRI.ArcGIS.Geodatabase.IFIDSet fidset = ctx.CreateObject("esriGeodatabase.FIDSet") as ESRI.ArcGIS.Geodatabase.IFIDSet;
id = ids.Next();
while (id>=0)
{
fidset.Add(id);
id =ids.Next();
}
IMapDescription desc = webmap.MapDescription as IMapDescription;
webmap.ManageLifetime(desc);
ILayerDescription ldesc = desc.LayerDescriptions.get_Element(flyid);
webmap.ManageLifetime(ldesc);
ldesc.SelectionFeatures = fidset;
//將選擇信息保存在session中
Session["selection"] = sset;
Session["layerid"] = flyid;
webmap.Refresh();
webmap.Dispose();
}
}

5、刪除選中的對象
private void DeleteSel()
{
if (Session["layerid"]==null) return;
if (Session["selection"] == null) return;
int layerid = (int)Session["layerid"];
if (layerid == -1) return;
ESRI.ArcGIS.Geodatabase.ISelectionSet sset = Session["selection"] as ESRI.ArcGIS.Geodatabase.ISelectionSet;
if (sset == null) return;
WebMap webmap = Map1.CreateWebMap();
IFeatureLayer layer = GetFeatureLayer(layerid);
if (layer==null) return;
webmap.ManageLifetime(layer);
webmap.ManageLifetime(sset);
ESRI.ArcGIS.Geodatabase.IEnumIDs ids = sset.IDs;
webmap.ManageLifetime(ids);
ids.Reset();
int id;
id = ids.Next();
ESRI.ArcGIS.Geodatabase.IFeature feature;
ESRI.ArcGIS.Server.IServerContext ctx = webmap.ServerContext;
webmap.ManageLifetime(ctx);
//將selectionset轉化為featurecursor對象
ESRI.ArcGIS.Geodatabase.IFeatureCursor fcursor;
ESRI.ArcGIS.Geodatabase.ICursor cursor;
sset.Search(null,false,out cursor);
fcursor = cursor as ESRI.ArcGIS.Geodatabase.IFeatureCursor;
ESRI.ArcGIS.esriSystem.ISet pDeleteSet = ctx.CreateObject("esriSystem.Set") as ESRI.ArcGIS.esriSystem.Set;
webmap.ManageLifetime(pDeleteSet);
//設置ISet對象
feature = fcursor.NextFeature();
while (feature != null)
{
pDeleteSet.Add(feature);
feature = fcursor.NextFeature();
}
ESRI.ArcGIS.Geodatabase.IFeatureEdit fedit;
pDeleteSet.Reset();
fedit = pDeleteSet.Next() as ESRI.ArcGIS.Geodatabase.IFeatureEdit;
while (fedit != null)
{
fedit.DeleteSet(pDeleteSet);
fedit = pDeleteSet.Next() as ESRI.ArcGIS.Geodatabase.IFeatureEdit;
}
Session.Remove("layerid");
Session.Remove("selection");
webmap.Refresh();
webmap.Dispose();
}



浙公網安備 33010602011771號