¿Está creando shapefile a partir de las extensiones de trama de datos actuales en la vista de diseño de ArcMap?

11

¿Dónde está la herramienta ArcGIS 10 para crear un archivo de forma a partir de las extensiones actuales del marco de datos en la vista de diseño?

He mirado a mi alrededor y lo que puedo encontrar en el armario son las herramientas de índice de mapa de cuadrícula / franja de Toolbox en Páginas de unidad de datos.

Solo quiero poder crear un solo archivo shp de rectángulo de polígono basado en el marco de datos (en la vista de diseño) para cualquier configuración de escala / página dada.

sirgeo
fuente
¿Está utilizando la herramienta de libro de mapas o simplemente desea crear un polígono shp para una vista de diseño?
artwork21
para una sola vista de diseño
sirgeo
Si se trata de un mapa insertado, consulte la opción del indicador de extensión en las propiedades del marco de datos. Si es por otras razones, simplemente escribiría un script de Python para ello.
MLowry
¿Cuánto tiempo llevaría escribir un script de Python para esta MLowry? Es para tomar exportaciones de imágenes ráster de ArcGIS a AutoCad y será necesario muchas veces en el futuro. Acabo de descargar VS Express y le daré una oportunidad a Kirk's C #, pero trabajar con estas cosas está más allá de mi base de conocimiento.
sirgeo

Respuestas:

11

Creé una herramienta para hacer esto a través de una Caja de herramientas en ArcGIS 10. Puede ser más fácil de usar que las secuencias de comandos. Puedes descargarlo aquí . Simplemente copie sus mxd (s) en una carpeta y ejecute la herramienta en esa carpeta. Creará un archivo de forma que contenga todas las extensiones principales de cada mxd en esa carpeta.

nickpeihl
fuente
7

Este código de C # podría usarse para crear un complemento para 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;                        
        }
    }
}

Cuando cree un nuevo proyecto de complemento con Visual Studio, debería ver algunas opciones como esta. No estoy seguro de si funciona con Visual Studio Express, o si ArcObjects SDK necesita ser instalado.

ingrese la descripción de la imagen aquí

Kirk Kuykendall
fuente
Gracias Kirk, este será mi primer intento de usar el nuevo Asistente de complementos de ArcGIS. Primera pregunta, dice "1. Inicie Visual Studio" ¿Dónde está Visual Studio? una descarga? Soy un tonto de programación, así que explique amablemente.
sirgeo
Nunca lo he usado, pero debería poder descargar la versión gratuita ("Express") de Visual Studio aquí . Este enlace dice "... debido a limitaciones en las versiones Express de Visual Studio, no todas las características del marco son compatibles con las ediciones Express". Sin embargo, no dicen qué características.
Kirk Kuykendall
bien, descargué el 700 Express VS Express y ahora está instalando 3.4 gb de material ... ¿qué más va a requerir el Asistente de complementos de ArcGIS?
sirgeo
No estoy seguro, pero es posible que también necesite instalar el "ArcObjects SDK para el marco de Microsoft". Lo tengo instalado en mi máquina. Sin embargo, nunca he intentado crear un complemento sin él.
Kirk Kuykendall
bueno, llegué al paso 2 "Haga clic en Archivo, seleccione Nuevo y haga clic en Proyecto. Se abre el cuadro de diálogo Nuevo proyecto" pero el paso 3 "En Tipos de proyecto, expanda el nodo del proyecto Visual Basic o Visual C #, expanda el nodo ArcGIS y haga clic en Complementos de escritorio". no tiene sentido ... captura de pantalla aquí: i.imgur.com/jHuJ6.png
sirgeo
3

Aquí hay un script básico de Python para crear un polígono a partir de la extensión del marco de datos. Ajuste la variable a sus necesidades. Si solo desea un polígono de extensión simple, puede deshacerse de 'feat', 'scale' y 'Page'. ('Página' solo funcionará si está utilizando páginas controladas por datos).

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
jbalk
fuente
2

Puede usar la herramienta Extensión de mapa a polígono :

Crea una entidad poligonal a partir de la extensión del mapa actual. En el diseño, la extensión será del marco de datos del mapa, en la vista de datos, la extensión resultante será la extensión de la ventana de la aplicación. La rotación del marco de datos no es compatible.

artwork21
fuente
1

Esta herramienta de polígono Crear marco de datos funciona en ArcGIS Desktop 10.3

Cargue el complemento, luego personalice una barra de herramientas (o cree una nueva) y agréguela.

Charles en Sumter
fuente
0

Si solo necesita hacerlo una vez, puede encontrar las extensiones en la ventana de propiedades del Marco de datos. Luego puede crear un nuevo archivo de formas, agregar una nueva característica, hacer clic con el botón derecho y elegir ingresar manualmente las coordenadas correspondientes a las esquinas.

De lo contrario, vaya con el script de @ artwork21.

Patricio
fuente