Shapefile aus aktuellen Datenrahmenbereichen in der Layoutansicht von ArcMap erstellen?


11

Wo befindet sich das ArcGIS 10-Tool zum Erstellen eines Shapefiles aus aktuellen Datenrahmenbereichen in der Layoutansicht?

Ich habe mich umgesehen und das, was ich finden kann, sind die Grid / Strip Map Index-Tools von Toolbox unter Data Drive Pages.

Ich möchte nur in der Lage sein, eine einzelne Polygon-Rechteck-SHP-Datei basierend auf dem Datenrahmen (in der Layoutansicht) für einen bestimmten Maßstab / Seitenaufbau zu erstellen .


Verwenden Sie das Mapbook-Tool oder möchten Sie nur ein shp-Polygon für eine Layoutansicht erstellen?
Artwork21

für nur eine
Layoutansicht

Wenn dies für eine Einschubkarte gilt, überprüfen Sie die Option für den Ausdehnungsindikator in den Datenrahmeneigenschaften. Wenn es aus anderen Gründen ist, würde ich einfach ein Python-Skript dafür schreiben.
MLowry

Wie viel Zeit würde es dauern, ein Python-Skript für diese MLowry zu schreiben? Es dient zum Exportieren von Rasterbildern von ArcGIS nach AutoCad und wird in Zukunft mehrmals benötigt. Ich habe gerade VS Express heruntergeladen und werde Kirk's C # ausprobieren, aber die Arbeit mit diesem Zeug geht weit über meine Wissensbasis hinaus.
Sirgeo

Antworten:


11

Ich habe ein Tool erstellt, um dies über eine Toolbox in ArcGIS 10 zu tun. Es ist möglicherweise einfacher zu verwenden als Skripte. Sie können es hier herunterladen . Kopieren Sie einfach Ihre mxd (s) in einen Ordner und führen Sie das Tool in diesem Ordner aus. Es wird ein Shapefile erstellt, das alle Hauptbereiche jedes mxd in diesem Ordner enthält.


7

Dieser c # -Code kann verwendet werden, um ein Add-In für Arcmap zu erstellen .

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;                        
        }
    }
}

Wenn Sie mit Visual Studio ein neues Add-In-Projekt erstellen, sollten einige Optionen wie diese angezeigt werden. Ich bin nicht sicher, ob es mit Visual Studio Express funktioniert oder ob das ArcObjects SDK installiert werden muss.

Geben Sie hier die Bildbeschreibung ein


Vielen Dank, Kirk. Dies ist mein erster Versuch, den neuen ArcGIS-Add-Ins-Assistenten zu verwenden. In der ersten Frage heißt es "1. Visual Studio starten". Wo ist Visual Studio? ein Download? Ich bin ein Programmierdummkopf, bitte erklären Sie es vorsichtig.
Sirgeo

Ich habe es noch nie benutzt, aber Sie sollten in der Lage sein, die kostenlose ("Express") Version von Visual Studio hier herunterzuladen . Dieser Link lautet: "... Aufgrund von Einschränkungen in den Express-Versionen von Visual Studio werden in den Express-Editionen nicht alle Funktionen des Frameworks unterstützt." Sie sagen jedoch nicht, welche Funktionen.
Kirk Kuykendall

Okay, ich habe den 700 MB VS Express heruntergeladen und jetzt werden 3,4 GB installiert. Was benötigt der ArcGIS Add-Ins-Assistent noch?
Sirgeo

Ich bin nicht sicher, aber möglicherweise müssen Sie auch das "ArcObjects SDK für das Microsoft Framework" installieren. Ich habe es auf meinem Computer installiert. Ich habe noch nie versucht, ein Add-In ohne dieses zu erstellen.
Kirk Kuykendall

Nun, ich komme zu Schritt 2 "Klicken Sie auf Datei, wählen Sie Neu und klicken Sie auf Projekt. Das Dialogfeld Neues Projekt wird geöffnet." aber Schritt 3 "Erweitern Sie unter Projekttypen den Projektknoten Visual Basic oder Visual C #, erweitern Sie den ArcGIS-Knoten und klicken Sie auf Desktop-Add-Ins." macht keinen Sinn ... Screenshot hier: i.imgur.com/jHuJ6.png
Sirgeo

3

Hier ist ein grundlegendes Python-Skript zum Erstellen eines Polygons aus dem Datenrahmenbereich. Passen Sie die Variable an Ihre Bedürfnisse an. Wenn Sie nur ein einfaches Ausdehnungspolygon möchten, können Sie 'feat', 'scale' und 'Page' entfernen. ('Seite' funktioniert nur, wenn Sie datengesteuerte Seiten verwenden).

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

Sie können das Werkzeug Map Extent to Polygon verwenden:

Erstellt ein Polygon-Feature aus der aktuellen Kartenausdehnung. Im Layout entspricht die Ausdehnung dem Kartendatenrahmen, in der Datenansicht der Ausdehnung der Ausdehnung des Anwendungsfensters. Datenrahmenrotation wird nicht unterstützt.



0

Wenn Sie dies nur einmal tun müssen, finden Sie die Extents im Fenster Datenrahmeneigenschaften. Anschließend können Sie ein neues Shapefile erstellen, ein neues Feature hinzufügen, mit der rechten Maustaste klicken und die den Ecken entsprechenden Koordinaten manuell eingeben.

Ansonsten gehe mit dem Skript von @ artist21.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.