ArcMapのレイアウトビューで現在のデータフレーム範囲からシェープファイルを作成しますか?


11

レイアウトビューで現在のデータフレーム範囲からシェープファイルを作成するためのArcGIS 10ツールはどこにありますか?

見回してみて、私が見つけられる最も近いものは、データドライブページの下にあるツールボックスのグリッド/ストリップマップインデックスツールです。

特定の縮尺/ページ設定のデータフレーム(レイアウトビュー)に基づいて、単一の多角形の四角形のshpファイルを作成できるようにしたいだけです。


マップブックツールを使用していますか、それとも1つのレイアウトビューのshpポリゴンを作成するだけですか?
アートワーク21

1つのレイアウトビュー
のみ-sirgeo

これが差し込みマップ用である場合は、データフレームプロパティの範囲インジケータオプションを確認してください。それが他の理由である場合、私はそれのためにPythonスクリプトを書くだけです。
MLowry

このMLowryのpythonスクリプトを書くのにどれくらい時間がかかりますか?ラスターイメージをArcGISからAutoCadにエクスポートするためのものであり、今後何度も必要になります。VS Expressをダウンロードしたばかりで、KirkのC#を試してみるつもりですが、このようなものを扱うことは私の知識ベースをはるかに超えています。
sirgeo

回答:


11

ArcGIS 10のツールボックスを介してこれを行うためのツールを作成しました。スクリプトよりも使いやすいかもしれません。こちらからダウンロードできます。mxdをフォルダーにコピーして、そのフォルダーでツールを実行するだけです。そのフォルダー内の各mxdのすべての主要エクステントを含むシェープファイルが作成されます。


7

この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をインストールする必要があるかどうかはわかりません。

ここに画像の説明を入力してください


カークに感謝します。これは、新しいArcGISアドインウィザードを使用する初めての試みです。最初の質問は、「1。Visual Studioを起動してください」というメッセージです。VisualStudioはどこにありますか?ダウンロード?私はプログラミングの劣等生なので、優しく説明してください。
-sirgeo

使用したことはありませんが、ここからVisual Studioの無料(「エクスプレス」)バージョンをダウンロードできるはずです。このリンクには、「... Visual StudioのExpressバージョンの制限により、フレームワークのすべての機能がExpressエディションでサポートされているわけではありません。」しかし、彼らはどの機能を言っているのかはわかりません。
カーククイケンドール

OK
sirgeo

確かではありませんが、「Microsoftフレームワーク用のArcObjects SDK」もインストールする必要があるかもしれません。マシンにインストールしています。ただし、それなしでアドインを作成しようとしたことはありません。
カーククイケンドール

「ファイル」をクリックし、「新規」を選択して「プロジェクト」をクリックします。「新規プロジェクト」ダイアログボックスが開きます。ただし、ステップ3「プロジェクトタイプの下で、Visual BasicまたはVisual C#プロジェクトノードを展開し、ArcGISノードを展開して、デスクトップアドインをクリックします。」意味がありません...ここのスクリーンショット:i.imgur.com/jHuJ6.png
sirgeo

3

これは、データフレーム範囲からポリゴンを作成する基本的な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

2

[ 範囲をポリゴンにマップ]ツール使用できます。

現在のマップ範囲からポリゴンフィーチャを作成します。レイアウトでは範囲はマップデータフレームになり、データビューでは範囲はアプリケーションウィンドウの範囲になります。データフレームの回転はサポートされていません。



0

一度だけ行う必要がある場合は、[データフレームプロパティ]ウィンドウで範囲を見つけることができます。次に、新しいシェープファイルを作成し、新しい機能を追加し、右クリックして、角に対応する座標を手動で入力することを選択できます。

それ以外の場合は、@ artwork21のスクリプトを使用します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.