Suite

ArcSDE vers Shapefile Async dans .NET

ArcSDE vers Shapefile Async dans .NET


J'ai une question sur l'exportation d'une classe d'entités (versionnée) stockée dans une géodatabase ArcSDE vers un fichier de formes avec VB.Net. J'ai créé le code qui, je pense, devrait fonctionner correctement, mais ArcObjects "dit non", accompagné du message indiquant que le fichier source (la classe d'entités ArcSDE) est introuvable.

Comme dit, j'ai une classe d'entités dans une base de données ArcSDE et je veux qu'elle soit exportée vers un fichier de formes pour une utilisation locale. Auparavant, j'utilisais la méthode IExportOperation.ExportFeatureClass pour ces opérations, mais en raison des limitations de cette méthode, je souhaite la réécrire. En suivant la documentation ESRI, la meilleure chose à faire est de featureclass à featureclass ou de Copyfeatureclass.

L'objectif principal du code source est :

  • Async, pas les géoprocesseurs eux-mêmes, mais il y a plusieurs tâches qui utilisent la procédure. Le problème existe même avec une seule tâche (les autres sont désactivées à des fins de débogage). Chaque tâche a son propre espace de travail

  • Une copie locale de la classe d'entités ArcSDE

Les deux géoprocesseurs ont besoin d'un chemin vers la classe source et le fichier de formes cible. La cible n'est pas un problème (elle est locale, donc facile à récupérer), mais le diable est dans la source. Comment connecter le géoprocesseur à la classe d'entités versionnée dans ArcSDE.

La documentation disait que je devais créer un fichier de connexion SDE, c'est ce que j'ai fait.

Fonction publique partagée createSDEConnectionFile(Location As String, SDEFileName As String, ServerName As String, DabaseName As String, ServiceName As String, _ UserName As String, Pwd As String, VersionName As String) As String Dim GP As IGeoProcessor2 = Nouveaux paramètres GeoProcessor Dim As IVariantArray = New VarArray If Not SDEFileName.EndsWith(".sde") Then SDEFileName += ".sde" If File.Exists(Location & SDEFileName) Then File.Delete(Location & SDEFileName) parameters.Add(Location) 'folderName parameters .Add(SDEFileName) 'FileName parameters.Add(ServerName) 'serverName parameters.Add(ServiceName) 'serviceName parameters.Add(DabaseName) 'databaseName parameters.Add("DATABASE_AUTH") 'authType parameters.Add(UserName) 'username parameters .Add(Pwd) 'password parameters.Add("SAVE_USERNAME") parameters.Add(VersionName) 'versionName parameters.Add("SAVE_VERSION") 'saveVersionInfo Dim result As IGeoProcessorResult2 = Nothing Try result = GP.Execute("CreateArcSDEConnectionFile_management", paramètre eters, Nothing) Dim conn_file As String = result.GetOutput(0).GetAsText() Return conn_file Catch ex As Exception Throw ex End Try End Function

Et j'ai utilisé ce fichier pour créer l'espace de travail pour le géoprocesseur, comme expliqué par la documentation ESRI

Public Shared Sub DBFC2FC(ByVal SourceName As String, ByVal TargetName As String, ByVal TargetLocation As String, ByVal OutputM As Boolean, ByVal OutputZ As Boolean, ByVal SDEFile As String) Dim GP As IGeoProcessor2 = New GeoProcessor Dim gpParams As IVariantArray = New VarArray Dim ZFlag As String = "DISABLED" Dim MFlag As String = "DISABLED" Dim TargetPath As String Essayez GP.ResetEnvironments() GP.SetEnvironmentValue("workspace", SDEFile) TargetPath = DOTNETLib.Win32Api.GetLongPath(DOTNETLib.Win32Api. )) If Not TargetName.EndsWith(".shp") Then TargetName += ".shp" If OutputM Then MFlag = "ENABLED" If OutputZ Then ZFlag = "ENABLED" GP.SetEnvironmentValue("OutputZFlag", ZFlag) GP.SetEnvironmentValue ("OutputMFlag", MFlag) gpParams.Add(SourceName) ' in gpParams.Add(UCase(TargetPath)) ' outpath gpParams.Add(TargetName) ' outname gpParams.Add("") ' whereClause GP.AddOutputsToMap = False GP. Execute("FeatureClassToFeatureClass_conversion", gpParams, Nothing) ex As Exception Throw Enfin ReleaseComObject (gpParams) ReleaseComObject (GP) End Try End Sub

Et là, je suis bloqué. Je me retrouve dans la capture de la méthode, et le GP.getmessage(3) me donne le retour suivant : ERREUR 000732 : Fonctionnalités d'entrée : L'ensemble de données part1Name.part2Name_Part3Name n'existe pas ou n'est pas pris en charge.

Cependant, le jeu de données mentionné existe et peut être ouvert avec le fichier .SDE créé lorsqu'il est utilisé dans ArcCatalog.

Je serais très heureux si quelqu'un pouvait m'indiquer mon erreur ou si quelqu'un pouvait m'indiquer une meilleure solution.


J'ai trouvé le problème. La création du fichier *.sde fonctionne avec une connexion ArcSDE. Mais lorsque vous utilisez une connexion directe sur votre serveur, la propriété "serviceName" est renseignée avec une valeur erronée (comme : "sde:oracle10g" au lieu d'une instance, comme "5152"). Au moins, le géoprocesseur n'accepte pas cela.

parameters.Add(ServiceName) 'serviceName

Lorsque je passe à une autre base de données sans connexion directe, le code fonctionne correctement. Ainsi, lorsque la connexion directe est utilisée, une autre solution est requise et utilisez le géoprocesseur CreateDatabaseConnection_management au lieu de CreateArcSDEConnectionFile_management.

Voir la documentation ici


Voir la vidéo: How to get Openstreetmap data in shapefile type