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.

sirgeo
sumber
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.

nickpeihl
sumber
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

Kirk Kuykendall
sumber
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
jbalk
sumber
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.

artwork21
sumber
1

Ini Buat Data Bingkai polygon tool bekerja di ArcGIS Desktop 10.3

Muat add-in, lalu sesuaikan bilah alat (atau buat yang baru) dan tambahkan.

Charles di Sumter
sumber
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.

Patrick
sumber
0

Saya melihat portal NOAA ini dengan sebuah program.
Script - meluas ke shapefile
Saya tahu saya pernah melihatnya di suatu tempat. Masih mencari.
Berikut adalah beberapa alat ddp di pusat sumber daya.

Brad Nesom
sumber
saya dulu menggunakan yang di 9,3 Untuk beberapa alasan itu tidak berfungsi di 10
sirgeo