Tạo shapefile từ phạm vi khung dữ liệu hiện tại trong chế độ xem bố cục của ArcMap?


11

Công cụ ArcGIS 10 ở đâu để tạo một shapefile từ phạm vi khung dữ liệu hiện tại trong chế độ xem bố cục?

Đã nhìn xung quanh và thứ mà tôi có thể tìm thấy là các công cụ Chỉ mục Bản đồ Lưới / Dải của Hộp công cụ trong Trang Ổ đĩa Dữ liệu.

Tôi chỉ muốn có thể tạo một tệp shp hình chữ nhật đa giác duy nhất dựa trên khung dữ liệu (trong chế độ xem bố cục) cho bất kỳ thiết lập tỷ lệ / trang nào.


bạn đang sử dụng công cụ mapbook hay chỉ muốn tạo một đa giác shp cho một chế độ xem bố cục?
nghệ thuật21

chỉ cho một chế độ xem bố cục
sirgeo

Nếu đây là bản đồ chèn, hãy xem tùy chọn chỉ báo phạm vi trong thuộc tính khung dữ liệu. Nếu đó là vì lý do khác, tôi sẽ chỉ viết một kịch bản python cho nó.
MLowry

Sẽ mất bao nhiêu thời gian để viết một kịch bản python cho MLowry này? Nó dành cho việc xuất hình ảnh raster từ ArcGIS sang AutoCad và sẽ cần thiết nhiều lần trong tương lai. Tôi vừa tải xuống VS Express và sẽ cung cấp cho C # của Kirk một shot nhưng làm việc với những thứ này vượt xa kiến ​​thức của tôi.
sirgeo

Câu trả lời:


11

Tôi đã tạo một công cụ để thực hiện việc này thông qua Hộp công cụ trong ArcGIS 10. Nó có thể dễ sử dụng hơn so với kịch bản. Bạn có thể tải nó ở đây . Chỉ cần sao chép mxd (s) của bạn vào một thư mục và chạy công cụ trên thư mục đó. Nó sẽ tạo một shapefile chứa tất cả các phạm vi chính của mỗi mxd trong thư mục đó.


7

Mã c # này có thể được sử dụng để xây dựng bổ trợ cho 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;                        
        }
    }
}

Khi bạn tạo một dự án bổ trợ mới với Visual Studio, bạn sẽ thấy một số tùy chọn như thế này. Tôi không chắc liệu nó có hoạt động với Visual Studio Express không, hoặc liệu SDK ArcObjects có cần được cài đặt hay không.

nhập mô tả hình ảnh ở đây


Cảm ơn Kirk, đây sẽ là nỗ lực đầu tiên của tôi khi sử dụng Trình hướng dẫn bổ trợ ArcGIS mới. Câu hỏi đầu tiên, nó nói "1. Bắt đầu Visual Studio" Visual Studio ở đâu? tải về? Tôi là một dunce lập trình vì vậy hãy giải thích nhẹ nhàng.
sirgeo

Tôi chưa bao giờ sử dụng nó, nhưng bạn sẽ có thể tải xuống phiên bản miễn phí ("Express") của Visual Studio tại đây . Liên kết này cho biết "... do các giới hạn trong các phiên bản Express của Visual Studio, không phải tất cả các tính năng của khung đều được hỗ trợ trong các phiên bản Express." Họ không nói những tính năng mặc dù.
Kirk Kuykendall

được rồi, tôi đã tải xuống 700mb VS Express và bây giờ nó đang cài đặt 3,4gb công cụ ... Trình hướng dẫn bổ trợ ArcGIS sẽ yêu cầu gì nữa?
sirgeo

Tôi không chắc chắn, nhưng bạn cũng có thể cần phải cài đặt "SDK ArcObjects cho khung Microsoft". Tôi đã cài đặt nó trên máy của tôi. Chưa bao giờ cố gắng tạo một Bổ trợ mà không có nó mặc dù.
Kirk Kuykendall

tôi cũng đã đến bước 2 "Bấm vào Tệp, chọn Mới và bấm Dự án. Hộp thoại Dự án mới mở ra." nhưng bước 3 "Trong các loại Dự án, mở rộng nút dự án Visual Basic hoặc Visual C #, mở rộng nút ArcGIS và nhấp vào Bổ trợ máy tính để bàn." không có ý nghĩa ... ảnh chụp màn hình ở đây: i.imgur.com/jHuJ6.png
sirgeo

3

Đây là một kịch bản python cơ bản để tạo một đa giác từ phạm vi khung dữ liệu. Điều chỉnh biến cho phù hợp với nhu cầu của bạn. Nếu bạn chỉ muốn một đa giác phạm vi đơn giản, bạn có thể thoát khỏi 'feat', 'scale' và 'Page'. ('Trang' sẽ chỉ hoạt động nếu bạn đang sử dụng các trang điều khiển dữ liệu).

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

Bạn có thể sử dụng công cụ Map Extent to Polygon :

Tạo một tính năng đa giác từ phạm vi bản đồ hiện tại. Trong bố cục, phạm vi sẽ là của khung dữ liệu bản đồ, trong chế độ xem dữ liệu, phạm vi kết quả sẽ thuộc phạm vi cửa sổ ứng dụng. Xoay khung dữ liệu không được hỗ trợ.



0

Nếu bạn chỉ cần thực hiện một lần, bạn có thể tìm thấy các phạm vi trong cửa sổ thuộc tính Khung dữ liệu. Sau đó, bạn có thể tạo một shapefile mới, thêm một tính năng mới, nhấp chuột phải và chọn nhập thủ công các tọa độ tương ứng với các góc.

Nếu không thì đi với kịch bản từ @ tác phẩm nghệ thuật21.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.