arcgis server 动态创建地图服务
2010-11-10 21:56
351 查看
arcgis server 动态创建地图服务代码:
加入地图包括图层渲染,标注等,数据从ArcSDE中读出!
代码中有两个数据表:mapinfo(存储地图信息,key:地图GUID),LayerInfo(存储图层信息,包括其在SDE中的名称,以及最主要的其属于哪个地图的地图GUID),代码中的MapGUID即为地图GUID。
以下为其全部代码:
加入地图包括图层渲染,标注等,数据从ArcSDE中读出!
代码中有两个数据表:mapinfo(存储地图信息,key:地图GUID),LayerInfo(存储图层信息,包括其在SDE中的名称,以及最主要的其属于哪个地图的地图GUID),代码中的MapGUID即为地图GUID。
以下为其全部代码:
using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using ESRI.ArcGIS.Server.WebControls; using ESRI.ArcGIS.Server; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.ADF.Web.Display.Symbol; using ESRI.ArcGIS.Display; using ESRI.ArcGIS.DataSourcesRaster; using System.IO; using ESRI.ArcGIS.esriSystem; using System.Drawing; public partial class ServerManager : System.Web.UI.Page { string HostName = "zhangye"; string MapServerUserName = "ArcGISSOM"; string MapserverPass = "123456"; string MxdPah = @"F:/BaseData"; private static string connectionString = "server=172.39.8.215;uid=sa;pwd=sa;database=gis_data"; protected void Page_Load(object sender, EventArgs e) { if (Request.QueryString["MapGUID"] == null || Request.QueryString["MapGUID"] == "") { Response.Write("创建失败"); return; } string MapName = Request.QueryString["MapGUID"]; if (isExistService(MapName)) { Response.Write("创建成功"); return; } if (isExistMxd(MxdPah, MapName)) { string MxdFullPath = MxdPah + "//" + MapName + ".mxd"; CreateServices(MxdFullPath, MapName); Response.Write("创建成功"); return; } else { if (CreateMxd(MxdPah, MapName)) { string MxdFullPath = MxdPah + "//" + MapName + ".mxd"; CreateServices(MxdFullPath, MapName); Response.Write("创建成功"); return; } } } private DataTable GetMapLayersList(string MapGUID) { DataSet pDs = SqlHelper.ExecuteDataset(connectionString, CommandType.Text, "select * from LayerInfo where MapID='"+MapGUID+"'"); DataTable dt = pDs.Tables[0]; return dt; } #region 创建服务、地图文档以及服务上下文 #region 创建地图服务 private bool CreateServices(string MapPath, string ServerName) { IGISServerConnection pGISServerConnection; pGISServerConnection = new GISServerConnectionClass(); pGISServerConnection.Connect(HostName); IServerObjectAdmin pServerObjectAdmin; pServerObjectAdmin = pGISServerConnection.ServerObjectAdmin; IServerObjectConfiguration2 configuration = (IServerObjectConfiguration2)pServerObjectAdmin.CreateConfiguration(); configuration.Name = ServerName;//发布Service的名称,必填 configuration.TypeName = "MapServer";//发布服务的类型,如:MapServer,GeocodeServer IPropertySet props = configuration.Properties; props.SetProperty("FilePath", MapPath);//设置MXD的路径 #region 一下的property并非必须,只要一个filepath就可以发布 props.SetProperty("OutputDir", "c://arcgisserver//arcgisoutput");//图片的输出目录 props.SetProperty("VirtualOutPutDir", "http://zhangye/arcgisoutput");//图片输出的虚拟路径 props.SetProperty("SupportedImageReturnTypes", "URL");//支持的图片类型 props.SetProperty("MaxImageHeight", "2048");//图片的最大高度 props.SetProperty("MaxRecordCount", "500");//返回记录的最大条数 props.SetProperty("MaxBufferCount", "100");//缓冲区分析的最大数目 props.SetProperty("MaxImageWidth", "2048");//图片的最大宽度 props.SetProperty("IsCached", "false");//是否切片 props.SetProperty("CacheOnDemand", "false");//是否主动切片 props.SetProperty("IgnoreCache", "false");//是否忽略切片 props.SetProperty("ClientCachingAllowed", "true");//是否允许客户端缓冲 props.SetProperty("CacheDir", "c://arcgisserver//arcgiscache//NewService");//切片的输出路径 props.SetProperty("SOMCacheDir", "c://arcgisserver//arcgiscache");//som的切片输出路径 //configuration.Description = "NewService";//Service的描述 configuration.IsolationLevel = esriServerIsolationLevel.esriServerIsolationHigh;//或者esriServerIsolationLow,esriServerIsolationAny configuration.IsPooled = true;//是否池化 configuration.MaxInstances = 2;//最多的实例数 configuration.MinInstances = 1;//最少的实例数 ////设置刷新 IPropertySet recycleProp = configuration.RecycleProperties; recycleProp.SetProperty("StartTime", "00:00");//刷新开始时间 recycleProp.SetProperty("Interval", "3600");//刷新间隔 ////设置是否开启REST服务 IPropertySet infoProp = configuration.Info; infoProp.SetProperty("WebEnabled", "true");//是否提供REST服务 infoProp.SetProperty("WebCapabilities", "Map,Query,Data");//提供何种服务 //configuration.StartupType = esriStartupType.esriSTAutomatic;//或者esriSTManual //configuration.UsageTimeout = 120;//客户端占用一个服务的最长时间 //configuration.WaitTimeout = 120;//客户端申请一个服务的最长等待时间 #endregion //添加服务到Server pServerObjectAdmin.AddConfiguration(configuration); //启动服务 pServerObjectAdmin.StartConfiguration(ServerName, "MapServer"); return true; } #endregion private bool CreateMxd(string MxdPath, string MxdName) { IMapDocument pMapDocument = CreateObject("esriCarto.MapDocument") as IMapDocument; if (MxdPath.Substring(MxdPath.Length - 1) != @"/") MxdPath += @"/"; pMapDocument.New(MxdPath + MxdName + ".mxd"); AddLayerToMxd(pMapDocument, MxdName); if (pMapDocument == null) return false; if (pMapDocument.get_IsReadOnly(MxdPath + MxdName + ".mxd") == true) { return false; } pMapDocument.Save(true, false); return true; } private bool AddLayerToMxd(IMapDocument pMapDocument,string MapGUID) { DataTable dt = GetMapLayersList(MapGUID); IMap pMap = pMapDocument.get_Map(0); IMapLayers mapLayer = pMap as IMapLayers; mapLayer.ClearLayers(); for (int i = 0; i < dt.Rows.Count; i++) { DataRow dr = dt.Rows[i]; if ((int)dr["LayerType"] == 1) { IRasterDataset pRDataSet = GetRasterRasterDataset(dr["LayerStoreName"].ToString()); IRasterLayer pRLayer = CreateObject("esriCarto.RasterLayer") as IRasterLayer; pRLayer.CreateFromDataset(pRDataSet); RanderRaster(pRLayer); mapLayer.AddLayer(pRLayer as ILayer); } else { IFeatureClass pFeatureClass = GetFeatureClass(dr["LayerStoreName"].ToString()); IFeatureLayer pFLayer = CreateObject("esriCarto.FeatureLayer") as IFeatureLayer; pFLayer.FeatureClass = pFeatureClass; IGeoFeatureLayer pGeoFeatureLayer = (IGeoFeatureLayer)pFLayer; pGeoFeatureLayer.AnnotationProperties.Clear(); //IAnnotateLayerPropertiesCollection pAnnoLayerPropsColl = CreateObject("esriCarto.AnnotateLayerPropertiesCollection"); IAnnotateLayerPropertiesCollection pAnnoLayerPropsColl = pGeoFeatureLayer.AnnotationProperties; ILabelEngineLayerProperties pLabelEngine = CreateObject("esriCarto.LabelEngineLayerProperties") as ILabelEngineLayerProperties; pLabelEngine.Expression = "[CONTOUR]"; ITextSymbol pSym = CreateObject("esriDisplay.TextSymbol") as ITextSymbol; pSym.Color = GetRGBColor(0, 200, 200); pSym.Size = 12; pLabelEngine.Symbol = pSym; IAnnotateLayerProperties pAnnoLayerProps = (IAnnotateLayerProperties)pLabelEngine; pAnnoLayerPropsColl.Add(pAnnoLayerProps); pGeoFeatureLayer.DisplayAnnotation = true; mapLayer.AddLayer(pFLayer as ILayer); } } IMxdContents pMxdC = pMap as IMxdContents; pMapDocument.ReplaceContents(pMxdC); return true; } private IColor GetRGBColor(int R, int G, int B) { IColor pColor = CreateObject("esriDisplay.RgbColor") as IColor; pColor.RGB = B * 65536 + G * 256 + R; return pColor; } #region 栅格图层渲染 private void RanderRaster(IRasterLayer pNewLayer) { IRasterBandCollection pNewCol = (IRasterBandCollection)pNewLayer.Raster; IRasterBand pNewBand = pNewCol.Item(0); pNewBand.ComputeStatsAndHist(); IRasterStretchColorRampRenderer pSRender =CreateObject("esriCarto.RasterStretchColorRampRenderer") as IRasterStretchColorRampRenderer; IRasterRenderer pRender = (IRasterRenderer)pSRender; pRender.Raster = pNewLayer.Raster; pRender.Update(); IMultiPartColorRamp mpcr =CreateObject("esriDisplay.MultiPartColorRamp") as IMultiPartColorRamp; IAlgorithmicColorRamp Alg1 =CreateObject("esriDisplay.AlgorithmicColorRamp") as IAlgorithmicColorRamp; IAlgorithmicColorRamp Alg2 =CreateObject("esriDisplay.AlgorithmicColorRamp") as IAlgorithmicColorRamp; IRgbColor c1 =CreateObject("esriDisplay.RgbColor") as IRgbColor; IRgbColor c2 =CreateObject("esriDisplay.RgbColor") as IRgbColor; IRgbColor c3 =CreateObject("esriDisplay.RgbColor") as IRgbColor; c3.Red = 255; c3.Green = 150; c3.Blue = 150; c2.Red = 255; c2.Green = 255; c2.Blue = 150; c1.Red = 150; c1.Green = 255; c1.Blue = 255; Alg1.FromColor = c1; Alg1.ToColor = c2; Alg2.FromColor = c2; Alg2.ToColor = c3; mpcr.AddRamp(Alg1); mpcr.AddRamp(Alg2); mpcr.Size = 255; bool IsOk; mpcr.CreateRamp(out IsOk); pSRender.ColorRamp = mpcr; pNewLayer.Renderer = pRender; } #endregion private IServerContext CreateServerContext(string ServerName, string UserName, string PassWord) { ESRI.ArcGIS.ADF.Identity identity = new ESRI.ArcGIS.ADF.Identity(UserName, PassWord, ""); ESRI.ArcGIS.ADF.Connection.AGS.AGSServerConnection agsConnection = new ESRI.ArcGIS.ADF.Connection.AGS.AGSServerConnection(ServerName, identity); agsConnection.Connect(); if (agsConnection.IsConnected) { try { IServerObjectManager som = agsConnection.ServerObjectManager; IServerContext pServerContext = som.CreateServerContext("zys", "MapServer"); return pServerContext; } catch (Exception e) { return null; } } return null; } #region ServerContext CreateObject函数 private object CreateObject(string ObjectCLSID) { IServerContext pServerContext = CreateServerContext(HostName,MapServerUserName,MapserverPass); if (pServerContext == null) return null; try { return pServerContext.CreateObject(ObjectCLSID); } catch { return null; } finally { pServerContext.ReleaseContext(); } } #endregion #endregion #region 判断服务、文档是否存在 /// <summary> /// 判断是否存在该服务 /// </summary> /// <param name="serviceName"></param> /// <returns></returns> private bool isExistService(string serviceName) { ServerConnection pServerConnection = new ESRI.ArcGIS.Server.WebControls.ServerConnection(HostName);//地图服务机器名 pServerConnection.Connect(); IServerObjectAdmin pServerSOA = pServerConnection.ServerObjectAdmin; try { IServerObjectConfiguration pConfig = pServerSOA.GetConfiguration(serviceName, "MapServer"); return true; } catch (Exception e) { return false; } } private bool isExistMxd(string MxdPath, string MapName) { if (MxdPath.Substring(MxdPath.Length - 1) != @"/") MxdPath += @"/"; if (File.Exists(MxdPath + MapName + ".mxd")) { return true; } return false; } #endregion #region SDE连接以及数据获取 string SDEServer = "gisserver"; string Instance = "5151"; string DataBase = "gis_data"; string SDEUser = "sde"; string PassWord = "sde"; private IPropertySet GetProPerty() { IPropertySet propertySet = (IPropertySet)CreateObject("esriSystem.PropertySet"); propertySet.SetProperty("SERVER", SDEServer); propertySet.SetProperty("INSTANCE", Instance); propertySet.SetProperty("DATABASE", DataBase); propertySet.SetProperty("USER", SDEUser); propertySet.SetProperty("PASSWORD", PassWord); propertySet.SetProperty("VERSION", "sde.DEFAULT"); return propertySet; } private IWorkspace OpenSDEWorkSpace(IPropertySet pPropSet) { IWorkspace pWorkSpace = null; IWorkspaceFactory pSdeFact = (IWorkspaceFactory)CreateObject("esriDataSourcesGDB.SdeWorkspaceFactory"); try { pWorkSpace = pSdeFact.Open(pPropSet, 0); } catch (Exception e) { } return pWorkSpace; } private IRasterWorkspaceEx OpenSdeRasterWsp() { try { IPropertySet pProPerty = GetProPerty(); IRasterWorkspaceEx pRasterWsp = OpenSDEWorkSpace(pProPerty) as IRasterWorkspaceEx; return pRasterWsp; } catch (Exception e) { return null; } } private IFeatureWorkspace OpenSdeFeatureWsp() { try { IPropertySet pProPerty = GetProPerty(); IFeatureWorkspace pRasterWsp = OpenSDEWorkSpace(pProPerty) as IFeatureWorkspace; return pRasterWsp; } catch (Exception e) { return null; } } private IRasterDataset GetRasterRasterDataset(string RasterName) { IRasterWorkspaceEx pRasterWspEx = OpenSdeRasterWsp(); if (pRasterWspEx == null) return null; IRasterDataset pRasterDataset=pRasterWspEx.OpenRasterDataset(RasterName); return pRasterDataset; } private IFeatureClass GetFeatureClass(string FeatureName) { IFeatureWorkspace pFeatureWspEx = OpenSdeFeatureWsp(); if (pFeatureWspEx == null) return null; IFeatureClass pFeatureClass = pFeatureWspEx.OpenFeatureClass(FeatureName); return pFeatureClass; } #endregion }
相关文章推荐
- arcgis server 动态创建地图服务
- ArcGIS Server创建缓存地图服务教程
- ArcGIS Server创建缓存地图服务教程
- (一)ArcGIS Server之发布动态地图服务
- ArcGIS Server代码动态创建发布服务(MapServer,ImageServer)
- (转载)动态创建地图文档MXD并发布地图服务
- 动态创建地图文档MXD并发布地图服务
- 利用AGS ADF动态创建地图服务时遇到的问题
- ArcGIS Server管理工具之批量发布动态地图服务工具.md
- ArcGIS Server代码动态创建发布服务(MapServer,ImageServer)
- Arcgis server发布电子地图(3):调用动态地图服务本机实践/打卡
- ArcGIS Server-发布结果地图服务
- [置顶] arcgis server10.2.2发布MXD地图基础服务的具体步骤
- ArcGIS Server 10:发布缓存的地图服务
- 手机调用ArcGIS Server发布的Rest地图服务不显示问题
- ArcGIS Server发布地图服务学习教程
- 创建线程消息循环服务于动态连接库
- ArcGIS Server发布移动地图服务(mobile data access)时的问题
- 海量图层管理的新希望——ArcGIS Server 动态图层服务
- ArcEngine连接Arcgis Server地图服务之查询