ArcGIS二次开发基础教程(09):叠加分析

ArcGIS二次开发基础教程(09):叠加分析ArcGIS二次开发基础教程(09):叠加分析缓冲区分析的概念及原理请查看帮助文档http://desktop.arcgis.com/zh-cn/arcmap/latest/tools/analysis-toolbox/how-buffer-analysis-works.htm缓冲区分析//实现对图层中所有点要素进行缓冲分析IGraphicsContainergraphicsConta…

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

ArcGIS二次开发基础教程(09):叠加分析

缓冲区分析的概念及原理请查看帮助文档 http://desktop.arcgis.com/zh-cn/arcmap/latest/tools/analysis-toolbox/how-buffer-analysis-works.htm

缓冲区分析

//实现对图层中所有点要素进行缓冲分析
IGraphicsContainer graphicsContainer = axMapcontrol1.Map as IGraphicsContainer;
IFeatureLayer featureLayer = GetLayerByName("图层名称");
//IQueryFilter filter = new QueryFilterClass();
//ISpactialFilter filter = new SpatialFilterClass();
//此处不设置查询条件,也可以设置如上面两行的属性或空间查询条件,只对符合特定条件的要素进行缓冲区分析
IFeatureCursor cursor = featureLayer.FeatureClass.Search(null,true);
IFeature feature = cursor.NextFeature();
//定义一个ITopologicalOperator变量 有关ITopologicalOperator的成员说明请务必查看帮助文档
ITopologicalOperator topo;
while(feature != null)
{
    topo = feature.ShapeCopy as ITopologicalOperator;
    //参数为缓冲区半径  半径大小需特别注意 根据实际地图的大小来确定
    IGeometry buffer = topo.Buffer(0.001);
    IElement ele = new PolygonClass();
    ele.Shape = buffer;
    graphicsContainer.AddElement(ele,0);
    feature = cursor.NextFeature();
}
axMapControl1.Refresh();

裁剪

有关概念查看帮助文档 http://desktop.arcgis.com/zh-cn/arcmap/10.3/tools/analysis-toolbox/clip.htm

//实现 从屏幕划取矩形(也可以是圆或者多边形)作为裁剪区域对指定图层进行裁剪并把裁剪结果作为新的图层添加到地图中
private void clip(object sender, IMapControlEvents2_OnMouseDownEvent e)
{
    //以下代码实现在文件打开路径处创建一个新的FeatureClass
    //首先在文件路径处打开要素类工作空间
    IWorkspaceFactory workspaceFactory = new ShapefileWorkspaceFactoryClass();
    //path为路径全局变量,打开文件时赋值
    IFeatureWorkspace featureWorkspace = workspaceFactory.OpenFromFile(System.IO.Path.GetDirectory(path));
    //裁剪图层
    IFeatureLayer featureLayer = GetLayerByName("图层名称");
    //copy目标图层的要素字段用来创建新的要素类
    IFields fields = featureLayer.FeatureClass.Fields;
    IObjectCopy copy = new ObjectCopyClass();
    IFields fieldsCopy = copy.Copy(fields) as IFields;
    //创建一个新的要素类  参数一为要素类名称,二为字段,其它请务必参考帮助文档
    IFeatureClass newClass = featureWorkspace.CreateFeatureClass("Clip", fieldsCopy, null, null, esriFeatureType.esriFTSimple, "Shape", "");
    //从地图获取裁剪区域
    IEnvelop env = axMapControl1.TrackRectangle;
    //用获得区域与图层进行空间相交查询获得目标要素
    ISpatialFilter spatialFilter = new SpatialFilterClass();
    spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
    spatialFilter.Geometry = env as IEnvelop;
    IFeatureCursor cursor = featureLayer.FeatureClass.Search(spatialFilter,true);
    IFeature feature = cursor.NextFeature();
    ITopologicalOperator topo;
    //设置允许插入新要素
    IFeatureCursor insterCursor = newClass.Inster(true);
    //创建 缓冲要素 要素暂存在内存中
    IFeatureBuffer buffer = newClass.CreateFeatureBuffer();
    //遍历查询到的要素 进行裁剪获取空间信息
    while(faeture != null)
    {
        topo = feature.ShapeCopy as ITopologicalOperator;
        IGeometry geometry = new PolygonClass();
        //裁剪只能获取要素信息,查询获得属性信息 两者结合才能得到完整的要素类
        topo.QueryClipped(env,geometry);
        //结合查询属性和空间信息
        for(int i=0;i<feature.Fields.FieldCount;i++)
        {
            if(feature.get_Fields(i).Name.Equals("Shape"))
            {
                buffer.Shape = geometry;
                continue;
            }
            buffer.set_Value(i,feature.get_Value(i));
        }
        //插入要素
        insterCursor.InsterFeature(buffer);
        feature = cursor.NextFeature();
    }
    //创建新图层 设置要素类
    IFeatureLayer layer = new FeatureLayerClass();
    layer.FeatureClass = newClass;
    layer.Name = newClass.AliceName;
    //添加到地图控件中
    axMapControl1.AddLayer(layer);
    axMapControl1.Refresh();
    axTOCControl1.Update();
}

栅格叠加

查看帮助文档 http://desktop.arcgis.com/zh-cn/arcmap/10.3/analyze/commonly-used-tools/overlay-analysis.htm

//获取栅格数据集
private IGeoDataset GetDatasetByPath(string path)
{
    IWorkspaceFactory workspaceFactory = new ShapefileWorkspaceFactoryClass();
    IRasterWorkspace rasterWorkspace = workspaceFactory.OpenFromFile(System.IO.Path.GetDirectoryName(path)) as IRasterWorkspace;
    IRasterDataset rasterDataset = rasterWorkspace.OpenRasterDataset(System.IO.Path.GetFileName(path));
    return rasterDataset as IGeoDataset;
}

//从路径中获取栅格数据转换为栅格波段对象  
IRasterBand rasterBand_1 = GetDatasetByPath(path1);
IRasterBand rasterBand_2 = GetDatasetByName(path2);
//创建一个IRasterBandCollection接口
IRasterBandCollection rasterBandCollection = new RasterClass();
//添加数据
rasterBandCollection.AppendBand(rasterBand_1);
rasterBandCollection.AppendBand(rasterBand_2);
//转换为IGeodataset
IGeoDataset inputDataset = rasterBandCollection as IGeoDataset;
//创建栅格波段集合对象
ILocalOp localOp = new RasterLocalOpClass();
//调用Conbine方法
IGeoDataset output = localOp.Combine(inputDataset);
//用叠加生成的地理数据集创建栅格图层
IRasterLayer layer = new RasterLayerClass();
layer.CreateFromRaster(output as IRaster);
layer.Name = "Combine";
axMapControl1.AddLayer(layer as ILayer);
axMapControl1.Refresh();
axTOCControl1.Update();

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

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163418.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • jquery获取scrollHeight

    jquery获取scrollHeight$(“yourselector”).prop(“scrollHeight”);其他操作:$(window).height();//浏览器当前窗口可视区域高度$(document).height();//浏览器当前窗口文档的高度$(document.body).height();//浏览器当前窗口文档body的高度$(document.body).outerHeight(true);//浏览器当前窗口文档body的总高度包括borderpaddingmargin$(wind

    2022年7月24日
    25
  • Jmeter之.jtl文件解析「建议收藏」

    Jmeter之.jtl文件解析「建议收藏」我们知道命令行的方式执行完成jmeter后,会生成jtl文件,里面打开后就是一行行的测试结果。<httpSamplet=”1″lt=”1″ts=”1450684950333″s=”true”lb=”app.testdelay”rc=”200″rm=”OK”tn=”appdelay-3000g3m1-1″dt=””by=”2265″/>t表示从请求开始到响应结束…

    2025年7月29日
    4
  • 指令周期的四个阶段_单片机指令周期与机器周期

    指令周期的四个阶段_单片机指令周期与机器周期时钟周期时钟周期也称为振荡周期,定义为时钟脉冲的倒数(可以这样来理解,时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时间周期就是1/12us),是计算机中最基本的、最小的时间单位。在一个时钟周期内,CPU仅完成一个最基本的动作。对于某种单片机,若采用了1MHZ的时钟频率,则时钟周期为1us;若采用4MHZ的时钟频率,则时钟周期为250ns。由于时钟脉冲是计算机的基本工作脉冲…

    2022年10月13日
    2
  • Java基础面试题50题

    1,””空字符串的作用packagecom.neuedu.nineteen;publicclassTest{publicstaticvoidmain(String[]args){Strings=””;for(chari=’a’;i<‘d’;i++){s=s+i;//输出…

    2022年4月14日
    51
  • linux14:(0.7k)scp命令,fstab文件

    linux14:(0.7k)scp命令,fstab文件scp命令scp 可以在 2个 linux 主机间复制传输文件;命令基本格式:scp 选项 源路径 目标路径选项-v 和大多数 linux 命令中的 -v 意思一样 , 用来显示进度 . 可以用来查看连接 , 认证 , 或是配置错误 .-C 使能压缩选项 .-P 选择端口 . 注意 -p 已经被 rcp 使用 .-4 强行使用 IPV4 地址 .-6 强行使用 IPV6 地址 .copy 本地的档案到远程的机器上scp /etc/lilo.conf k@net67.ee.oit.edu

    2022年8月11日
    5
  • route命令的使用详解[通俗易懂]

    route命令的使用详解[通俗易懂]Linux系统的route命令用于显示和操作IP路由表(show / manipulate the IP routing table)。要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现。在Linux系统中,设置路由通常是为了解决以下问题:该Linux系统在一个局域网中,局域网中有一个网关,能够让机器访问Internet,那么就需要将这台机器的IP地址设…

    2022年7月18日
    16

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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