ArcMap'in mizanpaj görünümünde geçerli veri çerçevesi uzantılarından şekil dosyası oluşturuluyor mu?


11

Düzen görünümünde geçerli veri çerçevesi uzantılarından şekil dosyası oluşturmak için ArcGIS 10 aracı nerede?

Etrafa baktım ve bulabileceğim dolap, Data Drive Pages altındaki Toolbox'ın Izgara / Şerit Harita Dizini araçları.

Ben sadece herhangi bir ölçek / sayfa kurulumu için veri çerçevesi (mizanpaj görünümünde) dayalı tek bir çokgen dikdörtgen shp dosyası oluşturmak istiyorum .


eşleme aracını mı kullanıyorsunuz, yoksa yalnızca bir mizanpaj görünümü için shp çokgen mi oluşturmak istiyorsunuz?
artwork21

bir düzen görünümü için
sirgeo

Bu bir içsel harita içinse, veri çerçevesi özelliklerindeki kapsam göstergesi seçeneğine bakın. Başka nedenlerden ötürü, bunun için sadece bir python komut dosyası yazarım.
MLowry

Bu MLowry için bir python betiği yazmak ne kadar sürer? Raster görüntü ihracatını ArcGIS'ten AutoCad'e almak içindir ve gelecekte birçok kez gerekli olacaktır. VS Express'i indirdim ve Kirk's C # 'ı vereceğim ama bu şeylerle çalışmak benim bilgi tabanımın çok ötesinde.
sirgeo

Yanıtlar:


11

Bunu ArcGIS 10'da bir Toolbox aracılığıyla yapmak için bir araç oluşturdum. Kullanmak komut dosyasından daha kolay olabilir. Buradan indirebilirsiniz . Yalnızca mxd'lerinizi bir klasöre kopyalayın ve aracı bu klasörde çalıştırın. Bu klasördeki her bir mxd'nin tüm ana uzantılarını içeren bir şekil dosyası oluşturur.


7

Bu c # kodu Arcmap için bir eklenti oluşturmak için kullanılabilir .

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 ile yeni bir eklenti projesi oluşturduğunuzda, bunun gibi bazı seçenekler görmelisiniz. Visual Studio Express ile çalışıp çalışmadığından veya ArcObjects SDK'nın yüklenmesi gerekip gerekmediğinden emin değilim.

resim açıklamasını buraya girin


Teşekkürler Kirk, bu yeni ArcGIS Eklentileri Sihirbazı'nı kullanarak ilk denemem olacak. İlk soru, "1. Visual Studio Başlat" yazıyor Visual Studio nerede? bir indirme? Ben programlama dunce'ım bu yüzden lütfen nazikçe açıklayın.
sirgeo

Hiç kullanmadım, ancak Visual Studio'nun ücretsiz ("Express") sürümünü buradan indirebilmelisiniz . Bu bağlantıda "... Visual Studio'nun Express sürümlerindeki sınırlamalar nedeniyle, çerçevenin tüm özellikleri Express sürümlerinde desteklenmez." Ancak hangi özellikleri söylemiyorlar .
Kirk Kuykendall

Tamam, 700MB VS Express'i indirdim ve şimdi 3.4GB'lık bir şey yüklüyor ... ArcGIS Eklentileri Sihirbazı başka ne gerektirecek?
sirgeo

Emin değilim, ama "Microsoft framework için ArcObjects SDK" da yüklemeniz gerekebilir. Makineme yükledim. Olmadan bir eklenti oluşturmaya çalışmadım.
Kirk Kuykendall

iyi adım 2 "Dosya'yı tıklatın, Yeni'yi seçin ve Proje'yi tıklatın. Yeni Proje iletişim kutusu açılır." ancak adım 3 "Proje türleri altında, Visual Basic veya Visual C # proje düğümünü genişletin, ArcGIS düğümünü genişletin ve Masaüstü Eklentileri'ni tıklatın." hiçbir anlam ifade etmiyor ... ekran görüntüsü burada: i.imgur.com/jHuJ6.png
sirgeo

3

İşte veri çerçevesi boyutundan bir çokgen oluşturmak için temel bir python betiği. Değişkeni ihtiyaçlarınıza göre ayarlayın. Sadece basit bir çokgen istiyorsanız, 'feat', 'scale' ve 'Page' klasörlerinden kurtulabilirsiniz. ('Sayfa' yalnızca veri odaklı sayfalar kullanıyorsanız çalışır).

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

Çokgenle Eşleme Haritasını kullanabilirsiniz :

Geçerli harita boyutundan bir çokgen özelliği oluşturur. Düzende, kapsam, harita veri çerçevesinden, veri görünümünde ise sonuç kapsamı, uygulama penceresi kapsamından olacaktır. Veri çerçevesi döndürme desteklenmez.



0

Bunu yalnızca bir kez yapmanız gerekiyorsa, uzantıları Veri Çerçevesi özellikleri penceresinde bulabilirsiniz. Ardından yeni bir şekil dosyası oluşturabilir, yeni bir özellik ekleyebilir, sağ tıklayıp köşelere karşılık gelen koordinatları manuel olarak girmeyi seçebilirsiniz.

Aksi takdirde @ artwork21'deki komut dosyası ile gidin.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.