Arcgis 符号库中图形到Grid控件的加载

2024-01-05 23:08

本文主要是介绍Arcgis 符号库中图形到Grid控件的加载,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

///调用方法
private void gridView1_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e)
        {
            // 如果是符号样式列
            if (e.Column.Equals(colSTYLEIMAGE))
            {
                string strStyleCode = e.DisplayText;
                Rectangle r = e.Bounds;
                if (GISOpr.getInstance().AllStyleList.Contains(strStyleCode))
                {
                    ISymbol symbol = GISOpr.getInstance().AllStyleList[strStyleCode] as ISymbol;
                    if (symbol != null)
                    {
                        Image image = GISGlobal.SymbolToBitmp(symbol, r.Width, r.Height, 1);
                        e.Graphics.DrawImageUnscaled(image, r);
                        e.Handled = true;
                    }
                }
            }
        }
/// <summary>
        /// 全局初始化方法:
        ///     初始化数据库连接
        ///     初始化Nhibernate环境
        ///     加载Nhibernate类库及映射文件
        ///     同时获取初始化系统参数
        /// 该方法在所有方法之前调用
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        public bool GlobalInit(ZUser user)
        {
            bool bresult = false;
            DBCore db = new DBCore(true);

            // 设置当前用户
            currUser = user;

            try
            {
                paramList = db.GetAll(typeof(Tbsysparams), "Paramid");
                foreach (Tbsysparams param in paramList)
                {
                    if (param.Paramenname.ToUpper() == "SDESERVER")
                        m_sServer = param.Paramvalue;
                    if (param.Paramenname.ToUpper() == "SDEINSTANCE")
                        m_sInstance = param.Paramvalue;
                    if (param.Paramenname.ToUpper() == "SDEVERSION")
                        m_sVersion = param.Paramvalue;
                    if (param.Paramenname.ToUpper() == "SDEUSER")
                        m_sUser = param.Paramvalue;
                    if (param.Paramenname.ToUpper() == "SDEPASSWORD")
                        m_sPassword = param.Paramvalue;
                    if (param.Paramenname.ToUpper() == "GEOOBJFIELDNAME")
                        m_sGeoObjFieldName = param.Paramvalue;
                    if (param.Paramenname.ToUpper() == "SERVERSTYLEFILENAME")
                        m_sRelStyleFileDir = param.Paramvalue;
                }
                bresult = true;
            }
            finally
            {
                db.CloseSession();
                db = null;
            }
            return bresult;
        }
/// <summary>
        /// 全局初始化ArcEngine组件 方法
        /// 与CloseGISLicense方法对应,只需要调用一次
        /// 该方法在OpenGISConn方法之前调用,以保证组件被正常初始化了
        /// </summary>
        /// <param name="err">返回初始化过程中的提示信息</param>
        /// <returns>返回true表示初始成功</returns>
        public bool InitGISLicense(out string err)
        {
            bool bresult = true;
            esriLicenseStatus licenseStatus;
            err = string.Empty;

            this.m_nLicenseSem += 1;

            // 初次初始化
            if (this.m_nLicenseSem == 1 && this.m_pAoInitialize == null)
            {

                // first try copy protection EngineGeoDB
                licenseStatus = this.CheckOutLicenses(esriLicenseProductCode.esriLicenseProductCodeEngineGeoDB);
                if (licenseStatus == esriLicenseStatus.esriLicenseNotLicensed)
                {
                    // next try Desktop Desktop ArcEngine
                    licenseStatus = this.CheckOutLicenses(esriLicenseProductCode.esriLicenseProductCodeArcEditor);

                    if (licenseStatus == esriLicenseStatus.esriLicenseNotLicensed ||
                        licenseStatus == esriLicenseStatus.esriLicenseUnavailable)
                        licenseStatus = this.CheckOutLicenses(esriLicenseProductCode.esriLicenseProductCodeArcInfo);
                }

                if (licenseStatus == esriLicenseStatus.esriLicenseNotLicensed)
                {
                    err = "You are not licensed to run this product";
                    bresult = false;
                }
                else if (licenseStatus == esriLicenseStatus.esriLicenseUnavailable)
                {
                    err = "There are insufient licenses to run";
                    bresult = false;
                }
                else if (licenseStatus == esriLicenseStatus.esriLicenseFailure)
                {
                    err = "Unexpected license failure please contact you administrator";
                    bresult = false;
                }
                else if (licenseStatus == esriLicenseStatus.esriLicenseAlreadyInitialized)
                {
                    err = "You license has already been initialized please check you implementation";
                    bresult = false;
                }
                else if (licenseStatus == esriLicenseStatus.esriLicenseCheckedOut)
                    err = "Licenses checked out successfully";
            }

            return bresult;
        }
/// <summary>
        /// 初始化GIS环境,建立SDE数据连接,为地图加载做准备
        /// </summary>
        /// <returns></returns>
        public bool OpenGISConn()
        {
            Hashtable propList = new Hashtable();
            if (!bconnected)
            {
                try
                {
                    propList.Add("SERVER", m_sServer);
                    propList.Add("INSTANCE", m_sInstance);
                    propList.Add("VERSION", m_sVersion);
                    propList.Add("USER", m_sUser);
                    propList.Add("PASSWORD", m_sPassword);

                    ws = this.GetWorkspace(propList, "esriDataSourcesGDB.SdeWorkspaceFactory");
                    bconnected = true;
                }
                finally
                {
                    propList = null;
                }
            }

            return bconnected;
        }

        /// <summary>
        /// 加载系统所设置的ServerStyle符号
        /// 并将符号全部保存到当前的HashTable中,Key为地物代码,Value为对应符号的引用
        /// </summary>
        /// <returns></returns>
        public bool LoadServerStyle(string sAppPath)
        {
            // ServerStyle类
            ServerStyleGalleryClass styleFile = null;
            // 导入符号接口
            IStyleGallery pStyleGallery = null;
            // 设置符号文件位置
            IStyleGalleryStorage pStyleStore = null;
            // 符号枚举接口
            IEnumStyleGalleryItem pEnuStyleItem = null;
            // 单个符号对象
            IStyleGalleryItem pStyleItem = null;

            string sFullPath = sAppPath + "//" + m_sRelStyleFileDir;
            string sFileName = string.Empty;


            this.m_nStyleSem += 1;

            if (this.m_nStyleSem==1 && !bStyleLoaded && Directory.Exists(sFullPath))
            {
               
                styleFile = new ServerStyleGalleryClass();
                pStyleGallery = styleFile as IStyleGallery;
                pStyleStore = styleFile as IStyleGalleryStorage;

                string[] fileList = Directory.GetFiles(sFullPath, "*.ServerStyle");
                for (int i = 0; i < fileList.Length; i++)
                {
                    sFileName = fileList[i];
                    // 导入*.ServerStyle符号
                    pStyleGallery.ImportStyle(sFileName);
                    pStyleStore.TargetFile = sFileName;

                    // 枚举所有点符号
                    pEnuStyleItem = pStyleGallery.get_Items("Marker Symbols", sFileName, "");

                    pEnuStyleItem.Reset();
                    pStyleItem = pEnuStyleItem.Next();

                    while (pStyleItem != null)
                    {
                        // 名称,分类都设置为GeObjNum
                        if (!stylesList.Contains(pStyleItem.Name))
                            stylesList.Add(pStyleItem.Name, pStyleItem.Item);

                        pStyleItem = pEnuStyleItem.Next();
                    }

                    // 枚举所有线符号
                    pEnuStyleItem = pStyleGallery.get_Items("Line Symbols", sFileName, "");

                    pEnuStyleItem.Reset();
                    pStyleItem = pEnuStyleItem.Next();

                    while (pStyleItem != null)
                    {
                        // 名称,分类都设置为GeObjNum
                        if (!stylesList.Contains(pStyleItem.Name))
                            stylesList.Add(pStyleItem.Name, pStyleItem.Item);

                        pStyleItem = pEnuStyleItem.Next();
                    }

                    // 枚举所有面符号
                    pEnuStyleItem = pStyleGallery.get_Items("Fill Symbols", sFileName, "");

                    pEnuStyleItem.Reset();
                    pStyleItem = pEnuStyleItem.Next();

                    while (pStyleItem != null)
                    {
                        // 名称,分类都设置为GeObjNum
                        // 将符号的地物代码、及符号放入全局符号列表中
                        if (!stylesList.Contains(pStyleItem.Name))
                            stylesList.Add(pStyleItem.Name, pStyleItem.Item);

                        pStyleItem = pEnuStyleItem.Next();
                    }

                    bStyleLoaded = true;
                }
            }
            return bStyleLoaded;
        }

/// <summary>
        /// 将ISymbol 转换为bitmap对象
        /// </summary>
        /// <param name="pSymbol">符号对象</param>
        /// <param name="iwidth">显示的image宽</param>
        /// <param name="iheight">显示的image高</param>
        /// <param name="lGap">显示的image边距:1或2即可</param>
        /// <returns></returns>
        public static System.Drawing.Bitmap SymbolToBitmp(ESRI.ArcGIS.Display.ISymbol pSymbol, int iwidth, int iheight, int lGap)
        {
            ///根据高宽创建图象
            Bitmap bmp = new Bitmap(iwidth, iheight);
            Graphics gImage = Graphics.FromImage(bmp);//转化成Graphics
            gImage.Clear(Color.White);                //清除底色,设置为白色
            double dpi = gImage.DpiX;                 //

            IEnvelope pEnvelope = new EnvelopeClass();//创建矩形范围
            pEnvelope.PutCoords(0, 0, (double)bmp.Width, (double)bmp.Height);
        //设置边界值
            tagRECT deviceRect;
            deviceRect.left = lGap;
            deviceRect.right = bmp.Width - lGap;
            deviceRect.top = lGap;
            deviceRect.bottom = bmp.Height - lGap;

            IDisplayTransformation pDisplayTransformation = new DisplayTransformationClass();
            pDisplayTransformation.VisibleBounds = pEnvelope;
            pDisplayTransformation.Bounds = pEnvelope;
            pDisplayTransformation.set_DeviceFrame(ref deviceRect);
            pDisplayTransformation.Resolution = dpi;

            IGeometry pGeo = CreateSymShape(pSymbol, pEnvelope);

            System.IntPtr hdc = new IntPtr();
            hdc = gImage.GetHdc();

            pSymbol.SetupDC((int)hdc, pDisplayTransformation);
            pSymbol.Draw(pGeo);
            pSymbol.ResetDC();
            gImage.ReleaseHdc(hdc);
            gImage.Dispose();

            return bmp;

        }

        /// <summary>
        /// 根据符号类型 获取该符号的显示空间描述
        /// </summary>
        /// <param name="pSymbol"></param>
        /// <param name="pEnvelope"></param>
        /// <returns></returns>
        public static ESRI.ArcGIS.Geometry.IGeometry CreateSymShape(ISymbol pSymbol, IEnvelope pEnvelope)
        {
            ESRI.ArcGIS.Display.IMarkerSymbol IMarkerSym;
            IMarkerSym = pSymbol as IMarkerSymbol;
            if (IMarkerSym != null)
            {

                IArea pArea;
                pArea = pEnvelope as IArea;
                return pArea.Centroid as IGeometry;
            }
            else
            {

                ESRI.ArcGIS.Display.ILineSymbol IlineSym;
                ESRI.ArcGIS.Display.ITextSymbol ITextSym;
                IlineSym = pSymbol as ILineSymbol;
                ITextSym = pSymbol as ITextSymbol;
                if (IlineSym != null || ITextSym != null)
                {

                    ESRI.ArcGIS.Geometry.IPolyline IpLine;
                    IpLine = new PolylineClass();
                    IpLine.FromPoint = pEnvelope.LowerLeft;
                    IpLine.ToPoint = pEnvelope.UpperRight;
                    return IpLine as IGeometry;
                }
                else
                {

                    return pEnvelope as IGeometry;
                }
            }
        }

这篇关于Arcgis 符号库中图形到Grid控件的加载的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/574454

相关文章

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加

C#实现WinForm控件焦点的获取与失去

《C#实现WinForm控件焦点的获取与失去》在一个数据输入表单中,当用户从一个文本框切换到另一个文本框时,需要准确地判断焦点的转移,以便进行数据验证、提示信息显示等操作,本文将探讨Winform控件... 目录前言获取焦点改变TabIndex属性值调用Focus方法失去焦点总结最后前言在一个数据输入表单

SpringBoot项目启动后自动加载系统配置的多种实现方式

《SpringBoot项目启动后自动加载系统配置的多种实现方式》:本文主要介绍SpringBoot项目启动后自动加载系统配置的多种实现方式,并通过代码示例讲解的非常详细,对大家的学习或工作有一定的... 目录1. 使用 CommandLineRunner实现方式:2. 使用 ApplicationRunne

SpringBoot项目删除Bean或者不加载Bean的问题解决

《SpringBoot项目删除Bean或者不加载Bean的问题解决》文章介绍了在SpringBoot项目中如何使用@ComponentScan注解和自定义过滤器实现不加载某些Bean的方法,本文通过实... 使用@ComponentScan注解中的@ComponentScan.Filter标记不加载。@C

springboot 加载本地jar到maven的实现方法

《springboot加载本地jar到maven的实现方法》如何在SpringBoot项目中加载本地jar到Maven本地仓库,使用Maven的install-file目标来实现,本文结合实例代码给... 在Spring Boothttp://www.chinasem.cn项目中,如果你想要加载一个本地的ja

最好用的WPF加载动画功能

《最好用的WPF加载动画功能》当开发应用程序时,提供良好的用户体验(UX)是至关重要的,加载动画作为一种有效的沟通工具,它不仅能告知用户系统正在工作,还能够通过视觉上的吸引力来增强整体用户体验,本文给... 目录前言需求分析高级用法综合案例总结最后前言当开发应用程序时,提供良好的用户体验(UX)是至关重要

MyBatis延迟加载的处理方案

《MyBatis延迟加载的处理方案》MyBatis支持延迟加载(LazyLoading),允许在需要数据时才从数据库加载,而不是在查询结果第一次返回时就立即加载所有数据,延迟加载的核心思想是,将关联对... 目录MyBATis如何处理延迟加载?延迟加载的原理1. 开启延迟加载2. 延迟加载的配置2.1 使用

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06