Multipart to single part feature

Explode

Link: http://edndoc.esri.com/arcobjects/8.3/?URL=/arcobjectsonline/samples/arcmap/explode/explode.htm

 

Created:

10/25/2000

Last Modified:

4/26/2002

Description:

This sample copies all feature in a selected feature class to a new feature class created in the same dataset. Features with multiple parts are broken up so that each part is saved as a new separate feature. 

How to use:

  1. Select a feature layer in the table of contents.
  2. Click the Explode command button.
  3. Enter the name of the new feature class that will be created.
  4. Once completed, add the new layer to ArcMap, notice all previous mutipart features are broken into separate features.

Application: ArcMap

Difficulty: Intermediate

Explode.cs

using System;

using System.Drawing;

using System.Windows.Forms;

using System.Runtime.InteropServices;

// Esri references

using ESRI.ArcObjects.Core;

using ESRI.ArcObjects.Samples.BaseClasses;

using ESRI.ArcObjects.Samples.CatIDs;

 

namespace ArcMapTools

{

/// <summary>

/// Explode breaks multi-part features in single part features.

/// </summary>

 

[ClassInterface(ClassInterfaceType.None)]

[GuidAttribute("689cebc3-b751-4919-a8c6-af59390371de")]

public sealed class ExplodeCS: BaseCommand

{

[ComRegisterFunction()]

static void Reg(String regKey)

{

MxCommand.Register(regKey);

}

 

[ComUnregisterFunction()]

static void Unreg(String regKey)

{

MxCommand.Unregister(regKey);

}

 

private IApplication m_app;

 

public ExplodeCS()

{

try

{

m_bitmap = new Bitmap(GetType().Assembly.GetManifestResourceStream("ArcMapTools.x.bmp"));

}

catch

{

m_bitmap = null;

}

m_category = "Developer Samples";

m_caption = "Explode Command (C#)";

m_message = "Converts parts to features in new feature class.";

m_toolTip = "Converts parts to features.";

m_name = "Explode";

}

 

public override void OnClick()

{

IMxDocument mxDoc = m_app.Document as IMxDocument;

// Make certain the selected item in the toc is a feature layer

if (mxDoc.SelectedItem == null)

{

MessageBox.Show("Select a feature layer in the table of contents " +

"as the input feature class.");

return;

}

 

if (!(mxDoc.SelectedItem is IFeatureLayer))

{

MessageBox.Show("No feature layer selected.");

return;

}

 

IFeatureLayer featureLayer = mxDoc.SelectedItem as IFeatureLayer;

IFeatureClass featureClass = featureLayer.FeatureClass;

 

// Don't process point layers, they have no multi-part features

if (featureClass.ShapeType == esriGeometryType.esriGeometryPoint)

{

MessageBox.Show("Point layers do not have multi-parts.");

return;

}

 

// Prompt for a new feature class name

FeatureClassDialog dlg = new FeatureClassDialog();

dlg.ShowDialog();

string name;

if (dlg.DialogResult == DialogResult.OK)

name = dlg.FileName;

else

return;

 

if (name == "") return;

 

try

{

// Create a new feature class to store the new features

// Create the feature class in the same dataset if one exists - shapefiles don't have one

IFields fields = featureLayer.FeatureClass.Fields;

IDataset dataset;

IFeatureWorkspace featureWorkspace;

IFeatureClass newFeatureClass;

if (featureClass.FeatureDataset == null)

{

dataset = featureClass as IDataset;

featureWorkspace = dataset.Workspace as IFeatureWorkspace;

newFeatureClass = featureWorkspace.CreateFeatureClass(name, fields, null, null,

esriFeatureType.esriFTSimple, featureClass.ShapeFieldName, "");

}

else

{

newFeatureClass = featureClass.FeatureDataset.CreateFeatureClass(name, fields, null, null,

esriFeatureType.esriFTSimple, featureClass.ShapeFieldName, "");

}

 

// Create an insert cursor

IFeatureCursor insertFeatureCursor = newFeatureClass.Insert(true);

IFeatureBuffer featureBuffer = newFeatureClass.CreateFeatureBuffer();

 

// Copy each feature from the original feature class to the new feature class

IFeatureCursor featureCursor = featureClass.Search(null, true);

IFeature feature;

IGeometryCollection geometryColl;

 

while ((feature = featureCursor.NextFeature()) != null)

{

geometryColl = feature.Shape as IGeometryCollection;

if (geometryColl.GeometryCount == 1)

{

InsertFeature(insertFeatureCursor, featureBuffer, feature, feature.Shape);

}

else if (feature.Shape.GeometryType == esriGeometryType.esriGeometryPolygon)

{

IPolygon2 polygon = feature.Shape as IPolygon2;

IPolygon[] polygonArray = new IPolygon[polygon.ExteriorRingCount];

polygon.GetConnectedComponents(polygon.ExteriorRingCount, polygonArray);

for (int i = 0; i <=polygon.ExteriorRingCount -1; i++)

{

InsertFeature(insertFeatureCursor, featureBuffer, feature, polygonArray[i]);

}

}

else

{

for (int i = 0; i <=geometryColl.GeometryCount -1; i++)

{

InsertFeature(insertFeatureCursor, featureBuffer, feature, geometryColl.get_Geometry(i));

}

}

}

}

catch

{

MessageBox.Show("An error occurred. Check that the shapefile specified doesn't already exist.");

}

}

 

public override void OnCreate(object hook)

{

m_app = hook as IApplication;

}

 

private void InsertFeature(IFeatureCursor featureCursor, IFeatureBuffer featureBuffer, IFeature originalFeature, IGeometry newShape)

{

IGeometryCollection newShapeColl = null;

IField field;

 

// Copy the attributes of the orig feature the new feature

IFields fields = originalFeature.Fields;

for (int i = 0; i <= fields.FieldCount - 1; i++)

{

field = fields.get_Field(i);

// skip OID and geometry

if (!(field.Type == esriFieldType.esriFieldTypeGeometry) &&

!(field.Type == esriFieldType.esriFieldTypeOID) && field.Editable)

{

featureBuffer.set_Value(i, originalFeature.get_Value(i));

}

}

 

// Handle cases where parts are passed down:

// InsertGeometries requires an IGeometry[] so we need to set up an array.

IGeometry[] geoArray = new IGeometry[1];

if (newShape.GeometryType == esriGeometryType.esriGeometryPath)

{

newShapeColl = new Polyline() as IGeometryCollection;

geoArray[0] = newShape;

newShapeColl.AddGeometries(1, geoArray);

newShape = newShapeColl as IGeometry;

}

else if (originalFeature.Shape.GeometryType == esriGeometryType.esriGeometryMultipoint)

{

if (newShape is IMultipoint)

{

IPointCollection pointColl = newShape as IPointCollection;

newShape = pointColl.get_Point(0);

}

geoArray[0] = newShape;

newShapeColl = new Multipoint() as IGeometryCollection;

newShapeColl.AddGeometries(1, geoArray);

newShape = newShapeColl as IGeometry;

}

 

featureBuffer.Shape = newShape;

featureCursor.InsertFeature(featureBuffer);

featureCursor.Flush();

}

}

}

Multipart to single part feature的更多相关文章

  1. SSD: Single Shot MultiBox Detector论文阅读摘要

    论文链接: https://arxiv.org/pdf/1512.02325.pdf 代码下载: https://github.com/weiliu89/caffe/tree/ssd Abstract ...

  2. JavaScript Module Pattern: In-Depth

    2010-03-12 JavaScript Module Pattern: In-Depth The module pattern is a common JavaScript coding patt ...

  3. javascript 模块化编程

    The module pattern is a common JavaScript coding pattern. It’s generally well understood, but there ...

  4. Fiddler源代码分享

    frmViewer.cs: namespace Fiddler{    using Microsoft.Win32;    using System;    using System.Collecti ...

  5. Microsoft FIM: Working with Domino Connector v8

    Microsoft FIM: Working with Domino Connector v8 Posted on July 22, 2013 by Michael Pearn - 4 Comment ...

  6. 在vs环境中跑动sift特征提取(代码部分)

    因为在前两天的学习中发现.在opencv环境中跑动sift特征点提取还是比较困难的. 所以在此,进行记述. 遇到的问题分别有,csdn不愿意花费积分.配置gtk困难.教程海量然而能跑者鲜.描述不详尽等 ...

  7. FeatureClass Copy

    http://edndoc.esri.com/arcobjects/9.2/NET/c45379b5-fbf2-405c-9a36-ea6690f295b2.htm Method What is tr ...

  8. JTAG 引脚自动识别 JTAG Finder, JTAG Pinout Tool, JTAG Pin Finder, JTAG pinout detector, JTAGULATOR, Easy-JTAG, JTAG Enumeration

    JTAG Finder Figuring out the JTAG Pinouts on a Device is usually the most time-consuming and frustra ...

  9. Intel daal数据预处理

    https://software.intel.com/en-us/daal-programming-guide-datasource-featureextraction-py # file: data ...

随机推荐

  1. 网页闯关游戏(riddle webgame)--仿微信聊天的前端页面设计和难点

    前言: 之前编写了一个网页闯关游戏(类似Riddle Game), 除了希望大家能够体验一下我的游戏外. 也愿意分享编写这个网页游戏过程中, 学到的一些知识. 本文讲描述, 如何在网页端实现一个仿微信 ...

  2. Monte Carlo Approximations

    准备总结几篇关于 Markov Chain Monte Carlo 的笔记. 本系列笔记主要译自A Gentle Introduction to Markov Chain Monte Carlo (M ...

  3. 无需输入密码的scp/ssh/rsync操作方法

    一般使用scp/ssh/rsync传输文件时,都需要输入密码.下面是免密码传输文件的方法. 假设要在两台主机之间传送文件,host_src & host_dst.host_src是文件源地址所 ...

  4. mysql 导出慢

    转: 导出 mysqldump -uroot -p discuz  -e --max_allowed_packet=1048576 --net_buffer_length=16384 > dis ...

  5. sqlserver sum 和count在关于进行统计时的区别

    sum是对内容的数量进行相加,count 对表行数 对象进行统计 在使用 case 时,如 select subject,count(case when score>80 then score ...

  6. H20的题——[noip2003]银河英雄传(并查集)

    公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶集团派宇 ...

  7. hmtl 中的定位

    1.绝对定位: position:sbsolute: 作用:将元素从文档流中拖出来,然后使用 left,right,top,bottom属性相对于其最接近的一个具有定位属性的父包含块进行绝对定位. 若 ...

  8. (转) 一张图解AlphaGo原理及弱点

    一张图解AlphaGo原理及弱点 2016-03-23 郑宇,张钧波 CKDD 作者简介: 郑宇,博士, Editor-in-Chief of ACM Transactions on Intellig ...

  9. Python学习笔记——Day4

    字符串操作 string典型的内置方法: count() center() startswith() find() format() lower() upper() strip() replace() ...

  10. Java 应用性能调优实践

    Java 应用性能优化是一个老生常谈的话题,笔者根据个人经验,将 Java 性能优化分为 4 个层级:应用层.数据库层.框架层.JVM 层.通过介绍 Java 性能诊断工具和思路,给出搜狗商业平台的性 ...