Vous créez un fichier de formes à partir des étendues de trame de données actuelles dans la vue de présentation d'ArcMap?


11

Où se trouve l'outil ArcGIS 10 pour créer un fichier de formes à partir des étendues de trame de données actuelles en mode présentation?

J'ai regardé autour de moi et la chose que je peux trouver dans le placard est les outils d'index de carte de grille / bande de Toolbox sous Data Drive Pages.

Je veux juste pouvoir créer un seul fichier shp de rectangle de polygone basé sur le bloc de données (en mode disposition) pour une configuration d'échelle / page donnée.


utilisez-vous l'outil de cartographie ou souhaitez-vous simplement créer un polygone shp pour une vue de mise en page?
artwork21

pour une seule vue de mise en page
sirgeo

S'il s'agit d'une carte en encart, consultez l'option d'indicateur d'étendue dans les propriétés du bloc de données. Si c'est pour d'autres raisons, j'écrirais juste un script python pour cela.
MLowry

Combien de temps faudrait-il pour écrire un script python pour ce MLowry? C'est pour prendre des exportations d'images raster d'ArcGIS vers AutoCad et sera nécessaire plusieurs fois à l'avenir. Je viens de télécharger VS Express et je vais essayer le C # de Kirk, mais travailler avec ce genre de choses va bien au-delà de ma base de connaissances.
sirgeo

Réponses:


11

J'ai créé un outil pour le faire via une boîte à outils dans ArcGIS 10. Il pourrait être plus facile à utiliser que les scripts. Vous pouvez le télécharger ici . Copiez simplement vos mxd dans un dossier et exécutez l'outil sur ce dossier. Il créera un fichier de formes contenant toutes les extensions principales de chaque mxd dans ce dossier.


7

Ce code c # pourrait être utilisé pour créer un complément pour 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;                        
        }
    }
}

Lorsque vous créez un nouveau projet de complément avec Visual Studio, vous devriez voir certaines options comme celle-ci. Je ne sais pas si cela fonctionne avec Visual Studio Express ou si le SDK ArcObjects doit être installé.

entrez la description de l'image ici


Merci Kirk, ce sera ma première tentative d'utilisation du nouvel assistant de compléments ArcGIS. Première question, il est dit "1. Démarrez Visual Studio" Où est Visual Studio? un téléchargement? Je suis un cancre de la programmation, veuillez expliquer doucement.
sirgeo

Je ne l'ai jamais utilisé, mais vous devriez pouvoir télécharger la version gratuite ("Express") de Visual Studio ici . Ce lien indique "... en raison des limitations des versions Express de Visual Studio, toutes les fonctionnalités du framework ne sont pas prises en charge dans les éditions Express." Cependant, ils ne disent pas quelles fonctionnalités.
Kirk Kuykendall

D'accord, j'ai téléchargé le 700mb VS Express et maintenant il installe 3,4 Go de matériel ... de quoi d'autre l'assistant de compléments ArcGIS va-t-il avoir besoin?
sirgeo du

Je ne suis pas certain, mais vous devrez peut-être également installer le "SDK ArcObjects pour le framework Microsoft". Je l'ai installé sur ma machine. Je n'ai jamais essayé de créer un complément sans lui cependant.
Kirk Kuykendall

eh bien je suis arrivé à l'étape 2 "Cliquez sur Fichier, sélectionnez Nouveau, puis cliquez sur Projet. La boîte de dialogue Nouveau projet s'ouvre." mais l'étape 3 "Sous Types de projets, développez le nœud de projet Visual Basic ou Visual C #, développez le nœud ArcGIS et cliquez sur Compléments Desktop." n'a aucun sens ... capture d'écran ici: i.imgur.com/jHuJ6.png
sirgeo

3

Voici un script python de base pour créer un polygone à partir de l'étendue de la trame de données. Ajustez la variable en fonction de vos besoins. Si vous voulez juste un polygone d'étendue simple, vous pouvez vous débarrasser de «feat», «scale» et «Page». ('Page' ne fonctionnera que si vous utilisez des pages pilotées par les données).

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

Vous pouvez utiliser l' outil Map Extent to Polygon :

Crée une entité surfacique à partir de l'étendue de la carte actuelle. Dans la disposition, l'étendue sera du bloc de données de la carte, dans l'affichage des données, l'étendue résultante sera de l'étendue de la fenêtre d'application. La rotation du bloc de données n'est pas prise en charge.



0

Si vous n'avez besoin de le faire qu'une seule fois, vous pouvez trouver les extensions dans la fenêtre des propriétés du bloc de données. Ensuite, vous pouvez créer un nouveau fichier de formes, ajouter une nouvelle fonction, cliquer avec le bouton droit et choisir d'entrer manuellement les coordonnées correspondant aux coins.

Sinon, allez avec le script de @ artwork21.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.