Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Pour sécuriser votre compte sur les forums du GeoRezo, nous demandons de changer votre mot de passe.

Vous allez recevoir un message pour effectuer ce changement de mot de passe.

Merci de bien respecter les règles préconisées.

#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

Robin
GeoRezo forever
Lieu: France
Date d'inscription: 31 Aug 2005
Messages: 13614
Site web

Re: Erreur de Geoprocessor lors de la création d'un fishnet

Bonjour Aurore, et bienvenue sur Georezo smile

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

 

Pied de page des forums

Powered by FluxBB