Multipart to single part feature
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:
- Select a feature layer in the table of contents.
- Click the Explode command button.
- Enter the name of the new feature class that will be created.
- 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的更多相关文章
- SSD: Single Shot MultiBox Detector论文阅读摘要
论文链接: https://arxiv.org/pdf/1512.02325.pdf 代码下载: https://github.com/weiliu89/caffe/tree/ssd Abstract ...
- JavaScript Module Pattern: In-Depth
2010-03-12 JavaScript Module Pattern: In-Depth The module pattern is a common JavaScript coding patt ...
- javascript 模块化编程
The module pattern is a common JavaScript coding pattern. It’s generally well understood, but there ...
- Fiddler源代码分享
frmViewer.cs: namespace Fiddler{ using Microsoft.Win32; using System; using System.Collecti ...
- Microsoft FIM: Working with Domino Connector v8
Microsoft FIM: Working with Domino Connector v8 Posted on July 22, 2013 by Michael Pearn - 4 Comment ...
- 在vs环境中跑动sift特征提取(代码部分)
因为在前两天的学习中发现.在opencv环境中跑动sift特征点提取还是比较困难的. 所以在此,进行记述. 遇到的问题分别有,csdn不愿意花费积分.配置gtk困难.教程海量然而能跑者鲜.描述不详尽等 ...
- FeatureClass Copy
http://edndoc.esri.com/arcobjects/9.2/NET/c45379b5-fbf2-405c-9a36-ea6690f295b2.htm Method What is tr ...
- 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 ...
- Intel daal数据预处理
https://software.intel.com/en-us/daal-programming-guide-datasource-featureextraction-py # file: data ...
随机推荐
- JS特殊函数(Function()构造函数、函数直接量)区别介绍
函数定义 函数是由这样的方式进行声明的:关键字 function.函数名.一组参数,以及置于括号中的待执行代码. 函数的构造语法有这三种: 1.function functionName(arg0, ...
- Discovering the Computer Science Behind Postgres Indexes
This is the last in a series of Postgres posts that Pat Shaughnessy wrote based on his presentation ...
- python 类中staticmethod,classmethod,普通方法
1.staticmethod:静态方法和全局函数类似,但是通过类和对象调用. 2.classmethod:类方法和类相关的方法,第一个参数是class对象(不是实例对象).在python中class也 ...
- 【C】 05 - 声明和定义
仅从形式上看,C程序就是由各种声明和定义组成的.它们是程序的骨架和外表,不仅定义了数据(变量),还定义了行为(函数).规范中的纯语言部分,声明和定义亦花去了最多的篇幅.完全说清定义的语法比较困难,这里 ...
- SQL Server DBA日常查询视图_数据库对象视图
1.数据库 use master; exec sp_helpdb 1.1查询数据库大小 1.2查询数据库状态 use msdb select name, user_access_desc, --用户访 ...
- AndroidImagePicker 的使用
github地址 https://github.com/easonline/AndroidImagePicker 效果图
- Hadoop的管理目录
HDFS文件结构 1.NameNode的文件结构,NameNode会创建VERSION.edits.fsimage.fstime文件目录.其中dfs.name.dir属性是一个目录列表,是每个目录的镜 ...
- C语言面试题
#include <stdio.h> int main() { ] = {, , , , }; ); // <==> (unsigned int)&a+sizeof(* ...
- BeanFactory 和ApplicationContext(Bean工厂和应用上下文)
Bean工厂(BeanFactory接口),提供了基础的依赖注入支持. 应用上下文(ApplicationContext接口),建立在Bean工厂基础之上,提供了系统架构服务. Application ...
- context menu与submenu区别
http://blog.csdn.net/liuxiit/article/details/6819235 总结调用顺序: 点击“Menu" 键时,调用 onCreateOptionsMenu ...