레이아웃 뷰에서 현재 데이터 프레임 범위에서 모양 파일을 생성하는 ArcGIS 10 도구는 어디에 있습니까?
주변을 둘러보고 가장 가까운 것은 데이터 드라이브 페이지 아래의 도구 상자 그리드 / 스트립 맵 인덱스 도구입니다.
주어진 스케일 / 페이지 설정에 대한 데이터 프레임 (레이아웃보기)을 기반으로 단일 다각형 직사각형 shp 파일 을 만들 수 있기를 원합니다 .
레이아웃 뷰에서 현재 데이터 프레임 범위에서 모양 파일을 생성하는 ArcGIS 10 도구는 어디에 있습니까?
주변을 둘러보고 가장 가까운 것은 데이터 드라이브 페이지 아래의 도구 상자 그리드 / 스트립 맵 인덱스 도구입니다.
주어진 스케일 / 페이지 설정에 대한 데이터 프레임 (레이아웃보기)을 기반으로 단일 다각형 직사각형 shp 파일 을 만들 수 있기를 원합니다 .
답변:
이 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를 설치해야하는지 잘 모르겠습니다.
다음은 데이터 프레임 범위에서 다각형을 만드는 기본 파이썬 스크립트입니다. 필요에 따라 변수를 조정하십시오. 단순한 범위의 다각형 만 원하면 '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
Extent to Polygon 도구 를 사용할 수 있습니다 :
현재지도 범위에서 다각형 피처를 만듭니다. 레이아웃에서 익스텐트는 맵 데이터 프레임의 범위가되며, 데이터 뷰에서 익스텐트는 애플리케이션 창 범위가됩니다. 데이터 프레임 회전은 지원되지 않습니다.
이 데이터 프레임 만들기 다각형 도구는 ArcGIS Desktop 10.3에서 작동합니다.
추가 기능을로드 한 다음 도구 모음을 사용자 정의하거나 새로 작성하십시오.