Czy tworzysz plik kształtu z bieżących zakresów ramek danych w widoku układu ArcMap?

11

Gdzie jest narzędzie ArcGIS 10 do tworzenia pliku kształtu z bieżących zakresów ramek danych w widoku układu?

Rozejrzałem się dookoła, a najbliższą rzeczą, jaką mogę znaleźć, jest narzędzie Toolbox's Grid / Strip Map Index w obszarze Data Drive Pages.

Chcę tylko móc utworzyć plik shp z pojedynczego prostokąta wielokąta na podstawie ramki danych (w widoku układu) dla dowolnej konfiguracji skali / strony.

Sirgeo
źródło
korzystasz z narzędzia mapbook, czy po prostu chcesz utworzyć wielokąt shp dla jednego widoku układu?
grafika 21
tylko dla jednego widoku układu
sirgeo
Jeśli dotyczy to wstawionej mapy, sprawdź opcję wskaźnika zasięgu we właściwościach ramki danych. Jeśli jest to z innych powodów, po prostu napisałbym dla niego skrypt w języku Python.
MLowry
Ile czasu zajmie napisanie skryptu python dla tego MLowry? Służy do eksportowania obrazów rastrowych z ArcGIS do AutoCad i będzie potrzebny wiele razy w przyszłości. Właśnie pobrałem VS Express i dam CK Kirka, ale praca z tymi rzeczami wykracza daleko poza moją bazę wiedzy.
sirgeo,

Odpowiedzi:

11

W ArcGIS 10. stworzyłem narzędzie do tego za pomocą Przybornika. Może być łatwiejszy w użyciu niż skrypt. Możesz go pobrać tutaj . Po prostu skopiuj pliki mxd do folderu i uruchom narzędzie w tym folderze. Utworzy plik kształtu zawierający wszystkie główne zakresy każdego pliku mxd w tym folderze.

nickpeihl
źródło
7

Tego kodu c # można użyć do zbudowania dodatku dla 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;                        
        }
    }
}

Podczas tworzenia nowego projektu dodatku w Visual Studio powinieneś zobaczyć kilka takich opcji. Nie jestem pewien, czy działa z Visual Studio Express, czy też należy zainstalować ArcObjects SDK.

wprowadź opis zdjęcia tutaj

Kirk Kuykendall
źródło
Dzięki, Kirk, to będzie moja pierwsza próba użycia nowego Kreatora dodatków ArcGIS. Pierwsze pytanie brzmi „1. Uruchom Visual Studio” Gdzie jest Visual Studio? pobieranie? Jestem dunce programistycznym, więc proszę wyjaśnij to delikatnie.
sirgeo,
Nigdy go nie używałem, ale powinieneś móc pobrać bezpłatną („Express”) wersję Visual Studio tutaj . Ten link mówi „... ze względu na ograniczenia w Expressowych wersjach Visual Studio, nie wszystkie funkcje frameworku są obsługiwane w edycjach Express”. Nie mówią jednak, które funkcje.
Kirk Kuykendall
OK, pobrałem 700mb VS Express i teraz instaluję 3,4GB rzeczy ... Czego jeszcze będzie wymagał Kreator dodatków ArcGIS?
Sirgeo,
Nie jestem pewien, ale może być konieczne zainstalowanie „ArcObjects SDK dla środowiska Microsoft”. Mam to zainstalowane na moim komputerze. Jednak nigdy nie próbowałem utworzyć dodatku bez niego.
Kirk Kuykendall
cóż, przejdę do kroku 2 „Kliknij Plik, wybierz Nowy i kliknij Projekt. Zostanie otwarte okno dialogowe Nowy projekt”. ale krok 3 „W obszarze Typy projektów rozwiń węzeł projektu Visual Basic lub Visual C #, rozwiń węzeł ArcGIS i kliknij Dodatki pulpitu”. nie ma sensu ... zrzut ekranu tutaj: i.imgur.com/jHuJ6.png
sirgeo
3

Oto podstawowy skrypt Pythona do tworzenia wielokąta z zakresu ramki danych. Dostosuj zmienną do swoich potrzeb. Jeśli chcesz po prostu wielokąta o prostym zasięgu, możesz pozbyć się „feat”, „scale” i „Page”. („Strona” będzie działać tylko wtedy, gdy korzystasz ze stron opartych na danych).

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
źródło
2

Możesz użyć narzędzia Rozszerz mapę na wielokąt :

Tworzy element wielokąta z bieżącego zasięgu mapy. W układzie zasięg będzie obejmował ramkę danych mapy, w widoku danych wynikowy zasięg będzie obejmował zakres okna aplikacji. Obracanie ramki danych nie jest obsługiwane.

grafika 21
źródło
0

Jeśli musisz to zrobić tylko raz, zakres możesz znaleźć w oknie właściwości ramki danych. Następnie możesz utworzyć nowy plik kształtu, dodać nową funkcję, kliknąć prawym przyciskiem myszy i wybrać ręczne wprowadzenie współrzędnych odpowiadających narożnikom.

W przeciwnym razie przejdź do skryptu z @ artwork21.

Patrick
źródło