ArcMap의 레이아웃보기에서 현재 데이터 프레임 범위에서 shapefile을 작성합니까?


11

레이아웃 뷰에서 현재 데이터 프레임 범위에서 모양 파일을 생성하는 ArcGIS 10 도구는 어디에 있습니까?

주변을 둘러보고 가장 가까운 것은 데이터 드라이브 페이지 아래의 도구 상자 그리드 / 스트립 맵 인덱스 도구입니다.

주어진 스케일 / 페이지 설정에 대한 데이터 프레임 (레이아웃보기)을 기반으로 단일 다각형 직사각형 shp 파일 을 만들 수 있기를 원합니다 .


맵북 도구를 사용 중입니까, 아니면 하나의 레이아웃보기에 대해 shp 다각형을 만들려고합니까?
artwork21

레이아웃보기 하나
sirgeo

이 맵이 삽입 맵인 경우 데이터 프레임 속성에서 범위 표시기 옵션을 확인하십시오. 다른 이유로라면 파이썬 스크립트를 작성하면됩니다.
MLowry

이 MLowry에 대한 파이썬 스크립트를 작성하는 데 시간이 얼마나 걸립니까? ArcGIS에서 AutoCad로 래스터 이미지 내보내기를 수행하기위한 것이며 앞으로 여러 번 필요할 것입니다. 방금 VS Express를 다운로드했으며 Kirk의 C #에 대한 정보를 제공하지만이 자료를 사용하는 것은 지식 기반을 넘어서는 것입니다.
sirgeo

답변:


11

ArcGIS 10의 Toolbox를 통해이를 수행 할 수있는 도구를 만들었습니다. 스크립팅보다 사용이 더 쉬울 수 있습니다. 여기에서 다운로드 할 수 있습니다 . mxd를 폴더에 복사하고 해당 폴더에서 도구를 실행하십시오. 해당 폴더에있는 각 mxd의 모든 주요 범위를 포함하는 shapefile을 만듭니다.


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 시작"이라고합니다. Visual Studio는 어디에 있습니까? 다운로드? 나는 프로그래밍 듀스이므로 부드럽게 설명하십시오.
sirgeo

사용하지는 않았지만 Visual Studio의 무료 ( "Express") 버전을 여기 에서 다운로드 할 수 있어야합니다 . 이 링크 는 "... Express 버전의 Visual Studio의 제한으로 인해 프레임 워크의 모든 기능이 Express 버전에서 지원되는 것은 아닙니다."라고 말합니다. 그들은 어떤 기능을 말하지 않습니다 .
Kirk Kuykendall

좋아, 700mb VS Express를 다운로드했는데 이제 3.4GB를 설치하고 있습니다. ArcGIS Add-Ins Wizard에 필요한 것은 무엇입니까?
sirgeo

확실하지 않지만 "Microsoft 프레임 워크 용 ArcObjects SDK"도 설치해야합니다. 내 컴퓨터에 설치했습니다. 그럼에도 불구하고 추가 기능을 만들려고 시도한 적이 없습니다.
Kirk Kuykendall

2 단계 "파일을 클릭하고 새로 만들기를 선택한 다음 프로젝트를 클릭하십시오. 새 프로젝트 대화 상자가 열립니다." 3 단계 "프로젝트 유형에서 Visual Basic 또는 Visual C # 프로젝트 노드를 확장하고 ArcGIS 노드를 확장 한 다음 데스크탑 추가 기능을 클릭하십시오." 이해가 안
돼요

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

Extent to Polygon 도구 사용할 수 있습니다 :

현재지도 범위에서 다각형 피처를 만듭니다. 레이아웃에서 익스텐트는 맵 데이터 프레임의 범위가되며, 데이터 뷰에서 익스텐트는 애플리케이션 창 범위가됩니다. 데이터 프레임 회전은 지원되지 않습니다.



0

한 번만 수행해야하는 경우 데이터 프레임 속성 창에서 범위를 찾을 수 있습니다. 그런 다음 새 모양 파일을 작성하고 새 형상을 추가 한 후 마우스 오른쪽 버튼을 클릭하고 모서리에 해당하는 좌표를 수동으로 입력하도록 선택할 수 있습니다.

그렇지 않으면 @ artwork21의 스크립트를 사용하십시오.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.