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. mongodb,redis,hbase 三者都是nosql数据库,他们的最大区别和不同定位是什么?

      不严谨地讲,Redis定位在"快",HBase定位于"大",mongodb定位在"灵活". NoSQL的优点正好就是SQL的软肋,而其弱 ...

  2. 关于 Unix 用户权限及进程权限及 Saved set-user-id

    最近在看APUE,看到3.14节,fcntl的时候#include <fcntl.h>int fcntl(int fd, int cmd, .../* int arg */);出错返回-1 ...

  3. 几种循环语句 ,break,continue语句用法

    Java有非常灵活的三循环机制.可以使用以下三种循环之一: while 循环 do...while 循环 for 循环while循环是一个控制结构,可以重复的特定任务次数.在执行时,如果布尔表达式的结 ...

  4. 【转载】C/C++中#ifdef和#endif的用法

    转于 http://www.cnblogs.com/renyuan/archive/2013/05/22/3092362.html 今天笔试的时候遇到这个问题,整理一下! 一般情况下,源程序中所有的行 ...

  5. eclipse 使用(一)单步调试

    昨天终于将取数据的流程走通了.但是没有成功获得数据.原因是,把服务器中的数据库还原到了本地.而测试数据是写到了本地.把数据给覆盖了.早上来了之后,赶紧在服务器上把数据弄了一下. 之后开始跑代码. 项目 ...

  6. js监听rem实现响应式

    原文链接:http://caibaojian.com/web-app-rem.html (function (doc, win) { var docEl = doc.documentElement, ...

  7. HttpSession的线程安全问题及注意事项

    摘自http://blog.csdn.net/java2000_net/article/details/2922357 HttpSession session =  request.getSessio ...

  8. Hadoop学习17--yarn配置篇-内存管理

    这篇文章来自于:董的博客,记录备查 内存管理,主要是管理nodemanager上的物理内存和虚拟内存. YARN允许用户配置每个节点上可用的物理内存资源,注意,这里是“可用的”,因为一个节点上的内存会 ...

  9. ImageLoader介绍2

    Universal Image Loader 是一个开源的UI组件程序,该项目的目的是提供一个可重复使用的仪器为异步图像加载,缓存和显示.所以,如果你的程序里需要这个功能的话,那么不妨试试它.他本来是 ...

  10. mysql备份还原数据库

    1.备份数据库 mysqldump -u root -p test>/home/victor/test.sql 说明:如果提示找不到mysqldump命令,先用一条find命令查找mysqldu ...