I am trying to get the bounding box of my labels in a vector layer in PyQGIS (Version: 3.30.2-'s-Hertogenbosch) with the following script but I need to create a vector layer from a WKT file and not a GeoPackage file.
But here is my attempt to to render the labels with the source of the vector layer being a WKT file. Notice I am using a style file as well.
I am getting the following error - see Zero Results comment below: 'NoneType' object has no attribute 'allLabels' Why am I getting zero results for the labels with the WKT file but not using a GeoPackage file. Does a GeoPackage file contain more or different information that would effect this?
layer_name = 'MyLayer'
crs = QgsCoordinateReferenceSystem()
crs.createFromWkt(wkt)
layer = QgsVectorLayer('Point?crs=epsg:4326', layer_name, 'memory')
layer.setCrs(crs)
layer.startEditing()
# Add attribute field for label text
field_name = "Name"
field = QgsField(field_name, QVariant.String)
layer.addAttribute(field)
# Open the input file
with open(input_file, "r") as file:
header = file.readline().strip().split("|")
label_index = header.index(label_column)
for line in file:
values = line.strip().split("|")
wkt = values[0]
label = values[label_index]
feature = QgsFeature()
geometry = QgsGeometry.fromWkt(wkt)
print(QgsWkbTypes.displayString(geometry.wkbType()))
if geometry.wkbType() == QgsWkbTypes.Point:
print(geometry.asPoint())
feature.setGeometry(geometry)
feature.setAttributes([label])
layer.addFeature(feature)
print("Feature Count:", layer.featureCount())
if layer.isValid():
QgsProject.instance().addMapLayer(layer)
canvas = QgsMapCanvas()
canvas.setLayers([layer])
canvas.setExtent(layer.extent())
layer_settings = QgsPalLayerSettings()
layer_settings.fieldName = field_name
layer_settings = QgsVectorLayerSimpleLabeling(layer_settings)
layer.setLabelsEnabled(True)
layer.setLabeling(layer_settings)
map_settings = canvas.mapSettings()
render = QgsMapRendererParallelJob(map_settings)
render.start()
render.waitForFinished()
labeling_results = render.takeLabelingResults() # <== Zero Results
# labels = labeling_results.allLabels()
# if labels:
# for l in labels:
# if l.featureId == feature.id() and l.layerID == layer.id():
# geometry = l.labelGeometry
for feature in layer.getFeatures():
print("Dump features ...")
attributes = feature.attributes()
print("Feature ID:", feature.id())
print("Geometry wkt:", feature.geometry().asWkt())
print("Geometry alternate:", feature.geometry())
label_field_name = layer.labeling().settings().fieldName
print("Attributes:", attributes)
for idx, attribute in enumerate(attributes):
print(label_field_name + ":", attribute)
print("------")
GeoPackage approach (this works!):
layer = QgsVectorLayer(layer_file, "my-layer", "ogr")
canvas = QgsMapCanvas()
canvas.setLayers([layer])
canvas.setExtent(layer.extent())
layer_settings = QgsPalLayerSettings()
layer_settings.fieldName = "name"
layer_settings = QgsVectorLayerSimpleLabeling(layer_settings)
layer.setLabelsEnabled(True)
layer.setLabeling(layer_settings)
map_settings = canvas.mapSettings()
render = QgsMapRendererParallelJob(map_settings)
render.start()
render.waitForFinished()
labeling_results = render.takeLabelingResults()
labels = labeling_results.allLabels()
print(labels)
if labels:
for l in labels:
print("label labelRect: ", l.labelRect)
print("label labelText: ", l.labelText)
print("label width: ", l.width)
print("label height: ", l.height)
geometry = l.labelGeometry
print(geometry)
label_bounding_box = geometry.boundingBox()
print("bounding box: ", label_bounding_box)
print("bb center: ", label_bounding_box.center)
print("bb x1: ", label_bounding_box.xMinimum)
print("bb y1: ", label_bounding_box.yMinimum)
print("bb x2: ", label_bounding_box.xMaximum)
print("bb y2: ", label_bounding_box.yMaximum)