QGIS Importation de plusieurs fichiers CSV à l'aide de Python [duplicate]
J'essaye d'importer plusieurs fichiers CSV en utilisant Python. Cependant, mon code ne fonctionne pas. De plus, les coordonnées sont au format DMS et je ne sais pas comment les implémenter dans mon code.
import os.path, glob
layers=[]
for file in glob.glob('/Users/NAME/Desktop/gis/weights/*'):
uri="file:///"+file+"?type=csv&xField=LON&yField=LAT&spatialIndex=no&subsetIndex=no&watchFile=no&crs=epsg:4326"
vlayer = QgsVectorLayer(uri, os.path.basename(file), "delimitedtext")
vlayer.addAttributeAlias(0,'x')
vlayer.addAttributeAlias(1,'y')
layers.append(vlayer)
QgsMapLayerRegistry.instance().addMapLayers(layers)
Lors de l'exécution de mon code, j'obtiens les messages d'erreur suivants:
Traceback (most recent call last):
File "/Applications/QGIS3.10.app/Contents/Frameworks/Python.framework/Versions/Current/lib/python3.7/code.py", line 90, in runcode exec(code, self.locals) File "<input>", line 1, in <module>
File "<string>", line 10, in <module> NameError: name 'QgsMapLayerRegistry' is not defined
Vous trouverez ci-dessous un échantillon des données du fichier CSV.
Réponses
Pour QGIS 3, QgsMapLayerRegistryla fonctionnalité de a été déplacée vers QgsProject. C'est pourquoi vous obtenez cette erreur.
Donc, pour ajouter une couche, vous devez utiliser cette structure:
QgsProject.instance().addMapLayers(layers)
J'utilise cette fonction Python pour analyser des fichiers vectoriels avec des caractéristiques ponctuelles au format texte aléatoire:
Exemple de fichier txt:
y x
58 57 39.71;73 57 32.26
Fonction Python:
def load_layer_from_text(text_file_path, x_field_name, y_field_name, delimeter, decimal_separator, epsg_number, DMS=False):
'''Add layer from text file'''
uri = qgis.core.QgsDataSourceUri()
layer_name = 'temp_layer'
text_file_path_encoded = urllib.parse.quote(text_file_path)
uri_as_string = \
f'file:///{text_file_path_encoded}?' \
f'delimiter={delimeter}' \
f'&xField={x_field_name}' \
f'&yField={y_field_name}' \
f'&crs=epsg:{str(epsg_number)}' \
f'&detectTypes=yes' \
f'&decimalPoint={decimal_separator}'
if DMS:
uri_as_string += '&xyDms=yes'
layer = qgis.core.QgsVectorLayer(uri_as_string, layer_name, 'delimitedtext')
if layer.isValid():
return layer
else:
print('Error! Vector layer was not validated:')
print(uri_as_string)
return None