arcgis server 9.2代码阅读笔记二:在页面上动态加载图层

代码来源 ARCGIS 9.2例子

// Copyright 2006 ESRI
//
// All rights reserved under the copyright laws of the United States
// and applicable international laws, treaties, and conventions.
//
// You may freely redistribute and use this sample code, with or
// without modification, provided you include the original copyright
// notice and use restrictions.
// AUTHER:糊涂虫 2007.9.20
// See use restrictions at /arcgis/developerkit/userestrictions.

using System;
using System.Data;
using System.Configuration;
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;
using ESRI.ArcGIS.Utility;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Display;

public partial class _Default : System.Web.UI.Page
{
    //创建数据表,用于数据绑定
    DataTable layertable;

    protected void Page_Init(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            layertable = new DataTable("layertable");
            DataColumn dc1 = new DataColumn("layername");
            DataColumn dc2 = new DataColumn("layerpath");
            layertable.Columns.Add(dc1);
            layertable.Columns.Add(dc2);
            //读取文件(是一些基本功能)
            String rootPath = Server.MapPath("~");

            System.IO.StreamReader sr = new System.IO.StreamReader(rootPath + "/layers.catalog");
            string delimStr = "=";
            char[] delimiter = delimStr.ToCharArray();
            string[] readparts = null;
            string readstring = null;

            while (sr.Peek() != -1)
            {
                readstring = sr.ReadLine();
                if (!readstring.Contains("="))
                    break;

                readparts = readstring.Split(delimiter);
                DataRow dr = layertable.NewRow();
                dr[0] = readparts[0];
                dr[1] = readparts[1];
                layertable.Rows.Add(dr);
            }
            sr.Close();
        }
    }

    protected void Page_PreRender(object sender, EventArgs e)
    {
        //数据绑定
        DropDownList1.DataSource = layertable;
        DropDownList1.DataTextField = "layername";
        DropDownList1.DataValueField = "layerpath";
        DropDownList1.DataBind();

        if (!Page.IsPostBack)
        {
            if (Session.IsNewSession)
            {
                Session.Add("addedlayers", false);
                Session.Add("addedlayersid", null);
                //创建server上下文
                IServerContext mapContext = this.getServerContext();
                //使用server上下文来定义地图服务
                IMapServer mapServer = mapContext.ServerObject as IMapServer;
                //获得地图服务信息
                IMapServerInfo mapInfo = mapServer.GetServerInfo(mapServer.DefaultMapName);
                //获得地图描述信息
                IMapDescription mapDesc = mapInfo.DefaultMapDescription;
                //放到session中去
                SetSessionMapDescription(mapContext, mapDesc);
                //创建地图
                CreateMapImage(mapContext, mapDesc);
                //释放调server上下文
                mapContext.ReleaseContext();

            }
            else
            {
                IServerContext mapContext = this.getServerContext();
                mapContext = this.getServerContext();

                IMapDescription mapDesc = GetSessionMapDescription(mapContext);
                UpdateDataLayers(mapContext);

                CreateMapImage(mapContext, mapDesc);

                RemoveLayers(mapContext);
                mapContext.ReleaseContext();
            }
        }
        else
        {
            //if a postback, do something here during load
        }
    }

//添加图层
    private void AddTheLayers(IServerContext in_mapcontext)
    {
        IMapServer ms = (IMapServer)in_mapcontext.ServerObject;

        IMapServerObjects2 mso = (IMapServerObjects2)ms;
        string mapname = ms.DefaultMapName;
        IMap map = mso.get_Map(mapname);
        //创建一个新的图层,和它想类似的还有IFeatureClass
        IFeatureLayer layer = (IFeatureLayer)in_mapcontext.CreateObject("esriCarto.FeatureLayer");
        //IFeatureLayer layer = (IFeatureLayer)in_mapcontext.CreateObject("{E663A651-8AAD-11D0-BEC7-00805F7C4268}");
        //创建一个用于打开和创建工作空间的一个工厂接口类
        //IFeatureLayer IFeatureClass IWorkspaceFactory 在AE中都有,他们用于打开和操作数据空间
        IWorkspaceFactory factory = (IWorkspaceFactory)in_mapcontext.CreateObject("esriDataSourcesFile.ShapefileWorkspaceFactory");

        ListItem listitem = DropDownList1.SelectedItem;
        int lastslash = listitem.Value.LastIndexOf("/");
        string filepath = listitem.Value.Substring(0, lastslash);
        string filename = listitem.Value.Substring(lastslash + 1);

        IWorkspace ws = factory.OpenFromFile(filepath, 0);
        IFeatureWorkspace fws = (IFeatureWorkspace)ws;
        layer.FeatureClass = fws.OpenFeatureClass(filename);
        layer.Name = listitem.Text;
        //IGeoFeatureLayer是由IFeatureLayer继承而来,IFeatureLayer是由ILayer继承而来,IGeoFeatureLayer比IFeatureLayer多了标注方面的东西
        IGeoFeatureLayer iglayer = (IGeoFeatureLayer)layer;
        //IFeatureRenderer中定义了一个叫做Draw的方法,其实ArcObjects中各种各样的渲染效果就是通过这个Draw方法画出来 的,因为各个渲染效果都实现了IFeatureRenderer接口。所以要实现"GroupRenderer"效果,只要实现了 IFeatureRenderer接口就可以了。
        IFeatureRenderer renderer = iglayer.Renderer;
        //创建简单渲染
        ISimpleRenderer isr = (ISimpleRenderer)renderer;
        IRgbColor irgbc = (IRgbColor)in_mapcontext.CreateObject("esriDisplay.RgbColor");
        irgbc.Red = 0;
        irgbc.Green = 0;
        irgbc.Blue = 210;
        //获得类别,各自进行设置。这里比较奇怪的是创建的ifs并没有被添加到图层中去,不是很明白,请教各位。
        ESRI.ArcGIS.Geometry.esriGeometryType featype = layer.FeatureClass.ShapeType;
        if (featype == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint)
        {
            ISimpleMarkerSymbol ifs = (ISimpleMarkerSymbol)isr.Symbol;
            ifs.Color = (IColor)irgbc;
        }
        else if (featype == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline)
        {
            ISimpleLineSymbol ifs = (ISimpleLineSymbol)isr.Symbol;
            ifs.Color = (IColor)irgbc;
        }
        else if (featype == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon)
        {
            ISimpleFillSymbol ifs = (ISimpleFillSymbol)isr.Symbol;
            ifs.Color = (IColor)irgbc;
        }
        else
        {
            throw new Exception("No renderer or symbol selected.  Shape type undetermined.");
        }
        //增加图层
        map.AddLayer(layer);
        mso.RefreshServerObjects();

        Session["addedlayersid"] = mso.get_LayerID(mapname, layer);
    }

    private void CreateMapImage(IServerContext mapContext, IMapDescription md)
    {
        //分别创建图像类别 图像描述 图像显示
        IImageType imageType;
        IImageDescription imageDesc;
        IImageDisplay imageDisp;

        imageType = mapContext.CreateObject("esriCarto.ImageType") as IImageType;
        imageDesc = mapContext.CreateObject("esriCarto.ImageDescription") as ImageDescription;
        imageDisp = mapContext.CreateObject("esriCarto.ImageDisplay") as ImageDisplay;
       
        imageType.Format = esriImageFormat.esriImageJPG;
        imageType.ReturnType = esriImageReturnType.esriImageReturnURL;

        imageDisp.Height = (int)imgOutput.Height.Value;
        imageDisp.Width = (int)imgOutput.Width.Value;
        imageDisp.DeviceResolution = 96;

        imageDesc.Display = imageDisp;
        imageDesc.Type = imageType;
        //创建地图服务
        IMapServer mapServer = (IMapServer)mapContext.ServerObject;

        IImageResult mapImage = mapServer.ExportMapImage(md, imageDesc);
        imgOutput.ImageUrl = mapImage.URL;
        imgOutput.Visible = true;

    }
    //创建session
    private void SetSessionMapDescription(IServerContext in_mapcontext, IMapDescription in_mapdesc)
    {
        string md = in_mapcontext.SaveObject(in_mapdesc);
        Session.Add("md", md);
    }
    //获得session
    private IMapDescription GetSessionMapDescription(IServerContext in_mapcontext)
    {
        string stringDesc = Session["md"] as string;
        IMapDescription mapDesc = null;

        if (stringDesc == null)
        {
            IMapServer mapServer = in_mapcontext.ServerObject as IMapServer;
            IMapServerInfo mapInfo = mapServer.GetServerInfo(mapServer.DefaultMapName);
            mapDesc = mapInfo.DefaultMapDescription;
        }
        else
        {
            mapDesc = in_mapcontext.LoadObject(stringDesc) as IMapDescription;
        }

        return mapDesc;
    }
    //创建server上下文,在这个上下文中,运用IServerObjectManager对象管理其生命周期
    private IServerContext getServerContext()
    {
        string servername = "localhost";
        string mapserverobject = "USA_data";
        IServerObjectManager serverManager;

        if (Session["SOM"] == null)
        {
            // *** Using Web ADF Common API
            ESRI.ArcGIS.ADF.Connection.AGS.AGSServerConnection gisconnection = new ESRI.ArcGIS.ADF.Connection.AGS.AGSServerConnection();
            gisconnection.Host = servername;
            gisconnection.Connect();

            serverManager = gisconnection.ServerObjectManager;
            Session.Add("SOM", serverManager);

        }
        else
        {
            serverManager = Session["SOM"] as IServerObjectManager;
        }

        // *** Change the map server object name as needed
        IServerContext mapContext = serverManager.CreateServerContext(mapserverobject, "MapServer");

        return mapContext;

    }

    private void RemoveLayers(IServerContext in_mapcontext)
    {
        //判断是否添加了图层
        bool tf = (bool)Session["addedlayers"];

        if (tf)
        {
            IMapServer ms = (IMapServer)in_mapcontext.ServerObject;

            IMapServerObjects mso = (IMapServerObjects)ms;

            IMap map = mso.get_Map(ms.DefaultMapName);
            //通过地图服务获得图层
            ILayer layer = map.get_Layer(0);

            map.DeleteLayer(layer);
            mso.RefreshServerObjects();
        }
    }

    private void UpdateDataLayers(IServerContext mapContext)
    {
        bool tf = (bool)Session["addedlayers"];

        if (tf)
        {
            AddTheLayers(mapContext);

            // Update dynamic data id, after initial addition of dynamic layer
            IMapDescription mapDesc = GetSessionMapDescription(mapContext);
            ILayerDescription newLayerDesc = mapDesc.LayerDescriptions.get_Element(0);
            newLayerDesc.ID = (int)Session["addedlayersid"];
            SetSessionMapDescription(mapContext, mapDesc);
        }
    }

    protected void btnAddLayer_Click(object sender, EventArgs e)
    {
        Session.Add("addedlayers", true);

        IServerContext mapContext = this.getServerContext();

        UpdateDataLayers(mapContext);

        IMapServer ms = (IMapServer)mapContext.ServerObject;

        IMapServerInfo mapInfo = ms.GetServerInfo(ms.DefaultMapName);

        IMapDescription NEWmapDesc = mapInfo.DefaultMapDescription;

        CreateMapImage(mapContext, NEWmapDesc);

        SetSessionMapDescription(mapContext, NEWmapDesc);

        RemoveLayers(mapContext);

        mapContext.ReleaseContext();

    }

    protected void btnRefresh_Click(object sender, EventArgs e)
    {

        IServerContext mapContext = this.getServerContext();
        UpdateDataLayers(mapContext);

        /*  Test to see actual id of dynamic layer, compare with MapDescription stored in session (also used to generate map image).
         *
        IMapServer ms = (IMapServer)mapContext.ServerObject;           
        IMapServerInfo mapInfo = ms.GetServerInfo(ms.DefaultMapName);           
        IMapDescription NEWmapDesc = mapInfo.DefaultMapDescription;           
        ILayerDescription NEWLayerDesc = NEWmapDesc.LayerDescriptions.get_Element(0);           
        */

        IMapDescription mapDesc = GetSessionMapDescription(mapContext);
        IMapArea mapArea = mapDesc.MapArea;
        //创建IMapExtent  用于描述地图的范围.放大缩小地图
        IMapExtent mapExtent = mapArea as IMapExtent;
        //创建IEnvelope,用来确定一个空间范围,可以做空间查询
        IEnvelope env = (IEnvelope)mapContext.CreateObject("esriGeometry.Envelope");
        env.PutCoords(-120, 30, -50, 50);

        mapExtent.Extent = env;

        CreateMapImage(mapContext, mapDesc);

        SetSessionMapDescription(mapContext, mapDesc);

        RemoveLayers(mapContext);

        mapContext.ReleaseContext();
    }
}

转载于:https://www.cnblogs.com/j3eee/archive/2009/02/23/1396522.html

ArcGIS地图包制作全攻略:多图层无损分享与协作 在地理信息系统(GIS)的数据管理与协作中,确保地图成果的完整性与可复现性是核心挑战。其原理在于将地图文档、图层数据、符号样式及坐标系等所有依赖项封装为一个自包含的归档文件,从根本上解决了因数据路径丢失、符号库缺失或环境差异导致的地图显示错乱问题。这一技术极大地提升了团队协作效率与数据交付的可靠性,其价值在于实现了地图“上下文”的固化与无损迁移。典型的应用场景包括项目成果交付、野外调查底图分发、标准化制图模板共享以及阶段性成果归档。本文聚焦于ArcGIS中的地图包(Map Package)功能,详细解析了如 阅读详情

相关推荐

关于ArcGIS Server分块切片的一些想法

引子 之前一直接到很多客户关于分块切图之后导入切片的问题,比较典型的情况是:客户想要对大范围的影像切图,但由于各种原因希望能分块进行切图后再合并在一起。基于这个需求,本文从切片和切片存储机制角度出发,为如何分块提出建议,同时提供一种可能的方案以期达到分块切图再合并的需求。 首先,我们需要了解ArcGIS的切图机制和使用bundle这种紧凑型存储切片的机制。以下内容是作者根据菩提老王的一篇旧文中...

notxyz的博客 1641

基于C#的ArcEngine二次开发教程(09):矢量图层点线面的渲染原理及代码实现

总结了利用AE进行矢量数据要素渲染的接口和类之间的关系及用法,在此基础上,给出矢量图层点线面渲染的具体实现源码

m1m2m3mmm的博客 5364

【ArcGIS微课1000例】0068:ArcGIS加载world imagery高清卫星影像教程

本文介绍了如何在ArcGIS中加载World Imagery高清卫星影像作为谷歌影像的替代方案。通过添加ArcGIS Server并输入在线图集URL(https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer),即可连接并预览包含中国影像、青海湖、东方明珠等全球高清卫星图。该教程提供了详细的操作步骤图示,帮助用户快速获取优质底图数据,适用于地理信息分析和可视化应用。

智慧空间实验室 5420

AE二次开发中,过滤后的图层,实现缩放至图层效果

//featureClass是自己获取的featureClass,也可是sde中获取的。 public void FilterAndZoomToLayer(IFeatureClass featureClass) { IFeatureLayer featureLayer = ne...

weixin_33873846的博客 392

硬件原理图:从软件思维到硬件接口的嵌入式开发破局指南

本文为软件开发者提供了读懂硬件原理图的嵌入式开发破局指南。文章将硬件原理图类比为“硬件系统的架构图”,引导读者将软件API调用思维迁移到硬件接口理解上,详细解析了电阻、电容、二极管等常见元器件的“硬件API”功能与选型逻辑,并通过实战电路拆解,阐述了从原理图分析到驱动代码编写的完整思维链条,帮助开发者建立软硬件协同的系统级视角。

lg888的博客 497

得到IServerContext的两种方法

1、通过当前Resorces得到 CodeUIComponentform=facesContext.getViewRoot().findComponent((String)paramMap.get("formId"));if(form==null){ret...

weixin_33720452的博客 285

RK3588零拷贝视频流水线实战:用GStreamer+Mpp实现8K硬解与DRM显示

本文深入探讨了在RK3588平台上构建零拷贝视频流水线的工程实践。通过结合GStreamer与MPP,实现了从8K视频硬解到DRM显示的全流程硬件加速,有效解决了高分辨率视频处理中的DDR带宽瓶颈问题。文章详细解析了dma-buf数据流机制、管道构建与性能优化策略,为多路视频并发处理提供了高效的系统架构解决方案。

github5actions的博客 1169

ArcEngine序列化IFeatureRenderer对象

1 OpenFileDialog openFileDialog1 = new OpenFileDialog(); 2 openFileDialog1.Filter = "lyr文件(*.lyr)|*.lyr"; 3 openFileDialog1.InitialDirectory = @"d:\data"; 4 ...

weixin_34341229的博客 249

Holtek BS45F3833芯片深度剖析:如何用高集成MCU重塑超声波雾化市场格局?

本文深度剖析Holtek BS45F3833芯片如何通过高集成MCU技术重塑超声波雾化市场。该芯片集成了PWM直驱、电容检水、触摸控制等核心功能,显著提升雾化精度和效率,同时降低BOM成本和开发难度。文章通过实测数据和实战案例,展示了其在香薰机、车载设备及工业加湿器等场景的创新应用,为开发者提供了一站式解决方案。

weixin_29192211的博客 415

理解ADC:为什么需要抗混叠滤波器?

本文介绍 ADC 的混叠现象,引出抗混叠滤波器,并介绍一种开关电容滤波器,它具有很小的增益过渡带。

疯狂的运放 5946

ArcGIS Engine开发教程之图层符号化之Renderer( 渲染)体系

前几天忙着翻译外文文献,有些专业术语总觉得翻译欠妥。查阅资料后,现在总结一下。 ------------------------------- ArcGIS Engine9.3对GIS数据的符号化分为矢量数据渲染和栅格数据渲染两大类。 接下来分别介绍FeatureRender和RasterRender。 1.FeatureRender对象     FeatureRenderer是一个

Yoko优 5858

LWIP协议栈在STM32H7上的内存优化实战:如何用32KB RAM实现稳定千兆以太网通信

本文深入探讨了在STM32H7微控制器上,如何通过内存优化策略,在仅32KB的D2 SRAM中稳定运行LWIP协议栈以实现千兆以太网通信。文章详细分析了STM32H7的内存架构、LWIP的内存消耗瓶颈,并提供了从描述符表与PBUF池精确分配、链接脚本修改到MPU区域划分的一整套实战优化方案,旨在解决大数据量传输卡死等常见配置问题。

gg901的博客 605

arcgis server 9.2代码阅读笔记一:在图层中增加一个点

 代码来源 ARCGIS 9.2例子  // Copyright 2006 ESRI // // All rights reserved under the copyright laws of the United States // and applicable international laws, treaties, and conventions. // /

樱木柯南 710

【YOLOv11改进[Backbone]】 使用Ghostnetv2替换Backbone

使用Ghostnetv2替换Backbone

静谧、淡雅 520

电机控制基础,小白入门篇

电机,这个藏在风扇、电动车、机器人里的“动力心脏”,如何精准控制它的转速、方向甚至力量?这篇博客专为完全零基础的小白打造,用“说人话”的方式拆解电机控制的底层逻辑,帮你从“看不懂电路图”到“能调个简单电机”。 电机控制不是“大神专属”,只要掌握“电生磁、磁生力”的底层逻辑,加上动手实践,小白也能快速入门。这篇博客会陪你从“看电机转”到“让电机听话”,把复杂的控制原理变成能上手玩的“小实验”。准备好你的面包板和电机,我们一起开启“电控之旅”吧!

汽车电子软件领域知识分享 5621

ArcGIS Server10.2 第一步

ArcGIS Server10.2 第一步* 今天终于成功安装了ArcGIS Server10.2,并完成了server的注册,在这里分享一下心得。 一、遇到的困难 本来用的是正版win7系统(这辈子第一次用正版系统),安装了ArcGIS10.0,然后装了ArcGIS Server10.0,但是看网上和各种教程基本都是10.2的版本了,最重要的是我没有10.0的授权(其实可以有,傻乎乎的没注意到,...

weixin_44733565的博客 683

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【arcgis】Arcgis Server http与https的问题

今日由于要给旧系统发布新服务,在服务器上10.5的Arcgis Server正常操作发布了一个服务,结果发现出现问题,有https的请求不支持。 但是直接将原网址改成http是不能访问服务的(404) 于是赶紧请教度娘,搜索解决方案: 看到一篇《安装了10.5的Arcgis Server,发现站点默认目录为https,请问下怎杨才能改成http》 原文:http://zhihu.esric............

灵境引路人 4894

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

arcgis server 及 desktop安装

一、安装arcgis server 10.2步骤 1.1安装.net framework 3.5 本软件需要.net framework 3.5 支持 直接在server 2008里安装会提示必须使用角色管理工具 安装或配置microsoft.net framework 3.5 sp1 . 可以用server 2008中的服务器管理器安装 打开“服务器管理器” ,在“功能”选项中选...

weixin_30919429的博客 725

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

ArcGIS Server 10:发布网络分析服务

创建地图文档 网络分析服务需要一项包含一个或者多个网络分析图层的地图服务。这意味着发布到 ArcGIS Server 的地图文档必须包含一个或者多个通过 Network Analyst 工具条中的工具创建的网络分析图层。目前,网络分析服务支持路径分析图层、最近设施点分析图层以及服务区分析图层。 要创建可以执行所有这三类网络分析的单个地图文档,请遵循以下步骤: 步骤:...

370

ArcGIS Server静默安装

工具:ArcGIS 10.2+centos 6.5+VMware-workstation 11.0 1.静默安装的好处 若机器环境不符合安装条件,系统会提示详细错误信息,而不会继续安装; 安装效率高,设置好安装参数后全自动安装; 安装过程中若有错误会提示详细的错误日志和错误信息,方便发现问题。 静默安装不需要图形化界面; 2.安装环境搭建 添加ip和主机名映射 查看主机ip地址 查看机器名:vi /etc/sysconfig/network 编辑/etc/hosts文件,在打开的.

m0_37770700的博客 432

qgis打开shp数据_QGIS如何打开ArcGIS Feature Server

在国内,目前很多信息化系统建设的时候采用的还是国外的ARCGIS系列的产品,有些数据对外共享的时候发布的服务也是ARCGIS的服务,在QGIS软件中目前支持ArcGIS Map Server服务和ArcGIS Feature Server,一般遥感底图这类如果是使用ARCGIS发布的服务,我们大概率只能在线连接使用ArcGIS Map Server服务,但对于某些矢量数据,我们其实是可以...

weixin_34101914的博客 2993
上一篇: 如何计算两点距离?
下一篇: 地图分幅算法实现
developer2016
博客等级 码龄10年 2粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值