#1 Tue 23 July 2013 09:29
- auroreh
- Juste Inscrit !
- Date d'inscription: 23 Jul 2013
- Messages: 3
Erreur de Geoprocessor lors de la création d'un fishnet
Bonjour à tous,
Je suis débutante en VB.Net (avec ArcGIS 10) et j'essaie de créer une fonction qui me permette de créer un fishnet (outil create a fishnet dans ArcGIS, ArcToolBox DataManagement). L'utilisateur entre la couche vecteur et la taille de cellule et le code fait le reste (détermination de l'enveloppe avec le top, bottom, right et left, du nombre de lignes et du nombre de colonnes, etc.). Je définis une FeatureClass avant d'exécuter le Geoprocessing.
Cependant, j'ai une erreur dont le message est : "Une erreur HRESULT E_FAIL a été retournée à partir d'un appel à un composant COM."
Je ne vois pas où se situe l'erreur. Peut-être dans la définition du CreateFishnet...
Avez-vous une idée ou une piste qui pourrait expliquer l'erreur ? Cette question a peut-être déjà été posée mais je n'ai pas trouvé de liens permettant de résoudre l'erreur.
Merci par avance de vos réponses.
aurore
Code:
Public Shared Sub CreateFishnet(ByVal pMap As IMap, ByVal strLayerNameVector As String, ByVal IntCellSize As Integer) Try '1- Récupération de la couche vecteur If pMap Is Nothing Then MessageBox.Show("Fonction CreateFishnet : IMap n'est pas récupéré.") Exit Sub End If Dim lngIdLayer As Long = 0 lngIdLayer = FindIdLayerByName(strLayerNameVector, pMap) Dim player As ILayer2 player = pMap.Layer(lngIdLayer) If player Is Nothing Then MessageBox.Show("Fonction CreateFishnet : ILayer n'est pas récupéré.") Exit Sub End If Dim pflayer As IFeatureLayer pflayer = CType(player, IFeatureLayer) Dim pFclass As IFeatureClass pFclass = pflayer.FeatureClass Dim pDataset As IDataset = CType(pFclass, IDataset) Dim pGeoDS As IGeoDataset pGeoDS = CType(player, IGeoDataset) Dim pSpatialReference As ISpatialReference pSpatialReference = pGeoDS.SpatialReference Dim strSpatialReference As String = pSpatialReference.Name Dim pEnvelope As IEnvelope = pGeoDS.Extent '2- dimensionnement de l'enveloppe pour le fishnet Dim dbl_Right As Double = pEnvelope.XMax Dim dbl_Left As Double = pEnvelope.XMin Dim dbl_Top As Double = pEnvelope.YMax Dim dbl_Bottom As Double = pEnvelope.YMin 'attribution des paramètres coordonnées Dim dbl_coordX As Double = dbl_Left Dim dbl_coordY As Double = dbl_Bottom Dim dbl_OppositeCornerX As Double = dbl_Right Dim dbl_OppositeCornerY As Double = dbl_Top 'détermination du nb de lignes et de colonnes Dim dbl_Longueur As Double = 0.0 Dim dbl_largeur As Double = 0.0 If dbl_Left < dbl_Right Then dbl_Longueur = dbl_Right - dbl_Left ElseIf dbl_Left > dbl_Right Then dbl_Longueur = dbl_Left - dbl_Right End If dbl_largeur = dbl_Top - dbl_Bottom Dim dbl_nbLignes As Double = 0.0 Dim dbl_nbColonnes As Double = 0.0 dbl_nbLignes = dbl_largeur / IntCellSize dbl_nbColonnes = dbl_Longueur / IntCellSize Dim int_nbLignes As Integer = CInt(dbl_nbLignes) Dim int_nbColonnes As Integer = CInt(dbl_nbColonnes) '3- définition des points nécessaires à la création du fishnet (maillage) Dim pPointOriginCoord As IPoint = New Point pPointOriginCoord.X = dbl_Left pPointOriginCoord.Y = dbl_Bottom Dim pPointYaxisCoord As IPoint = New Point pPointYaxisCoord.X = dbl_Left pPointYaxisCoord.Y = dbl_Bottom Dim pPointCornerCoord As IPoint = New Point pPointCornerCoord.X = dbl_Right pPointCornerCoord.Y = dbl_Top '4- Create a feature class Dim FeatureClassName As String = "test_code.shp" Dim pWorkspace As IWorkspace = pDataset.Workspace Dim featureWorkspace As IFeatureWorkspace = CType(pWorkspace, IFeatureWorkspace) ' Instantiate a feature class description to get the required fields. Dim fcDescription As IFeatureClassDescription = New FeatureClassDescriptionClass() Dim ocDescription As IObjectClassDescription = CType(fcDescription, IObjectClassDescription) Dim fields As IFields = ocDescription.RequiredFields Dim fieldsEdit As IFieldsEdit = CType(fields, IFieldsEdit) ' Add a Name text field to the required fields. Dim field As IField = New FieldClass() Dim fieldEdit As IFieldEdit = CType(field, IFieldEdit) fieldEdit.Name_2 = "Name" fieldEdit.Type_2 = esriFieldType.esriFieldTypeString fieldsEdit.AddField(field) ' Use IFieldChecker to create a validated fields collection. Dim fieldChecker As IFieldChecker = New FieldCheckerClass() Dim enumFieldError As IEnumFieldError = Nothing Dim validatedFields As IFields = Nothing fieldChecker.ValidateWorkspace = CType(featureWorkspace, IWorkspace) fieldChecker.Validate(fields, enumFieldError, validatedFields) ' The enumFieldError enumerator can be inspected at this point to determine ' which fields were modified during validation. ' Create the feature class. Dim featureClass As IFeatureClass = featureWorkspace.CreateFeatureClass(FeatureClassName, validatedFields, _ ocDescription.InstanceCLSID, ocDescription.ClassExtensionCLSID, esriFeatureType.esriFTSimple, _ fcDescription.ShapeFieldName, "") '5- Create Fishnet Dim pCreatefishnet As ESRI.ArcGIS.DataManagementTools.CreateFishnet = New CreateFishnet() pCreatefishnet.out_feature_class = featureClass 'pCreatefishnet.template = pGeoDS.Extent 'pCreatefishnet.corner_coord = pPointCornerCoord pCreatefishnet.origin_coord = pPointOriginCoord pCreatefishnet.y_axis_coord = pPointYaxisCoord pCreatefishnet.cell_height = CDbl(IntCellSize) pCreatefishnet.cell_width = CDbl(IntCellSize) pCreatefishnet.number_rows = int_nbLignes pCreatefishnet.number_columns = int_nbColonnes pCreatefishnet.labels = True pCreatefishnet.geometry_type = esriGeometryType.esriGeometryPolygon Dim pGpProcess As ESRI.ArcGIS.Geoprocessor.IGPProcess pGpProcess = CType(pCreatefishnet, ESRI.ArcGIS.Geoprocessor.IGPProcess) Dim pExecGeoprocess As New ESRI.ArcGIS.Geoprocessor.Geoprocessor pExecGeoprocess.Validate(pCreatefishnet, True) RunToolBoxGeoprocess(pExecGeoprocess, pGpProcess, Nothing) Catch ex As Exception MessageBox.Show("Fonction CreateFishnet : " & ex.Message) End Try End Sub Public Shared Sub RunToolBoxGeoprocess(ByVal geoprocessor As ESRI.ArcGIS.Geoprocessor.Geoprocessor, ByVal process As ESRI.ArcGIS.Geoprocessor.IGPProcess, ByVal TC As ITrackCancel) geoprocessor.OverwriteOutput = True geoprocessor.AddOutputsToMap = True Try geoprocessor.Execute(process, Nothing) Catch ex As Exception MessageBox.Show("Fonction RunToolBoxGeoprocess : " & ex.Message) End Try End Sub
Hors ligne
#2 Fri 26 July 2013 07:51
- auroreh
- Juste Inscrit !
- Date d'inscription: 23 Jul 2013
- Messages: 3
Re: Erreur de Geoprocessor lors de la création d'un fishnet
Hello,
Pour le suivi, je suis finalement parvenue à coder l'outil "Create a fishnet". Sous VB.NET, je récupère les variables de l'utilisateur, je réaliser les calculs nécessaires (nombre de lignes, etc.). J'ai créé une fonction VB.NET qui me permet de générer un script Python avec ces variables utilisateur et ce script est ensuite lancé dans une invite de commande (cmd) "invisible" pour l'utilisateur.
Ce processus n'est pas direct mais il fonctionne bien.
Cordialement,
aurore
Hors ligne
#3 Fri 26 July 2013 09:24
Re: Erreur de Geoprocessor lors de la création d'un fishnet
Bonjour Aurore, et bienvenue sur Georezo
Pour ceux qui s'interrogent sur le Fishnet, c'est la fonction intitulée "Créer un quadrillage" en VF : http://resources.arcgis.com/fr/help/mai … 002q000000
J'ai une question naïve : pourquoi développer une fonction en VB.net plutôt que d'exploiter le model builder ?
Merci pour le suivi dans tous les cas.
Hors ligne
#4 Fri 26 July 2013 09:33
- auroreh
- Juste Inscrit !
- Date d'inscription: 23 Jul 2013
- Messages: 3
Re: Erreur de Geoprocessor lors de la création d'un fishnet
Bonjour Robin,
Les traitements demandés et mis en place sont complexes et vont faire appel à des logiciels extérieurs pour des traitements statistiques.
Cordialement,
Aurore
Hors ligne