Створення формфайлу з поточних розширень фрейму даних у поданні макета ArcMap?


11

Де інструмент ArcGIS 10 для створення файлу форми з поточних розширень фрейму даних у поданні макета?

Оглянувся навколо, і шафу, яку я можу знайти, це інструменти «Сітка / Стрип-карта індексу» в панелі інструментів під Сторінками даних.

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


ви використовуєте інструмент «Mapbook» чи просто хочете створити полігон shp для одного перегляду макета?
твір21

лише для одного виду макета
sirgeo

Якщо це карта вставки, перевірте параметр індикатора масштабу у властивостях кадру даних. Якщо це з інших причин, я просто написав би сценарій python для цього.
MLowry

Скільки часу знадобиться, щоб написати сценарій пітона для цього MLowry? Він призначений для здійснення експорту растрових зображень з ArcGIS в AutoCad і буде потрібен багато разів у майбутньому. Щойно я завантажив VS Express і дам знімок Кірку на C #, але робота з цими матеріалами - це далеко поза моєю базою знань.
sirgeo

Відповіді:


11

Я створив інструмент для цього за допомогою Toolbox в ArcGIS 10. Це може бути простіше у використанні, ніж сценарій. Завантажити його можна тут . Просто скопіюйте свої mxd (s) у папку та запустіть інструмент у цій папці. Це створить файл форми, що містить усі основні розширення кожного mxd у цій папці.


7

Цей код # може бути використаний для створення надбудови для 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" Де ​​візуальна студія? завантаження? Я програміст, тому поясніть, будь ласка, обережно.
sirgeo

Я ніколи його не використовував, але ви повинні мати можливість завантажити безкоштовну ("Експрес") версію Visual Studio тут . На цьому посиланні сказано, що "... через обмеження у експрес-версіях Visual Studio не всі функції фреймворку підтримуються у виданнях Express". Вони не кажуть, які функції, однак.
Кірк Куйкендал

Гаразд, я завантажив 700 Мб VS Express і тепер він встановлює 3,4 ГБ матеріалів ... що ще потрібно майстру надбудови ArcGIS?
sirgeo

Я не впевнений, але вам може знадобитися також встановити "ArcObjects SDK для Microsoft Framework". У мене це встановлено на моїй машині. Ніколи не намагалися створити надбудову без нього.
Кірк Куйкендал

добре, я перейшов до кроку 2 "Клацніть файл, виберіть команду Створити та натисніть" Проект ". Відкриється діалогове вікно" Новий проект "." але крок 3 "У розділі Типи проектів розгорніть вузол проекту Visual Basic або Visual C #, розгорніть вузол ArcGIS і натисніть Настольні додатки." немає сенсу ... знімок екрана тут: i.imgur.com/jHuJ6.png
sirgeo

3

Ось основний скрипт python для створення полігону із обсягу даних. Відрегулюйте змінну відповідно до ваших потреб. Якщо ви просто хочете простого багатокутника, ви можете позбутися "подвигу", "масштабу" та "Сторінки". ("Сторінка" працюватиме лише тоді, коли ви використовуєте сторінки, керовані даними).

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

Ви можете скористатися інструментом « Масштаб до Полігону »:

Створює функцію багатокутника з поточного масштабу карти. У компонуванні розмір буде рамкою даних карт, у перегляді даних він отриманий обсяг буде розміром вікна програми. Обертання кадру даних не підтримується.



0

Якщо вам потрібно зробити це лише один раз, ви можете знайти розширення у вікні властивостей Data Frame. Тоді ви можете створити новий файл форми, додати нову функцію, клацнути правою кнопкою миші та вибрати вручну ввести координати, відповідні кутам.

В іншому випадку перейдіть зі сценарієм від @ artwork21.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.