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


11

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

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

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


Вы используете инструмент картографирования или просто хотите создать полигон shp для одного вида макета?
— artwork21

только для одного вида макета
— sirgeo

Если это для карты вставки, проверьте параметр индикатора экстента в свойствах фрейма данных. Если это по другим причинам, я бы просто написал для него скрипт на Python.
— MLowry

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

Ответы:


11

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


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

2

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

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



0

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

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.