レイアウトビューで現在のデータフレーム範囲からシェープファイルを作成するためのArcGIS 10ツールはどこにありますか?
見回してみて、私が見つけられる最も近いものは、データドライブページの下にあるツールボックスのグリッド/ストリップマップインデックスツールです。
特定の縮尺/ページ設定のデータフレーム(レイアウトビュー)に基づいて、単一の多角形の四角形のshpファイルを作成できるようにしたいだけです。
レイアウトビューで現在のデータフレーム範囲からシェープファイルを作成するためのArcGIS 10ツールはどこにありますか?
見回してみて、私が見つけられる最も近いものは、データドライブページの下にあるツールボックスのグリッド/ストリップマップインデックスツールです。
特定の縮尺/ページ設定のデータフレーム(レイアウトビュー)に基づいて、単一の多角形の四角形のshpファイルを作成できるようにしたいだけです。
回答:
このc#コードを使用して、Arcmapのアドインを構築できます。
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;
}
}
}
Visual Studioで新しいアドインプロジェクトを作成すると、次のようなオプションが表示されます。Visual Studio Expressで動作するかどうか、またはArcObjects SDKをインストールする必要があるかどうかはわかりません。
これは、データフレーム範囲からポリゴンを作成する基本的なPythonスクリプトです。ニーズに合わせて変数を調整します。単純な範囲ポリゴンだけが必要な場合は、「feat」、「scale」、および「Page」を取り除くことができます。(「ページ」は、データドリブンページを使用している場合にのみ機能します)。
doc = arcpy.mapping.MapDocument("current")
df = arcpy.mapping.ListDataFrames(doc)[0] #First Dataframe
extent = df.extent
fc = arcpy.GetParameterAsText(0)
feat = arcpy.GetParameterAsText(1)
scale = arcpy.GetParameterAsText(2)
Page = doc.dataDrivenPages.currentPageID
# Create Extent Polygon
array = arcpy.Array()
array.add(extent.lowerLeft)
array.add(extent.lowerRight)
array.add(extent.upperRight)
array.add(extent.upperLeft)
array.add(extent.lowerLeft)
polygon = arcpy.Polygon(array)
cursor = arcpy.da.InsertCursor(fc,["SHAPE@","Page","Feature","Scale"])
cursor.insertRow([polygon, Page, feat, scale])
del cursor
[ 範囲をポリゴンにマップ]ツールを使用できます。
現在のマップ範囲からポリゴンフィーチャを作成します。レイアウトでは範囲はマップデータフレームになり、データビューでは範囲はアプリケーションウィンドウの範囲になります。データフレームの回転はサポートされていません。
このデータフレームポリゴンの作成ツールは、ArcGIS Desktop 10.3で動作します
アドインをロードし、ツールバーをカスタマイズ(または新規作成)して追加します。