इस सी # कोड का उपयोग आर्कमैप के लिए ऐड-इन बनाने के लिए किया जा सकता है ।
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Windows.Forms;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.ArcMapUI;
using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.Geodatabase;
namespace MainToolsAddin
{
public class Extent2ShapefileButton : ESRI.ArcGIS.Desktop.AddIns.Button
{
public Extent2ShapefileButton()
{
}
protected override void OnClick()
{
try
{
var polygon = GetExtentPolygon(ArcMap.Document.FocusMap);
//IGraphicsContainer gc = ArcMap.Document.FocusMap as IGraphicsContainer;
//var element = new PolygonElementClass() as IElement;
//element.Geometry = polygon;
//((IFillShapeElement)element).Symbol = ((IDocumentDefaultSymbols)ArcMap.Document).FillSymbol;
//gc.AddElement(element,0);
//((IActiveView)ArcMap.Document.FocusMap).Refresh();
WritePolygon(@"C:\projects\forums\extents.shp", polygon);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
protected override void OnUpdate()
{
}
private void WritePolygon(string shpFilePath, IGeometry geom)
{
var featClass = OpenShapeFile(shpFilePath);
if (featClass == null)
featClass = CreateShapeFile(shpFilePath, geom);
IFeature feat = featClass.CreateFeature();
feat.Shape = geom;
feat.Store();
}
private IFeatureClass CreateShapeFile(string shpFilepath, IGeometry geom)
{
System.IO.FileInfo fi = new FileInfo(shpFilepath);
var wsf = Activator.CreateInstance(Type.GetTypeFromProgID("esriDataSourcesFile.ShapefileWorkspaceFactory")) as IWorkspaceFactory;
var fws = wsf.OpenFromFile(fi.DirectoryName, 0) as IFeatureWorkspace;
IFieldsEdit flds = new FieldsClass();
flds.AddField(MakeField("ObjectID", esriFieldType.esriFieldTypeOID,0));
IGeometryDefEdit geomDef = new GeometryDefClass();
geomDef.GeometryType_2 = geom.GeometryType;
geomDef.SpatialReference_2 = geom.SpatialReference;
var shpField = MakeField("Shape", esriFieldType.esriFieldTypeGeometry, 0) as IFieldEdit;
shpField.GeometryDef_2 = geomDef;
flds.AddField(shpField);
flds.AddField(MakeField("Name", esriFieldType.esriFieldTypeString, 16));
string fcName = fi.Name;
if (fcName.ToUpper().EndsWith(".SHP"))
fcName = fcName.Substring(0, fcName.LastIndexOf("."));
var fc = fws.CreateFeatureClass(fcName, flds, null, null, esriFeatureType.esriFTSimple, "Shape", "");
return fc;
}
private IField MakeField(string name, esriFieldType fType, int length)
{
IFieldEdit fld = new FieldClass();
fld.Name_2 = name;
fld.Type_2 = fType;
if (length > 0 && fType == esriFieldType.esriFieldTypeString)
fld.Length_2 = length;
return fld;
}
private IFeatureClass OpenShapeFile(string shpFilepath)
{
var wsf = Activator.CreateInstance(Type.GetTypeFromProgID("esriDataSourcesFile.ShapefileWorkspaceFactory")) as IWorkspaceFactory;
System.IO.FileInfo fi = new FileInfo(shpFilepath);
string name = fi.Name.ToUpper().EndsWith(".SHP") ? fi.Name.Substring(0, fi.Name.LastIndexOf(".")) : fi.Name;
string fileName = String.Format("{0}.shp", name);
if (File.Exists(System.IO.Path.Combine(fi.DirectoryName,fileName)))
{
var fws = wsf.OpenFromFile(fi.DirectoryName, 0) as IFeatureWorkspace;
return fws.OpenFeatureClass(name);
}
else
return null;
}
private IPolygon GetExtentPolygon(IMap map)
{
// A polygon is returned since the dataframe might be rotated
var grphCont = ArcMap.Document.PageLayout as IGraphicsContainer;
var mapFrame = grphCont.FindFrame(map) as IMapFrame;
var av = map as IActiveView;
var extent = mapFrame.MapBounds.Envelope;
ISegmentCollection sc = new PolygonClass() as ISegmentCollection;
sc.SetRectangle(extent);
var center = ((IArea)extent).Centroid;
var angle = -(av.ScreenDisplay.DisplayTransformation.Rotation / 180.0 * Math.PI);
((ITransform2D)sc).Rotate(center, angle);
return (IPolygon)sc;
}
}
}
जब आप विज़ुअल स्टूडियो के साथ एक नया ऐड-इन प्रोजेक्ट बनाते हैं, तो आपको इस तरह के कुछ विकल्प देखने चाहिए। मुझे यकीन नहीं है कि यह विजुअल स्टूडियो एक्सप्रेस के साथ काम करता है, या आर्कओबजेक्ट्स एसडीके को स्थापित करने की आवश्यकता है या नहीं।