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

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Tue 25 August 2009 15:12

GuZzO
Juste Inscrit !
Date d'inscription: 17 Jun 2009
Messages: 9

[Arcview 9.x] Ajout de shapefile en masse

Je poste, non pas car j'ai un problème, mais en espérant que le code qui suit puisse aider certains.

Ma problématique était de sélectionner un répertoire et de parcourir toute son arborescence en chargeant tout les fichiers .shp qui s'y trouvait.

J'ai récupérer différents bouts de code et je vous propose le résultat. Il suffit de faire Alt + F11 dans Arcmap, de se placer dans Project > ThisDocument et de coller le code suivant:

Code:

Private Type BROWSEINFO
    hOwner As Long
    pidlRoot As Long
    pszDisplayName As String
    lpszTitle As String
    ulFlags As Long
    lpfn As Long
    lParam As Long
    iImage As Long
End Type

Public Enum NetWork
    WithNetworkFolders = 0
    WithoutNetworkFolders = 2
End Enum

Private Declare Function SHGetPathFromIDList Lib "shell32.dll" _
    Alias "SHGetPathFromIDListA" (ByVal pidl As Long, _
    ByVal pszPath As String) As Long

Private Declare Function SHBrowseForFolder Lib "shell32.dll" _
    Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) _
    As Long
    

Const BIF_RETURNONLYFSDIRS = &H1
Const BIF_USENEWUI = &H40


'Déclaration globale des variables
Dim colRep As New Collection
Dim colFich As New Collection
Dim scurfich As String
Dim scurdoss As String




'----------------------------------------------------------------
Public Sub Main()
    Dim chemin As String
    
    chemin = SelectFolder("C:\", WithNetworkFolders)
    scanneArborescence (chemin)

End Sub


Public Sub scanneArborescence(chemin As String)

Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")

Debug.Print chemin

'fichier racine du répertoire
For Each fichier In fso.getFolder(chemin).files
    'Si extension = .shp on ajoute à la collection
    scurfich = fichier
    If Right(GetFilename(scurfich), 4) = ".shp" Then Addshapelayer GetRepname(scurfich), GetFilename(scurfich)
Next

'dossier racine
For Each dossier In fso.getFolder(chemin).SubFolders
    scurdoss = dossier
    RecurSubFolder scurdoss
Next

Set fso = Nothing

End Sub



'Récupère le nom d'un fichier dans un chemin
Function GetFilename(fichier As String) As String

    'Position du dernier '\' qui va déterminer la position du nom du fichier
    Dim pos As Integer
    pos = InStrRev(fichier, "\")
   
    GetFilename = Mid$(fichier, pos + 1, Len(fichier))

End Function



'Récupère le chemin
Function GetRepname(fichier As String) As String

    'Position du dernier '\' qui va déterminer la position du nom du fichier
    Dim pos As Integer
    pos = InStrRev(fichier, "\")
   
    GetRepname = Mid$(fichier, 1, pos)

End Function



'Méthode récursive qui parcours les dossiers, sous-dossiers....
Sub RecurSubFolder(Folder As String)

    On Error Resume Next    'Juste au cas ou l'accès à un dossier serait refusé.

    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
   
    'Parcourt les fichiers du dossier courant
    For Each fichier In fso.getFolder(Folder).files
        'Si extension = .shp on ajoute à la collection
        scurfich = fichier
    If Right(GetFilename(scurfich), 4) = ".shp" Then Addshapelayer GetRepname(scurfich), GetFilename(scurfich)
    Next
   
    'Idem pour les dossiers sauf si il n'y a pas de sous-dossiers
    If fso.getFolder(Folder).SubFolders.Count <> 0 Then
        For Each dossier In fso.getFolder(Folder).SubFolders
            scurdoss = dossier
            RecurSubFolder (dossier)
        Next
    End If

End Sub



Public Function SelectFolder(Optional Folder As String = "" _
           , Optional NetWorkFolders As NetWork = WithNetworkFolders _
           ) As String
    Dim X As Long, bi As BROWSEINFO, dwIList As Long
    Dim szPath As String, wPos As Integer
    If Folder = "" Then Folder = CurrentProject.Path
    With bi
        .hOwner = hWndAccessApp
        .lpszTitle = "Sélectionnez votre dossier à scanner et cliquez sur OK"
        .ulFlags = BIF_RETURNONLYFSDIRS _
            Or BIF_USENEWUI _
            Or NetWorkFolders
    End With
    dwIList = SHBrowseForFolder(bi)
    szPath = Folder & Space$(512 - Len(Folder))
    X = SHGetPathFromIDList(ByVal dwIList, ByVal szPath)
    If X Then
        wPos = InStr(szPath, Chr(0))
        SelectFolder = Left$(szPath, wPos - 1)
    Else
        SelectFolder = ""
    End If
End Function



' Ajout d'une couche SHP a la carte
' IN : ShpPath : Chemin complet du dossier  ex :  h:Temp
'      ShpName : Nom de la couche ex :  monshape.shp
Public Sub Addshapelayer(ShpPath As String, ShpName As String)

Debug.Print "ShpPath : " & ShpPath
Debug.Print "ShpName : " & ShpName

' declaration du document
Dim pMxDoc As IMxDocument
Set pMxDoc = ThisDocument

' declaration de l'espace de travail : shape
Dim pWorkspaceFactory As IWorkspaceFactory
Set pWorkspaceFactory = New ShapefileWorkspaceFactory

' ouverture de l'espace de travail
Dim pWorkspace As IFeatureWorkspace         ' path du dossier
Set pWorkspace = pWorkspaceFactory.OpenFromFile(ShpPath, 0)

' ouverture du shape
Dim pClass As IFeatureClass         'nom de la couche
Set pClass = pWorkspace.OpenFeatureClass(ShpName)

' declaration d'une couche d'entite
Dim pLayer As IFeatureLayer
Set pLayer = New FeatureLayer

' affectation du shape a cette couche
Set pLayer.FeatureClass = pClass
pLayer.Name = pClass.AliasName

'-affichage de cette couche
pMxDoc.AddLayer pLayer

' reactualisation de l'affichage
pMxDoc.ActiveView.PartialRefresh esriViewGeography, pLayer, Nothing
End Sub

Pour lancer la procédure, faire Alt + F8 et executer Main.

Voilà, en espérant que ça serve!

GuZzO

Hors ligne

 

#2 Thu 27 August 2009 09:48

JEJE33
Participant actif
Lieu: Bordeaux
Date d'inscription: 29 May 2007
Messages: 121

Re: [Arcview 9.x] Ajout de shapefile en masse

Bonjour
Très bonne initiative,
je viens de le tester et c'est efficace.
En fait je ne m'étais jamais rendu compte du problème utilisant la plupart des géodatabases fichiers dans lesquelles ce genre de problématique n'existe pas.
Merci encore.

Hors ligne

 

Pied de page des forums

Powered by FluxBB