การสร้าง shapefile จากขอบเขตข้อมูลปัจจุบันในมุมมองเค้าโครงของ ArcMap?


11

เครื่องมือ ArcGIS 10 อยู่ที่ไหนสำหรับการสร้างรูปร่างไฟล์จากส่วนขยายของ dataframe ปัจจุบันในมุมมองเค้าโครง

ได้ดูไปรอบ ๆ และสิ่งที่ตู้เสื้อผ้าที่ฉันสามารถหาได้คือเครื่องมือดัชนีแผนที่กริด / สตริปของ Toolbox ภายใต้ Data Drive Pages

ฉันแค่ต้องการที่จะสร้างไฟล์ shp รูปหลายเหลี่ยมสี่เหลี่ยมเดียวขึ้นอยู่กับ data frame (ในมุมมองเลย์เอาต์) สำหรับการตั้งค่าสเกล / หน้าใด ๆ


คุณใช้เครื่องมือ mapbook หรือเพียงแค่ต้องการสร้างรูปหลายเหลี่ยม shp สำหรับมุมมองเค้าโครงเดียว
artwork21

สำหรับมุมมองเค้าโครงเดียว
sirgeo

หากนี่เป็นแผนที่ที่ใส่เข้าไปให้ตรวจสอบตัวเลือกขอบเขตในคุณสมบัติกรอบข้อมูล หากเป็นเพราะเหตุผลอื่นฉันจะเขียนสคริปต์ของหลาม
MLowry

ต้องใช้เวลานานเท่าใดในการเขียนสคริปต์ python สำหรับ MLowry นี้ มีไว้สำหรับการส่งออกภาพแรสเตอร์จาก ArcGIS ไปยัง AutoCad และจะต้องใช้หลายครั้งในอนาคต ฉันเพิ่งดาวน์โหลด VS Express และจะให้ C # ของ Kirk แต่การทำงานกับสิ่งนี้มันเกินกว่าฐานความรู้ของฉัน
sirgeo

คำตอบ:


11

ฉันสร้างเครื่องมือเพื่อทำสิ่งนี้ผ่านกล่องเครื่องมือใน ArcGIS 10 มันอาจจะใช้งานง่ายกว่าการเขียนสคริปต์ คุณสามารถดาวน์โหลดได้ที่นี่ เพียงแค่คัดลอก mxd ของคุณไปยังโฟลเดอร์แล้วเรียกใช้เครื่องมือบนโฟลเดอร์นั้น มันจะสร้างรูปร่างไฟล์ที่มีขอบเขตหลักทั้งหมดของแต่ละ mxd ในโฟลเดอร์นั้น


7

รหัส C # ซึ่งอาจนำมาใช้เพื่อสร้าง add-in สำหรับ 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;                        
        }
    }
}

เมื่อคุณสร้างโครงการ Add-in ใหม่ด้วย Visual Studio คุณควรเห็นตัวเลือกบางอย่างเช่นนี้ ฉันไม่แน่ใจว่าสามารถใช้งานได้กับ Visual Studio Express หรือไม่จำเป็นต้องติดตั้ง ArcObjects SDK

ป้อนคำอธิบายรูปภาพที่นี่


ขอบคุณ Kirk นี่จะเป็นความพยายามครั้งแรกของฉันในการใช้ ArcGIS Add-In Wizard ใหม่ คำถามแรกมันบอกว่า "1. เริ่ม Visual Studio" Visual Studio อยู่ที่ไหน? ดาวน์โหลดหรือไม่ ฉันเป็นคนโง่โปรแกรมดังนั้นโปรดอธิบายเบา ๆ
sirgeo

ฉันไม่เคยใช้ แต่คุณควรจะสามารถดาวน์โหลดฟรี ( "ด่วน") รุ่น Visual Studio ที่นี่ ลิงค์นี้ระบุว่า "... เนื่องจากข้อ จำกัด ใน Visual Express เวอร์ชัน Express ไม่รองรับคุณสมบัติทั้งหมดของเฟรมเวิร์กในรุ่น Express" พวกเขาไม่ได้บอกว่าที่มี แต่
Kirk Kuykendall

ตกลงฉันดาวน์โหลด 700mb VS Express และตอนนี้มันกำลังติดตั้งสิ่งที่ 3.4gb ... ตัวช่วยสร้าง ArcGIS Add-Ins จะต้องมีอะไรอีกบ้าง
sirgeo

ฉันไม่แน่ใจ แต่คุณอาจต้องติดตั้ง "ArcObjects SDK สำหรับกรอบงาน Microsoft" ด้วย ฉันติดตั้งไว้ในเครื่องของฉันแล้ว ไม่เคยพยายามสร้าง Add-in โดยไม่ได้ทำ
Kirk Kuykendall

ดีฉันได้ไปที่ขั้นตอนที่ 2 "คลิกไฟล์เลือกใหม่และคลิกโครงการกล่องโต้ตอบโครงการใหม่จะเปิดขึ้น" แต่ขั้นตอนที่ 3 "ภายใต้ชนิดโครงการขยายโหนด Visual Basic หรือ Visual C # โครงการขยายโหนด ArcGIS และคลิก Add-in เดสก์ท็อป" ไม่มีเหตุผล ... screen shot ที่นี่: i.imgur.com/jHuJ6.png
sirgeo

3

นี่คือสคริปต์หลามพื้นฐานในการสร้างรูปหลายเหลี่ยมจากขอบเขตดาต้าเฟรม ปรับตัวแปรให้เหมาะกับความต้องการของคุณ หากคุณต้องการรูปหลายเหลี่ยมที่เรียบง่ายคุณสามารถกำจัด '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

คุณสามารถใช้เครื่องมือMap Extent to Polygon :

สร้างคุณสมบัติรูปหลายเหลี่ยมจากขอบเขตแผนที่ปัจจุบัน ในเลย์เอาต์ขอบเขตจะเป็นกรอบข้อมูลแผนที่ในมุมมองข้อมูลขอบเขตผลลัพธ์จะเป็นขอบเขตหน้าต่างแอปพลิเคชัน ไม่รองรับการหมุนเฟรมข้อมูล



0

หากคุณต้องการทำเพียงครั้งเดียวคุณสามารถค้นหาส่วนขยายได้ในหน้าต่างคุณสมบัติกรอบข้อมูล จากนั้นคุณสามารถสร้างรูปร่างไฟล์ใหม่เพิ่มคุณสมบัติใหม่คลิกขวาและเลือกที่จะป้อนพิกัดที่สอดคล้องกับมุมด้วยตนเอง

ไม่เช่นนั้นให้ใช้สคริปต์จาก @ artwork21


0

ฉันเห็นพอร์ทัล NOAA นี้พร้อมโปรแกรม
สคริปท์ - ขยายไปจนถึงรูปร่างไฟล์
ฉันรู้ว่าฉันเห็นสิ่งนั้นแล้ว ยังคงตามหา.
นี่คือเครื่องมือ ddp สองสามตัวในศูนย์ทรัพยากร


ฉันเคยใช้อันนั้นใน 9.3 ด้วยเหตุผลบางอย่างมันไม่ทำงานในวันที่ 10
sirgeo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.