Creazione di file di forma dalle attuali estensioni dei frame di dati nella vista layout di ArcMap?


11

Dov'è lo strumento ArcGIS 10 per la creazione di uno shapefile dalle attuali estensioni dei frame di dati nella vista layout?

Mi sono guardato intorno e l'armadio che riesco a trovare sono gli strumenti di Index / Grid / Strip Map Index in Pagine Data Drive.

Voglio solo essere in grado di creare un singolo file shp di rettangolo poligonale basato sul frame di dati (in vista layout) per qualsiasi impostazione di scala / pagina.


stai usando lo strumento mapbook o vuoi semplicemente creare un poligono shp per una vista layout?
artwork21

per una sola vista del layout
sirgeo,

Se questo è per una mappa dell'inserzione, controlla l'opzione dell'indicatore di estensione nelle proprietà della cornice dati. Se è per altri motivi, scriverei solo uno script Python per questo.
MLowry,

Quanto tempo ci vorrebbe per scrivere uno script Python per questo MLowry? Serve per esportare immagini raster da ArcGIS ad AutoCad e sarà necessario molte volte in futuro. Ho appena scaricato VS Express e proverò il C # di Kirk, ma lavorare con queste cose è ben oltre la mia base di conoscenza.
sirgeo,

Risposte:


11

Ho creato uno strumento per farlo tramite una casella degli strumenti in ArcGIS 10. Potrebbe essere più facile da usare rispetto agli script. Puoi scaricarlo qui . Basta copiare i tuoi mxd in una cartella ed eseguire lo strumento su quella cartella. Creerà un file di forma contenente tutte le estensioni principali di ciascun mxd in quella cartella.


7

Questo codice c # può essere utilizzato per creare un componente aggiuntivo per 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;                        
        }
    }
}

Quando si crea un nuovo progetto di componente aggiuntivo con Visual Studio, è necessario visualizzare alcune opzioni come questa. Non sono sicuro che funzioni con Visual Studio Express o se ArcObjects SDK debba essere installato.

inserisci qui la descrizione dell'immagine


Grazie Kirk, questo sarà il mio primo tentativo con la nuova procedura guidata per i componenti aggiuntivi ArcGIS. Prima domanda, dice "1. Avvia Visual Studio" Dov'è Visual Studio? un download? Sono un somaro della programmazione, quindi per favore spiegalo gentilmente.
sirgeo,

Non l'ho mai usato, ma dovresti essere in grado di scaricare la versione gratuita ("Express") di Visual Studio qui . Questo link dice "... a causa delle limitazioni nelle versioni Express di Visual Studio, non tutte le funzionalità del framework sono supportate nelle edizioni Express." Non dicono però quali funzionalità.
Kirk Kuykendall,

okay, ho scaricato il VS Express 700mb e ora sta installando 3,4 GB di roba ... cos'altro richiederà la procedura guidata per i componenti aggiuntivi di ArcGIS?
sirgeo,

Non ne sono certo, ma potrebbe essere necessario installare anche "ArcObjects SDK per Microsoft Framework". L'ho installato sul mio computer. Non ho mai provato a creare un componente aggiuntivo senza di esso però.
Kirk Kuykendall,

bene sono arrivato al punto 2 "Fai clic su File, seleziona Nuovo e fai clic su Progetto. Si apre la finestra di dialogo Nuovo progetto." ma passaggio 3 "In Tipi progetto, espandere il nodo del progetto Visual Basic o Visual C #, espandere il nodo ArcGIS e fare clic su Componenti aggiuntivi desktop." non ha senso ... schermata qui: i.imgur.com/jHuJ6.png
sirgeo

3

Ecco uno script Python di base per creare un poligono dall'estensione del frame di dati. Regola la variabile in base alle tue esigenze. Se vuoi solo un poligono di semplice estensione, puoi sbarazzarti di 'feat', 'scale' e 'Page'. ('Pagina' funzionerà solo se stai usando pagine guidate dai dati).

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

Puoi usare lo strumento Estensione mappa a poligono :

Crea una funzione poligonale dall'estensione della mappa corrente. Nel layout l'estensione sarà del frame di dati della mappa, nella visualizzazione dei dati l'estensione risultante sarà dell'estensione della finestra dell'applicazione. La rotazione del frame di dati non è supportata.



0

Se è necessario farlo una sola volta, è possibile trovare le estensioni nella finestra delle proprietà della cornice dati. Quindi puoi creare un nuovo shapefile, aggiungere una nuova funzione, fare clic con il tasto destro e scegliere di inserire manualmente le coordinate corrispondenti agli angoli.

Altrimenti vai con lo script di @ artwork21.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.