Создание шейп-файла из текущих экстентов фрейма данных в виде компоновки ArcMap?

11

Где находится инструмент ArcGIS 10 для создания шейп-файла из текущих экстентов фрейма данных в виде компоновки?

Осмотрелся и нашел что-то, что можно найти в шкафу инструментов Toolbox - индексные таблицы сетки / полосы в разделе Data Drive Pages.

Я просто хочу иметь возможность создать один shp-файл многоугольника на основе фрейма данных (в виде компоновки) для любого заданного масштаба / настройки страницы.

sirgeo
источник
Вы используете инструмент картографирования или просто хотите создать полигон shp для одного вида макета?
artwork21
только для одного вида макета
sirgeo
Если это для карты вставки, проверьте параметр индикатора экстента в свойствах фрейма данных. Если это по другим причинам, я бы просто написал для него скрипт на Python.
MLowry
Сколько времени потребуется, чтобы написать скрипт на Python для этого MLowry? Он предназначен для переноса экспорта растровых изображений из ArcGIS в AutoCad и в будущем потребуется много раз. Я только что скачал VS Express и попробую дать Кирку C #, но работа с этим материалом выходит далеко за рамки моей базы знаний.
Сиргео

Ответы:

11

Я создал инструмент для этого с помощью панели инструментов в ArcGIS 10. Это может быть проще в использовании, чем создание сценариев. Вы можете скачать его здесь . Просто скопируйте ваши mxd в папку и запустите инструмент в этой папке. Он создаст шейп-файл, содержащий все основные экстенты каждого mxd в этой папке.

nickpeihl
источник
7

Этот код C # может быть использован для создания надстройки для 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;                        
        }
    }
}

Когда вы создаете новый проект надстройки с Visual Studio, вы должны увидеть некоторые параметры, подобные этой. Я не уверен, работает ли он с Visual Studio Express или нужно установить ArcObjects SDK.

введите описание изображения здесь

Кирк Куйкендалл
источник
Спасибо, Кирк, это будет моей первой попыткой использования нового Мастера надстроек ArcGIS. Первый вопрос: «1. Запустите Visual Studio». Где находится Visual Studio? скачать? Я программист, поэтому, пожалуйста, объясните мягко.
Сиргео
Я никогда не использовал его, но вы можете загрузить бесплатную («Экспресс») версию Visual Studio здесь . Эта ссылка гласит: «... из-за ограничений в версиях Visual Studio для Express не все функции платформы поддерживаются в версиях Express». Они не говорят, какие функции, хотя.
Кирк Куйкендалл
Хорошо, я скачал 700 Мб VS Express, и теперь он устанавливает 3,4 Гб всего ... Что еще потребуется в ArcGIS Add-Ins Wizard?
Сиргео
Я не уверен, но вам также может понадобиться установить «ArcObjects SDK для платформы Microsoft». У меня это установлено на моей машине. Никогда не пытался создать надстройку без него, хотя.
Кирк Куйкендалл
Хорошо, я добрался до шага 2 «Нажмите« Файл », выберите« Новый »и нажмите« Проект ». Откроется диалоговое окно« Новый проект ».» но шаг 3 «В разделе« Типы проектов »разверните узел проекта Visual Basic или Visual C #, разверните узел ArcGIS и нажмите« Надстройки рабочего стола ». не имеет смысла ... снимок экрана здесь: i.imgur.com/jHuJ6.png
sirgeo
3

Вот базовый скрипт на Python для создания многоугольника из экстента фрейма данных. Настройте переменную в соответствии с вашими потребностями. Если вам нужен простой многоугольник экстентов, вы можете избавиться от «feat», «scale» и «Page». («Страница» будет работать, только если вы используете страницы, управляемые данными).

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
источник
2

Вы можете использовать инструмент Map Extent to Polygon :

Создает многоугольник из текущего экстента карты. В макете экстент будет отображаться во фрейме данных карты, а в представлении данных он будет иметь экстент окна приложения. Вращение фрейма данных не поддерживается.

artwork21
источник
0

Если вам нужно сделать это только один раз, вы можете найти экстенты в окне свойств Data Frame. Затем вы можете создать новый шейп-файл, добавить новый объект, щелкнуть правой кнопкой мыши и выбрать вручную ввести координаты, соответствующие углам.

В противном случае следуйте сценарию от @ artwork21.

Патрик
источник