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 ...
随机推荐
- Java:String和Date、Timestamp之间的转换
一.String与Date(java.util.Date)互转 1.1 String -> Date String dateStr = "2016-9-28 12:25:55" ...
- VSCode用户设置
// 将设置放入此文件中以覆盖默认设置 { //-------- 搜索配置 -------- "search.exclude": { "**/node_modules&q ...
- Nginx-Lua重定向系列
Ningx Lua模块官方文档: 在Nginx中实现重定向可以通过rewrite指令,具体可参考<Nginx学习--http_rewrite_module的rewrite指令> 通过Lua ...
- 查杀 oracle sql 卡死的进程
--查出SID名字select * from v$access where object ='PKG_SMSSEND_PROC';--通过sid查出spidselect spid,osuser, s ...
- EDIUS设置Alpha转场的教程
有刚开始学习EDIUS视频编辑软件的同学吗?你们是否需要一本很好的EDIUS教程呢?你们可以到EDIUS中文网站里面找哦,小编会一直更新EDIUS教程的,能给你们带来帮助我是非常高兴的.今天我们来一起 ...
- python pandas.DataFrame选取、修改数据最好用.loc,.iloc,.ix
先手工生出一个数据框吧 import numpy as np import pandas as pd df = pd.DataFrame(np.arange(0,60,2).reshape(10,3) ...
- pt-fifo-split使用
percona-toolkit系列-pt-find http://blog.itpub.net/23249684/viewspace-1354308/ 在<mysql插入/更新数据>这篇文 ...
- Centos 安装vsftpd 服务器
一:检查有没有安装vsftpd 二:安装vsftpd 三:安装之后重启 四:修改vsftpd配置文件 配置文件路径在/etc/vsftpd目录下 默认是注释掉的,把#号去掉 然后重启vsftpd 五: ...
- PCL还是SAP?
When you first created the Hello solution in Visual Studio, you had a choice of two application temp ...
- android html 图片处理类--加载富文本工具类
在android开发中,一些资讯类页面,里面有html标签和图片,html 标签一般通过Html.fromHtml方法,即可以解决,但是如果html 有图片标签,那么,Html.fromHtml 好像 ...
