Mehr

ArcObjects: ExportOperationClass verursacht Fehler und wird nicht exportiert

ArcObjects: ExportOperationClass verursacht Fehler und wird nicht exportiert


Ich versuche, jede Zeile in ein Shapefile zu exportieren, aber ich erhalte einen Fehler, den ich noch nie gesehen habe (siehe unten). Ich habe das Gefühl, dass es das Labyrinth der Schnittstellen sein könnte, zwischen denen ich werfen muss, die den Fehler verursachen können. Ich muss jedoch nahe dran sein, da ich einen Fortschrittsbalken für die Export-Feature-Class (siehe unten) erhalte, der dann von dem Fehler überschrieben wird.

Code:

try { IMxDocument mxdoc = ArcMap.Application.Document as IMxDocument; IMap-Karte = mxdoc.FocusMap; for (int i = 0; i < map.LayerCount; i++) { ILayer layer = map.Layer[i]; if (layer.Name == "lga_polygon") { if (layer ist IFeatureLayer) { IFeatureLayer flayer = Layer as IFeatureLayer; IFeatureClass fc = flayer.FeatureClass; IDataset pDataset = flayer als IDataset; IDatasetName pDatasetName = pDataset.FullName as IDatasetName; string lgaName = "LGA_NAME"; IFields-Felder = fc.Fields; int lgaNameFieldIndex = Felder.FindField(lgaName); IField lgaNameField = Felder.Field[lgaNameFieldIndex]; IFeatureCursor lgaCursor = fc.Search(null, true); IFeature lga = lgaCursor.NextFeature(); while (lga != null) { string nameOfLGA = lga.Value[lgaNameFieldIndex].ToString(); IDatasetName dsName = new FeatureDatasetNameClass(); dsName.Name = nameOfLGA; IFeatureClassName fcName = dsName as IFeatureClassName; IWorkspaceName pWorkspaceName = new WorkspaceNameClass(); pWorkspaceName.PathName = "C:BenutzerBenutzernameDokumenteArcGISDefault.gdb"; pWorkspaceName.WorkspaceFactoryProgID = "esriDataSourcesFile.FileGDBWorkspaceFactory"; IQueryFilter qFilt = new QueryFilterClass(); qFilt.WhereClause = "LGA_NAME = '" + nameOfLGA + "'"; IGeographicCoordinateSystem pGCS = new GeographicCoordinateSystemClass(); SpatialReferenceEnvironment spatRefEnv = new SpatialReferenceEnvironmentClass(); ISpatialReference spatRef; pGCS = spatRefEnv.CreateGeographicCoordinateSystem(Convert.ToInt16(esriSRGeoCSType.esriSRGeoCS_GDA1994)); spatRef = pGCS als ISpatialReference; IGeometryDef geoDef = new GeometryDefClass(); IGeometryDefEdit geoDefEdit = geoDef as IGeometryDefEdit; geoDefEdit.SpatialReference_2 = spatRef; geoDefEdit.GeometryType_2 = fc.ShapeType; IGeometryDef geoDef2 = geoDefEdit als IGeometryDef; IExportOperation exportOp = new ExportOperationClass(); exportOp.ExportFeatureClass(pDatasetName, qFilt, null, geoDef2, fcName, ArcMap.Application.hWnd); lga = lgaCursor.NextFeature(); } } } } } catch (Ausnahme ex) { MessageBox.Show(ex.Message + "

" + ex.Source + "

" + ex.StackTrace); }

Error:


Beachten Sie zunächst, dass die Schnittstelle IExportOperation keine Feature-Classes oder Tabellen exportiert, die ein BloB-Feld enthalten. Wenn also ein Blob-Feld in Ihrem Featurelayer vorhanden ist, sollten Sie stattdessen "FeatureClassToFeatureClass" verwenden.

In Ihrer Frage haben Sie erwähnt, dass Sie jede Zeile in ein Shapefile exportieren möchten, aber in Ihrem Exportpfad legen Sie einen Pfad zu einer File-Geodatabase fest!

Hier sind einige Fehler in Ihrem Code:

Du musst benutzen

IDatasetName dsName = new FeatureClassNameClass();

an Stelle von

IDatasetName dsName = new FeatureDatasetNameClass();

und es ist am besten, Ihre Objekte außerhalb Ihrer Schleife zu instanziieren.

Ein weiteres Problem mit Ihrem Code (Hauptproblem) besteht darin, dass Sie den workspaceName Ihrer Ausgabe-Feature-Class nicht festlegen:

dsName.Name = nameOfLGA; dsName.WorkspaceName = pWorkspaceName;

Ich habe deinen Code geändert und jetzt funktioniert es einwandfrei:

try { IMxDocument mxdoc = ArcMap.Application.Document as IMxDocument; IMap-Karte = mxdoc.FocusMap; for (int i = 0; i < map.LayerCount; i++) { ILayer layer = map.Layer[i]; if (layer.Name == "lga_polygon") { if (layer ist IFeatureLayer) { IFeatureLayer flayer = Layer as IFeatureLayer; IFeatureClass fc = flayer.FeatureClass; IDataset pDataset = flayer als IDataset; IDatasetName pDatasetName = pDataset.FullName as IDatasetName; string lgaName = "LGA_NAME"; IFields-Felder = fc.Fields; int lgaNameFieldIndex = Felder.FindField(lgaName); IField lgaNameField = Felder.Field[lgaNameFieldIndex]; IFeatureCursor lgaCursor = fc.Search(null, true); IWorkspaceName pWorkspaceName = new WorkspaceNameClass(); pWorkspaceName.PathName = "C:BenutzerBenutzerDokumenteArcGISDefault.gdb"; pWorkspaceName.WorkspaceFactoryProgID = "esriDataSourcesFile.FileGDBWorkspaceFactory"; IGeographicCoordinateSystem pGCS = new GeographicCoordinateSystemClass(); SpatialReferenceEnvironment spatRefEnv = new SpatialReferenceEnvironmentClass(); ISpatialReference spatRef; pGCS = spatRefEnv.CreateGeographicCoordinateSystem(Convert.ToInt16(esriSRGeoCSType.esriSRGeoCS_GDA1994)); spatRef = pGCS als ISpatialReference; IGeometryDef geoDef = new GeometryDefClass(); IGeometryDefEdit geoDefEdit = geoDef as IGeometryDefEdit; geoDefEdit.SpatialReference_2 = spatRef; geoDefEdit.GeometryType_2 = fc.ShapeType; IFeature lga = lgaCursor.NextFeature(); while (lga != null) { string nameOfLGA = lga.Value[lgaNameFieldIndex].ToString(); IDatasetName dsName = new FeatureClassNameClass(); dsName.Name = nameOfLGA; dsName.WorkspaceName = pWorkspaceName; IFeatureClassName outfcName = dsName as IFeatureClassName; IQueryFilter qFilt = new QueryFilterClass(); qFilt.WhereClause = "name = '" + nameOfLGA + "'"; IExportOperation exportOp = new ExportOperationClass(); exportOp.ExportFeatureClass(pDatasetName, qFilt, null, geoDef, outfcName, 0); lga = lgaCursor.NextFeature(); } } } } } catch (Ausnahme ex) { MessageBox.Show(ex.Message + "

" + ex.Source + "

" + ex.StackTrace); }

Stellen Sie nur sicher, dass die Daten in Ihrem lga_name-Feld eindeutig sind, da Sie dann eine bereits exportierte Feature-Class durch eine neue mit demselben Namen ersetzen müssen


In deinem Code hast du:

pWorkspaceName.PathName = "C:BenutzerBenutzernameDokumenteArcGISDefault.gdb"; pWorkspaceName.WorkspaceFactoryProgID = "esriDataSourcesFile.ShapefileWorkspaceFactory";

Da Sie den Pfadnamen als File-Geodatabase definiert haben, sollte die Workspacefactory wie folgt lauten:

pWorkspaceName.WorkspaceFactoryProgID = "esriDataSourcesGDB.FileGDBWorkspaceFactory";

MEF Exportieren und Importieren von abstrakten Typen

Ich habe eine Factory-Klasse, die eine Liste von IOperation-Typen importiert. Ich erhalte die folgende Fehlermeldung, wenn ich versuche, die Factory-Klasse aufzulösen:

Teil 'Message36Operation' kann nicht aktiviert werden. Element: Message36Operation --> Message36Operation --> DirectoryCatalog (Path=".")

Export 'Message36Operation (ContractName="IOperation")' aus Teil 'Message36Operation' kann nicht abgerufen werden. Element: Message36Operation (ContractName="IOperation") --> Message36Operation --> DirectoryCatalog (Path=".")

Der Import von 'OperationsFactory.Operations (ContractName="IOperation")' für Teil 'OperationsFactory' kann nicht festgelegt werden. Element: OperationsFactory.Operations (ContractName="IOperation") --> OperationsFactory --> AssemblyCatalog (Assembly="RmiToODKMessanger, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")

Die Ausnahme wird ausgelöst, wenn ich versuche, eine Instanz der Factory aufzulösen.

Ich kann dies zum Laufen bringen, wenn ich die abstrakte Klasse entferne.

Unten ist die BaseRmiOperation-Klasse. Ich instanziiere ein paar Klassen im cstor und das war's.


Fehler beim Zusammenfassen innerhalb des Werkzeugs (ArcGIS Pro)

Hallo! Ich versuche, eine einfache Analyse mit zwei Vektorebenen durchzuführen: eine mit Wassereinzugsgebieten und eine mit Wasserkörpern. Ich habe die Fläche für den Layer Wasserkörper berechnet, sodass alle Attribute in diesem Layer die Fläche in Quadratkilometern haben. Ich versuche, das Werkzeug "Innerhalb zusammenfassen" mit den beiden Ebenen zu verwenden, um die prozentuale Wasserfläche in jeder Wasserscheide zu finden. Aber nachdem ich das Tool ausgeführt hatte, erhielt ich einen Fehler, der praktisch keine Informationen darüber liefert, warum es fehlgeschlagen ist. Ich habe unten einen Screenshot des Fehlers angehängt. Ich freue mich über jede Anleitung oder Lösung, die Sie alle haben. Vielen Dank!

von KoryKramer

Das bietet bis zu 9 Dinge zum Ausprobieren:

  1. Null-Geometrie, kurze Segmente, Selbstschnittpunkte und andere Geometrieprobleme in Ihrer Feature-Class können diesen Fehler verursachen. Führen Sie Geometrie reparieren aus, um Geometrieprobleme zu beheben.
  2. Überprüfen Sie den Namen, den Sie zum Erstellen der Ausgabe verwenden möchten. Nicht-alphanumerische Zeichen werden in einer Geodatabase nicht unterstützt. Ebenso dürfen Geodatabase-Datennamen nicht mit einer Zahl beginnen. Die folgenden Wörter sind ebenfalls reservierte Schlüsselwörter in der Geodatabase, sodass diese Wörter nicht allein als Dataset-Name verwendet werden können, obwohl sie als Teil eines längeren Namens verwendet werden können:
    • ADD, ALTER, AND, BETWEEN, BY, COLUMN, CREATE, DELETE, DROP, EXISTS, FOR, FROM, GROUP, IN, INSERT, INTO, IS, LIKE, NOT, NULL, OR, ORDER, SELECT, SET, TABLE, AKTUALISIEREN, WERTE, WO
    • Weitere Informationen zur Benennung von Geodatabase-Daten
    • Weitere Informationen zu Größen- und Namensbeschränkungen für File-Geodatabases
  3. Überprüfen Sie den Speicherort, an dem Sie versuchen, eine Ausgabe zu erstellen. Können Sie im Windows Explorer zum Speicherort navigieren? Können Sie Dateien außerhalb von ArcGIS an diesen Speicherort kopieren und einfügen? Wenn ein Windows-Dialogfeld mit der Meldung angezeigt wird, dass eine Berechtigung zum Kopieren von Dateien an den Speicherort erforderlich ist, besteht eine gute Chance, dass dies der Grund für den Fehler des Tools ist.
  4. Wenn Sie mit einem sehr großen Dataset arbeiten, können Sie diesen Fehler möglicherweise vermeiden, indem Sie die Daten in kleinere Blöcke aufteilen. Verwenden Sie das Werkzeug Ausschneiden (Raster) oder Ausschneiden (Features), um eine kleinere Teilmenge Ihrer Daten zu erstellen, und führen Sie das Werkzeug für diese Teilmenge aus. Wenn dies erfolgreich ist, können Sie zusätzliche Teilmengen der Originaldaten erstellen und das Tool für alle Teilmengen ausführen.
  5. Wenn Sie mit Shapefile-Eingaben oder -Ausgaben arbeiten, verwenden Sie stattdessen eine File-Geodatabase. Sie haben möglicherweise ein spezielles Problem mit Shapefiles. Sie können es auch umgekehrt versuchen: Exportieren Sie Ihre File-Geodatabase-Klasse in ein Shapefile und versuchen Sie, das Shapefile zu verwenden. Wenn Sie bei Raster-Daten mit einem dateibasierten Raster wie einer TIF-Datei oder einem Esri GRID arbeiten, versuchen Sie, es in eine Geodatabase zu exportieren. Umgekehrt können Sie auch versuchen, das betreffende Raster in eine .tif-Datei zu exportieren und den Vorgang erneut versuchen.
  6. Wenn Ihr Ausgabedatenpfad sehr lang ist (viele Unterordner oder einen sehr langen Namen enthält), können Sie versuchen, die Ausgabe mit einem kurzen Namen an einem Ort in der Nähe des Stammverzeichnisses des Laufwerks zu erstellen. Versuchen Sie nicht, die Ausgabe im Stammverzeichnis eines Laufwerks zu erstellen, da moderne Betriebssysteme normalerweise die Datei- und Datenerstellung an diesem Ort ohne spezielle oder administrative Erlaubnis verhindern.
  7. Sie können versuchen, ArcGIS Pro im Administratormodus auszuführen. Klicken Sie mit der rechten Maustaste auf die Anwendungsverknüpfung und wählen Sie Als Administrator ausführen aus. Führen Sie die zuvor fehlgeschlagene Aufgabe aus. Wenn der Fehler durch Zugriffsberechtigungen verursacht wurde, kann die Ausführung als Administrator dazu führen, dass der Vorgang erfolgreich abgeschlossen wird.
  8. Die meisten Geoverarbeitungswerkzeuge können erfolgreich Datenattribute verwenden, die Null sind, aber gelegentlich können diese Nullwerte ein Problem verursachen. Sie können dies testen, indem Sie eine Kopie Ihrer Daten erstellen und mit Feld berechnen alle Nullwerte durch 0 oder einen anderen ausgewählten Wert ersetzen (einige verwenden -1, um Null anzuzeigen). Wenn Sie mit Raster-Daten arbeiten, können Sie mit dem Werkzeug Con alle Nullwerte durch 0 oder einen anderen ausgewählten Wert ersetzen.
  9. Temporäre oder Zwischendaten werden oft in den Speicherort C:Users geschrieben.AppDataLocalTemp (auf diesen Speicherort kann durch Eingabe von %localappdata% emp in Windows Explorer zugegriffen werden). Schließen Sie ArcGIS Pro , löschen Sie das Temp-Verzeichnis, starten Sie die Anwendung neu, und wiederholen Sie den Vorgang.

Wie dieser Fehler jedoch anzeigt, betrachtet das Geoverarbeitungsteam die 999999 selbst gerne als Fehler, da sie bei einem reproduzierbaren Fall diesen beheben möchten, um den Fehler zu behandeln und eine informativere Meldung bereitzustellen.


Ursache

Vor ArcGIS 10.2.1 wurden Shapefiles im Sprachgebietsschema des Systems codiert, auf dem das Shapefile erstellt wurde. Ab Version 10.2.1 werden Shapefiles immer in UTF-8 kodiert, was auf Systemen ein Problem darstellt, die Sprachen mit Multibyte-Zeichenkodierung verwenden, wie z. B. Chinesisch, Japanisch oder Russisch.

Dieses Problems wird dadurch verursacht, dass die Zeichenfolgenlänge für Shapefiles in Bytes und nicht in Zeichen gemessen wird. Die von UTF-8 auferlegte Begrenzung auf zehn Zeichen für die Länge eines Shapefile-Feldnamens beträgt also tatsächlich zehn Byte.

Da japanische Zeichen beispielsweise drei Bytes pro Zeichen benötigen, wird die Begrenzung auf drei Zeichen für einen Shapefile-Feldnamen reduziert. Das andere Problem sind Textfelder. Ein drei Byte breites Textfeld kann nur ein Zeichen enthalten. Dies bedeutet, dass Daten, die aus Japanisch (SJIS) nach UTF-8 exportiert wurden, möglicherweise in den Textfeldwerten abgeschnitten werden. Die Kürzung wird gemeldet und jeder Zeichenfolge wird ein Sternchen (*) hinzugefügt.