Criando shapefile a partir das extensões atuais do dataframe na exibição de layout do ArcMap?

11

Onde está a ferramenta ArcGIS 10 para criar um arquivo de forma a partir das extensões atuais do quadro de dados na exibição de layout?

Olhei em volta e a coisa que eu mais encontro no armário é as ferramentas de Índice de Mapa de Grade / Faixa do Toolbox em Data Drive Pages.

Eu só quero criar um único arquivo shp de retângulo de polígono com base no quadro de dados (na exibição de layout) para qualquer configuração de escala / página.

sirgeo
fonte
você está usando a ferramenta mapbook ou apenas deseja criar um polígono shp para uma exibição de layout?
artwork21
para apenas uma exibição de layout
sirgeo
Se for para um mapa inserido, verifique a opção do indicador de extensão nas propriedades do quadro de dados. Se for por outras razões, eu apenas escreveria um script python para ele.
MLowry
Quanto tempo levaria para escrever um script python para este MLowry? É destinado a exportar imagens rasterizadas do ArcGIS para o AutoCad e será necessário várias vezes no futuro. Acabei de baixar o VS Express e darei uma chance ao C # de Kirk, mas trabalhar com esse material está muito além da minha base de conhecimento.
sirgeo

Respostas:

11

Eu criei uma ferramenta para fazer isso por meio de uma caixa de ferramentas no ArcGIS 10. Talvez seja mais fácil usar do que scripts. Você pode baixá-lo aqui . Apenas copie seus mxd (s) em uma pasta e execute a ferramenta nessa pasta. Ele criará um shapefile contendo todas as principais extensões de cada mxd nessa pasta.

nickpeihl
fonte
7

Esse código c # pode ser usado para criar um suplemento para o 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;                        
        }
    }
}

Ao criar um novo projeto de suplemento com o Visual Studio, você verá algumas opções como esta. Não tenho certeza se ele funciona com o Visual Studio Express ou se o ArcObjects SDK precisa ser instalado.

insira a descrição da imagem aqui

Kirk Kuykendall
fonte
Obrigado Kirk, esta será minha primeira tentativa de usar o novo ArcGIS Add-Ins Wizard. Primeira pergunta: "1. Inicie o Visual Studio" Onde está o Visual Studio? um download? Eu sou um burro de programação, por favor, explique gentilmente.
sirgeo
Eu nunca o usei, mas você poderá fazer o download da versão gratuita ("Express") do Visual Studio aqui . Este link diz "... devido a limitações nas versões Express do Visual Studio, nem todos os recursos da estrutura são suportados nas edições Express". Eles não dizem quais recursos embora.
precisa saber é o seguinte
ok, baixei o 700mb VS Express e agora está instalando 3,4 GB de material ... o que mais o ArcGIS Add-Ins Wizard vai exigir?
sirgeo 15/08/11
Não tenho certeza, mas pode ser necessário instalar o "ArcObjects SDK para a estrutura da Microsoft" também. Eu o tenho instalado na minha máquina. Porém, nunca tentei criar um suplemento sem ele.
precisa saber é o seguinte
bem, cheguei à etapa 2 "Clique em Arquivo, selecione Novo e clique em Projeto. A caixa de diálogo Novo Projeto é aberta." mas etapa 3 "Em Tipos de projeto, expanda o nó do projeto Visual Basic ou Visual C #, expanda o nó ArcGIS e clique em Suplementos da área de trabalho". não faz sentido ... captura de tela aqui: i.imgur.com/jHuJ6.png
sirgeo 15/08
3

Aqui está um script python básico para criar um polígono a partir da extensão do quadro de dados. Ajuste a variável para atender às suas necessidades. Se você deseja apenas um polígono de extensão simples, pode se livrar de 'feat', 'scale' e 'Page'. ('Página' funcionará apenas se você estiver usando páginas controladas por dados).

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
fonte
2

Você pode usar a ferramenta Map Extent to Polygon :

Cria um recurso de polígono a partir da extensão atual do mapa. No layout, a extensão será do quadro de dados do mapa; na visualização de dados, a extensão resultante será da extensão da janela do aplicativo. A rotação do quadro de dados não é suportada.

artwork21
fonte
1

Essa ferramenta de polígono Criar quadro de dados funciona no ArcGIS Desktop 10.3

Carregue o suplemento, personalize uma barra de ferramentas (ou crie uma nova) e adicione-a.

Charles em Sumter
fonte
0

Se você precisar fazer isso apenas uma vez, poderá encontrar as extensões na janela de propriedades do Quadro de Dados. Em seguida, você pode criar um novo arquivo de forma, adicionar um novo recurso, clicar com o botão direito do mouse e optar por inserir manualmente as coordenadas correspondentes aos cantos.

Caso contrário, vá com o script de @ artwork21.

Patrick
fonte
0

Eu vejo este portal NOAA com um programa.
Script - extensão para shapefile
Eu sei que já vi isso em algum lugar. Ainda olhando.
Aqui estão algumas ferramentas de ddp no centro de recursos.

Brad Nesom
fonte
Eu costumava usar que um em 9.3 Por algum motivo ele não funciona em 10
sirgeo