¿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.


¿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.


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í


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

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.



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.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.