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. web安全之sql注入实例(5.0之前的)

    web安全之sql(5.0之前)注入实例 5.0之前的数据库没有information库. 所以这里需要运用的是load_file()函数来获取信息. 1.判断是否有sql注入,用and 1=1 和 ...

  2. ✡ leetcode 166. Fraction to Recurring Decimal 分数转换 --------- java

    Given two integers representing the numerator and denominator of a fraction, return the fraction in ...

  3. 用正则从html代码中提取图片路径

    $str = '<div align="center"> <img src="http://www.99tyg.com/public/images/e8 ...

  4. 常见C内存管理程序

    本文主要关注的是C内存管理程序,比较著名的几个C内存管理程序,其中包括: l   Doug Lea Malloc:Doug Lea Malloc实际上是完整的一组分配程序,其中包括Doug Lea的原 ...

  5. Android Studio debug使用release的签名

    当我们在做微信微博sdk分享的时候调试非常麻烦,因为要使用对应的签名版本才能调用sdk成功. 当我们使用AndroidStudio的Gradle之后会很简单的解决这个问题. 1.我们把签名文件放到工程 ...

  6. C#特性学习笔记二

    实例探讨: 自定义了一个特性类: [AttributeUsage(AttributeTargets.Class|AttributeTargets.Method)] class WahAttribute ...

  7. OpenStack nova VM migration (live and cold) call flow

    OpenStack nova compute supports two flavors of Virtual Machine (VM) migration: Cold migration -- mig ...

  8. LeetCode "Binary Tree Level Order Traversal II" using DFS

    BFS solution is intuitive - here I will show a DFS based solution: /** * Definition for a binary tre ...

  9. Apache Shiro 使用手册(一)Shiro架构介绍

    一.什么是Shiro Apache Shiro是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理等功能:  认证 - 用户身份识别,常被称为用户"登录": 授权 - ...

  10. Swagger+Spring mvc生成Restful接口文档

    简介 Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参数和模型紧密集 ...