Hello everyone
I want to write a shapefile that consists of more than one multipatch features in c#.
How can i do this job?
Can anyone help me ? A code snippet will be very nice.
Thanks in advance.
Here is my code that handles just one multipatch feature.
string folder = "D:\\";
string nameOfShapeFile = "multipatch.shp";
string shapeFieldName = "Shape";
try
{
IWorkspaceFactory workspaceFactory = null;
workspaceFactory = new ShapefileWorkspaceFactory();
IWorkspace workspace = workspaceFactory.OpenFromFile(folder, 0);
IFeatureWorkspace featureWorkspace = workspace as IFeatureWorkspace;
IFields fields = null;
IFieldsEdit fieldsEdit = null;
fields = new Fields();
fieldsEdit = (IFieldsEdit)fields;
IField field = null;
IFieldEdit fieldEdit = null;
field = new Field();///###########
fieldEdit = (IFieldEdit)field;
fieldEdit.Name_2 = "Shape";
fieldEdit.Type_2 = (esriFieldType.esriFieldTypeGeometry);
IGeometryDef geomDef = null;
IGeometryDefEdit geomDefEdit = null;
geomDef = new GeometryDef();///#########
geomDefEdit = (IGeometryDefEdit)geomDef;
ISpatialReferenceFactory3 spatialReferenceFactory = (ISpatialReferenceFactory3)new SpatialReferenceEnvironment();
geomDefEdit.HasZ_2 = true;
geomDefEdit.GeometryType_2 = esriGeometryType.esriGeometryMultiPatch;
geomDefEdit.SpatialReference_2 = spatialReferenceFactory.CreateGeographicCoordinateSystem((int)ESRI.ArcGIS.Geometry.esriSRGeoCSType.esriSRGeoCS_WGS1984);
fieldEdit.GeometryDef_2 = geomDef;
fieldsEdit.AddField(field);
//Add another miscellaneous text field
field = new Field();
fieldEdit = (IFieldEdit)field;
fieldEdit.Length_2 = 30;
fieldEdit.Name_2 = "Id";
fieldEdit.Type_2 = esriFieldType.esriFieldTypeInteger;
fieldsEdit.AddField(field);
IFeatureClass featClass = null;
featClass = featureWorkspace.CreateFeatureClass(nameOfShapeFile, fields, null, null, esriFeatureType.esriFTSimple, shapeFieldName, "");
IFeature feature = featClass.CreateFeature();
IGeometryCollection coll = (IGeometryCollection)new MultiPatch();
((IZAware)coll).ZAware = true;
IPoint uppercenter = new ESRI.ArcGIS.Geometry.Point();
((IZAware)uppercenter).ZAware = true;
uppercenter.PutCoords(center.X, center.Y);
uppercenter.Z = center.Z + height;
IPointCollection pcoll = new Polygon();
((IZAware)pcoll).ZAware = true;
IPoint[] points = new IPoint[36];
IPoint[] points2 = new IPoint[36];
for (int i = 0; i < 36; i++)
{
points = new ESRI.ArcGIS.Geometry.Point();
((IZAware)points).ZAware = true;
points2 = new ESRI.ArcGIS.Geometry.Point();
((IZAware)points2).ZAware = true;
}
double newlon, newlat;
for (int i = 0; i < 360; i += 10)
{
shiftCoordinate(center.X, center.Y, i, width, out newlon, out newlat);
points[i / 10].PutCoords(newlon, newlat);
points[i / 10].Z = center.Z;
}
for (int i = 0; i <= 35; i++)
{
pcoll.AddPoint(points, ref _missing, ref _missing);
}
IExtrude2 ext = (IExtrude2)new GeometryEnvironment();
IGeometry geom = ext.Extrude(1000000, pcoll as IGeometry);
IMultiPatch patch = geom as IMultiPatch;
feature.Shape = (IGeometry)patch;
feature.Store();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}