ArcGIS二次开发基础教程(06):有关图层的基本操作

ArcGIS二次开发基础教程(06):有关图层的基本操作ArcGIS二次开发基础教程(06):有关图层的基本操作0.PageLayout和MapControl的同步voidCopyToPage(){//对象拷贝,把mapcontrol的地图拷贝重写到pagelayout里IObjectCopycopy=newObjectCopyClass();objectfromMap=a…

大家好,又见面了,我是你们的朋友全栈君。

ArcGIS二次开发基础教程(06):有关图层的基本操作

0. PageLayout和MapControl 的同步

void CopyToPage()
   {
       //对象拷贝,把mapcontrol的地图拷贝重写到pagelayout里
       IObjectCopy copy = new ObjectCopyClass();
       object fromMap = axMapControl1.Map as Object;
       object toMap = axPageLayoutControl1.ActiveView.FocusMap as object;
       object copyMap = copy.Copy(fromMap) as object;
       copy.OverWrite(toMap,copyMap);
   }

//mapdontrol的事件
   void OnAfterScreenDraw(object sender, IMapControlEvents2_OnAfterScreenDrawEvent e)
   {
       //mapcontrol每次刷新都将显示范围设置为mapcontrol的视图
       IActiveView activeView =IPageLayoutControl1.ActiveView.FocusMap;
       IDisplayTransformation displayTransformation = activeView.ScreenDisplay.DisplayTransformation;
       displayTransformation.VisibleBounds = axMapControl1.Extent;
       axPageLayoutControl1.Refresh();
       CopyToPage();
   }

//mapcontrol的事件
   void OnMapReplaced(object sender, IMapControlEvents2_OnMapRepalcedEvent e)
   {
       //增添数据时调用
        CopyToPage();   
   }

1. 基本图层操作(更名,可见性,比例),矢量图层透明度,栅格图层对比度、亮度和透明度

private IFeatureLayer GetLayerByName(string name)
{
    IFeatureLayer featureLayer = null;
    for(int i=0;i<axMapControl1.LayerCount;i++)
    {
        featureLayer = axMapControl1.get_Layer(i) as IFeatureLayer;
        if(featureLayer.Name.Equals(name))
        {
            return featureLayer;
		}
	}
    return featureLayer;
}

//此处只演示操作 故属性值写死
IFeaturLayer layer = GetLayerByName("图层名称") as IFeatureLayer;
//更名
layer.Name = "新图层名称";
//可见性
layer.Visible = false;
//比例
layer.MinimumScale = 1500000;
layer.MaximumScale = 3000000;
//透明度
IFeatureEffects featureEffects = layer as IFeatureEffects;
featureEffects.Transparency = 10;
//栅格对比度、亮度和透明度
IRasterLayer rasterLayer = GetLayerByName("图层名称") as IRasterLayer;
IFeatureEffects featureEffects = rasterLayer as IFeatureEffects;
featureEffects.Contrast = 30;//对比度
featureEffects.Brightness = 50;//亮度
featureEffects.Transparency = 100;//透明度

2. 在TOCControl中右击图层名显示菜单,单击属性栏显示图层属性表

ILayer layer = null;//定义图层为全局变量
//TOCControl的点击事件
void axTOCControl1_OnMouseDown(object sender, ITOCControlEvents_OnMouseDownEvent e)
{
    if(e.Button == 2)//如果是右击
    {
        //TOCControl提供了HitTest方法用来检测控件上被击中的item,参数详情可查阅帮助文档
        IBasicMap basicMap = new MapClass();
        //用来存储被击中的图层
        layer = new FeatureLayerClass();
        object other = new object();
        object index = new object();
        esriTOCControlItem item = esriTOCControlItem.esriTOCControlItemNone;
        axTOCControl1.HitTest(e.x, e.y, ref utem, ref layer, ref other, ref index);
        if(item == esriTOCControlItem.esriTOCControlItemLayer)
        {
            //ContextMenuStrip控件 在右键对应位置显示
            contextMenuStrip1.Show(axTOCContorl,new System.Drawing.Point(e.x, e.y));
        }
	}
}
//图层菜单的属性栏点击事件
void attributeToolStripMenuItem_Click(object sender, EventArgs e)
{
    //Attribute是我新建的窗体,构造函数用点击的图层作为参数
    Attribute attribute = new Attribute(layer);
    attribute.Show();
}
//以下是Attribute窗体中的代码
private ILayer myLayer;
public Attribute(ILayer layer)
{
    InitializeComponent();
    myLayer = layer;
}
//Attribute窗体的load事件,当窗体加载的时候把属性表显示出来
private void Attribute_Load(object sender, EventArgs e)
{
    //建表
    DataTable dt = new DataTable();
    DataColumn dc;
    //按表属性字段添加列
    for(int i=0;i<feature.Fields.FieldCount;i++)
    {
     	string name = feature.Fields.get_Field(i).Name;
        dc = new DataColumn(name);
        dc.Columns.Add(dc);
    }
    //用要素类的查询方法,获取要素指示光标(要素的遍历是通过指示光标来完成的)
    //设置查询条件为null,第二个参数True表示要素属性不可更改
    IFeatureLayer featureLayer = myLayer as IFeatureLayer;
    IFeatureCursor cursor = featureLayer.FeatureClass.Search(null,true);
    IFeature feature = cursor.Next();
    while(feature!=null)
    {
        DataRow dr = dt.NewRow();//获取表样式的行
        for(int i=0;i<feature.Fields.FieldCount;i++)
        {
            //Shape属性需匹配类型再赋值
            if(feature.get_Value(i).Name.Equals("Shape"))
            {
                switch(feature.Shape.GeometryType)
                {
                    case esriGeometryType.esriGeometryPoint:
                        dr[i] = "Point";
                        break;
                    case esriGeometryType.esriGeometryLine:
                        dr[i] = "Line";
                        break;
                    case esriGeometryType.esriGeometryPolygon:
                        dr[i] = "Polygon";
                        break;
                    case esriGeometryType.esriGeometryPolyline:
                        dr[i] = "Polyline";
                        break;
                    default:
                        dr[i] = "Other";
                        break;
                }
                continue;
            }
            //其他属性直接赋值
            dr[i] = feature.get_Value(i).ToString();
        }
        dt.Rows.Add(dr);
        feature = cursor.Next();
    }
    //用一个DataGridView控件显示表,设置数据源为上面建的表
    dataGridView1.DataSource = dt;
}

历届GIS应用技能大赛开发题答案点这里,尚在不定期更新中

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/163424.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 完全卸载mysql数据库教程_sql卸载教程

    完全卸载mysql数据库教程_sql卸载教程快捷键win+r输入regedit进入注册表,找到HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog\Application\MySQL文件夹删除删除HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\Eventlog\Application\MySQL文件夹。删除HKEY_L…

  • telnet命令详解_Telnet命令

    telnet命令详解_Telnet命令前面的Telnet的命令使用方法部分是我在网上搬过来的,后面的内容是我在自己初学实践时所遇到的一些问题及解决方法。Telnet使用介绍  1、点击开始 → 运行 → 输入CMD,回车。  2、在出来的DOS界面里,输入telnet测试端口命令:telnetIP端口或者telnet域名端口,回车。  如果端口关闭或者无法连接,则显示不能打开到主机的链接,链接失败;端口打开的…

  • Mybatis缓存详解[通俗易懂]

    Mybatis缓存详解[通俗易懂]Mybatis缓存所有的查询都要连接数据库连接数据库耗费资源如何能一次查询的结果给他暂存到一个可以直接取到的地方!!–>内存:缓存我们再次查询相同数据的时候直接走缓存就不用走数据库了一、缓存简介什么是缓存[Cache]?存在内存中的临时数据。将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。为什么使用缓存?减少和数据库的交互次数,减少系统开销,提高系统效率

  • PyPDF2的使用「建议收藏」

    PyPDF2的使用「建议收藏」pdf使用Adobe公司开发,现在由国际标准化组织ISO进行维护。PDF合成包含链接和按钮,表单字段,音频,视频和业务逻辑在这篇文章中,我们将学习如何做一些pdf的操作:从PDF中提取文字旋转pdf页合并pdf分割pdf向pdf页中添加水印使用简单的python脚本1、安装我们将使用第三方的模块PyPDF2PyPDF2是作为PDF…

  • rocketmq延迟队列原理_rocketmq延迟队列原理

    rocketmq延迟队列原理_rocketmq延迟队列原理在java的延迟队列中,无法支持集群的延迟。Redis可以做到对应的延迟功能,但是自己封装毕竟局限于业务。而且封装也需要耗费一定时间。今天我们就讲一个现有的延迟队列,不仅支持分布式服务,而且解耦业务代码,而且支持不同延迟时间的造好的轮子吧。~那就是RocketMQ延时队列。RocketMQ将延时队列的延时延时时间分为18个级别123456789101112131415161718分别对应下面的延迟时间,在使用时,直接传递level即可。mess

  • mysql怎么批量导入数据_oracle如何批量导入大量数据

    mysql怎么批量导入数据_oracle如何批量导入大量数据1、确定需要导入数据的表名称以及字段,然后在新建的Excel表中,按照表字段正确排序;(注:(Excel文件的名称最好和数据库的名称一致,sheet表的名字最好和表名称一致,方便需要导入多张表数据时一一对应))2、在Excel表中,正确填写需要导入的数据,一行数据对应着数据库表中的一行记录;(注:各个字段的格式要求需要和数据库中的限制一样,避免出现差错)3、收集好需要导入的数据后,点击保存。(注:…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号