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 ...
随机推荐
- [20150513]Linux远程登陆管理以及Vim的学习
Linux远程登陆管理以及Vim的学习 实现Linux远程管理 所需工具Xshell,Xshell是一个用于MS Windows平台的强大的SSH,TELNET,和RLOGIN终端仿真软件.它使得用户 ...
- python语言switch-case
初学python语言,竟然很久才发现python没有switch-case语句,查看官方文档说是可以用if-elseif-elseif....代替. 讲真,这都不是问题.不就是一个条件判断吗.用if- ...
- 由javascript中的this指针所想到的
初次结识 this 指针,是在学 <<C++ Primer Plus>>这本书的时候(这本书勉强读了一二遍,之后转学 html+css+js了,不过这是后话). 依稀记得书中举 ...
- HTTP POST GET详解
get /shang/a1.php http/1.1 host: localhost POST /shang/a1.php HTTP/1.1 Hos ...
- python之文件操作
python文件操作 举例:将一个文本文件转成十六进制形式后,保存到另一个文件中. f = open('mycert.cr', 'r') str = f.read() list = [] for ch ...
- 调Windows 7的图片浏览器查看图片
public static void viewPicFromWindows(string pPicPath) { if (pPicPath!="" && Syste ...
- php分10个不同等级压缩优化图片
今天找到一个php写的压缩图片程序,可以分10个等级(0-9)来压缩,0等级时压缩比率不是很大,图片不会失真:随着压缩等级不断增大,图片会变得越来越不清晰,通常压缩后图片大小可以减少到原来的50%,压 ...
- 8、java继承中的this和super的应用
java中只支持单继承,这是为了防止继承的父类中出现同样的函数不知道调用哪个好.虽然java只支持单继承但是有多实现来补偿. 子父类出现后,类成员的特点: 类中成员:1,变量.2,函数.3,构造函数. ...
- 利用Gson和SharePreference存储结构化数据
问题的导入 Android互联网产品通常会有很多的结构化数据需要保存,比如对于登录这个流程,通常会保存诸如username.profile_pic.access_token等等之类的数据,这些数据可以 ...
- linux iostat 性能指标说明
Linux系统中的 iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视. 它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况. ...