QGIS Nhập một số tệp CSV bằng Python [bản sao]
Sep 03 2020
Tôi đang cố gắng nhập một số tệp CSV bằng Python. Tuy nhiên, mã của tôi không hoạt động. Hơn nữa, tọa độ ở định dạng DMS và tôi không chắc về cách triển khai điều đó cho mã của mình.
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)
Khi chạy mã của mình, tôi nhận được các thông báo lỗi sau:
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
Dưới đây là mẫu dữ liệu trong tệp CSV.
Trả lời
3 KadirŞahbaz Sep 03 2020 at 13:02
Đối với QGIS 3, QgsMapLayerRegistrychức năng của đã được chuyển sang QgsProject. Đó là lý do tại sao bạn gặp lỗi đó.
Vì vậy, để thêm một lớp, bạn nên sử dụng cấu trúc đó:
QgsProject.instance().addMapLayers(layers)
2 ComradeChe Sep 03 2020 at 12:51
Tôi sử dụng hàm Python này để phân tích cú pháp tệp vectơ với các tính năng điểm được định dạng văn bản ngẫu nhiên:
Ví dụ về tệp Txt:
y x
58 57 39.71;73 57 32.26
Hàm 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