Membuat shapefile dari luasan dataframe saat ini dalam tampilan tata letak ArcMap?


11

Di mana alat ArcGIS 10 untuk membuat shapefile dari luasan dataframe saat ini dalam tampilan tata letak?

Telah melihat-lihat dan hal yang bisa saya temukan adalah Toolbox's Grid / Strip Map Index tool di bawah Data Drive Pages.

Saya hanya ingin dapat membuat file shp persegi panjang poligon tunggal berdasarkan bingkai data (dalam tampilan tata letak) untuk setiap skala / pengaturan halaman yang diberikan.


apakah Anda menggunakan alat mapbook, atau hanya ingin membuat poligon shp untuk satu tampilan tata letak?
artwork21

hanya untuk satu tampilan tata letak
sirgeo

Jika ini untuk peta inset, periksa opsi indikator luas pada properti bingkai data. Jika karena alasan lain, saya hanya akan menulis skrip python untuk itu.
MLowry

Berapa banyak waktu yang diperlukan untuk menulis skrip python untuk MLowry ini? Ini untuk mengambil ekspor gambar raster dari ArcGIS ke AutoCad dan akan dibutuhkan berkali-kali di masa depan. Saya baru saja mengunduh VS Express dan akan mencoba Kirk's C # tetapi bekerja dengan hal-hal ini jauh di luar basis pengetahuan saya.
sirgeo

Jawaban:


11

Saya membuat alat untuk melakukan ini melalui Toolbox di ArcGIS 10. Mungkin lebih mudah digunakan daripada scripting. Anda dapat mengunduhnya di sini . Cukup salin mxd Anda ke folder dan jalankan alat di folder itu. Ini akan membuat shapefile yang berisi semua luasan utama dari setiap mxd di folder itu.


7

Kode c # ini dapat digunakan untuk membangun add-in untuk 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;                        
        }
    }
}

Saat Anda membuat proyek tambahan baru dengan Visual Studio, Anda akan melihat beberapa opsi seperti ini. Saya tidak yakin apakah itu berfungsi dengan Visual Studio Express, atau apakah ArcObjects SDK perlu diinstal.

masukkan deskripsi gambar di sini


Terima kasih Kirk, ini akan menjadi upaya pertama saya menggunakan Wisaya Tambah ArcGIS yang baru. Pertanyaan pertama, tertulis "1. Mulai Visual Studio" Di mana Visual Studio? unduhan? Saya bodoh pemrograman jadi tolong jelaskan dengan lembut.
sirgeo

Saya belum pernah menggunakannya, tetapi Anda harus dapat mengunduh versi gratis ("Express") dari Visual Studio di sini . Tautan ini mengatakan "... karena keterbatasan dalam versi Express Visual Studio, tidak semua fitur kerangka didukung dalam edisi Express." Mereka tidak mengatakan fitur mana .
Kirk Kuykendall

oke, saya mengunduh 700mb VS Express dan sekarang menginstal 3.4gb hal ... apa lagi yang dibutuhkan oleh ArcGIS Add-Ins Wizard?
sirgeo

Saya tidak yakin, tetapi Anda mungkin perlu menginstal "ArcObjects SDK untuk kerangka Microsoft" juga. Saya sudah menginstalnya di mesin saya. Belum pernah mencoba membuat Add-in tanpanya.
Kirk Kuykendall

well saya harus ke langkah 2 "Klik File, pilih New, dan klik Project. Kotak dialog Project Baru terbuka." tetapi langkah 3 "Di bawah Jenis proyek, perluas simpul proyek Visual Basic atau Visual C #, perluas simpul ArcGIS, dan klik Add-in Desktop." tidak masuk akal ... tangkapan
sirgeo

3

Berikut ini adalah skrip python dasar untuk membuat poligon dari tingkat dataframe. Sesuaikan variabel sesuai dengan kebutuhan Anda. Jika Anda hanya ingin poligon tingkat sederhana, Anda dapat menghilangkan 'feat', 'scale', dan 'Page'. ('Halaman' hanya akan berfungsi jika Anda menggunakan halaman berbasis data).

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

Anda dapat menggunakan alat Map Extent to Polygon :

Membuat fitur poligon dari tingkat peta saat ini. Dalam tata letak, luasnya akan menjadi bingkai data peta, dalam tampilan data itu tingkat yang dihasilkan akan menjadi dari batas jendela aplikasi. Rotasi bingkai data tidak didukung.



0

Jika Anda hanya perlu melakukannya sekali, Anda bisa menemukan luasan di jendela properti Frame Data. Kemudian Anda dapat membuat shapefile baru, menambahkan fitur baru, klik kanan dan pilih untuk memasukkan koordinat yang sesuai dengan sudut secara manual.

Kalau tidak pergi dengan skrip dari @ artwork21.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.