在ArcMap的布局视图中从当前数据框范围创建shapefile?


11

从布局视图中的当前数据框范围创建shapefile的ArcGIS 10工具在哪里?

环顾四周,我可以找到的壁橱是Data Drive Pages下的Toolbox的Grid / Strip Map Index工具。

我只希望能够为任何给定的比例/页面设置基于数据框(在布局视图中)创建单个多边形矩形shp文件。


您是在使用mapbook工具,还是只想为一个布局视图创建一个shp多边形?
艺术品21年

仅用于一个布局视图
sirgeo 2011年

如果这是插图,请在数据框属性中签出范围指示器选项。如果是出于其他原因,我将为此编写一个python脚本。
Mowry

为此MLowry编写Python脚本需要花费多少时间?它用于将栅格图像从ArcGIS导出到AutoCad,将来将需要多次使用。我刚刚下载了VS Express,将为Kirk的C#提供一试,但是使用这些东西远远超出了我的知识范围。
sirgeo 2011年

Answers:


11

我创建了一个工具来通过ArcGIS 10中的“工具箱”来执行此操作。它可能比脚本更易于使用。您可以在此处下载。只需将您的mxd复制到一个文件夹中,然后在该文件夹上运行该工具即可。它将创建一个shapefile,其中包含该文件夹中每个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。

在此处输入图片说明


谢谢Kirk,这是我第一次使用新的ArcGIS加载项向导。第一个问题是“ 1.启动Visual Studio”。VisualStudio在哪里?下载?我是一个编程笨拙的人,所以请轻轻地解释一下。
sirgeo 2011年

我从来没有使用过它,但你应该能够下载免费的(“新快报”)的Visual Studio版本在这里。该链接显示 “ ...由于Visual Studio Express版本的限制,Express版本不支持框架的所有功能。” 他们没有说哪个功能。
Kirk Kuykendall

好的,我下载了700mb VS Express,现在它正在安装3.4gb的东西... ArcGIS加载项向导还需要什么?
sirgeo 2011年

我不确定,但是您可能还需要安装“用于Microsoft框架的ArcObjects SDK”。我已经在机器上安装了它。从来没有尝试过创建没有它的加载项。
Kirk Kuykendall

好吧,我进入了步骤2“单击文件,选择新建,然后单击项目。“新建项目”对话框打开。但要执行步骤3“在项目类型下,展开Visual Basic或Visual C#项目节点,展开ArcGIS节点,然后单击桌面加载项。” 毫无意义...此处的屏幕截图:i.imgur.com/jHuJ6.png
sirgeo 2011年

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

您可以使用“将范围映射到多边形”工具:

从当前地图范围创建面要素。在布局中,范围是地图数据框的范围,在数据视图中,结果范围是应用程序窗口范围的范围。不支持数据框旋转。



0

如果只需要执行一次,则可以在“数据框”属性窗口中找到范围。然后,您可以创建一个新的shapefile,添加一个新特征,单击鼠标右键,然后选择手动输入与角对应的坐标。

否则,请使用@ artwork21中的脚本。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.