QgsTextAnnotationはQgsAnnotationから派生された地図上の注釈クラス
QgsMapToolAnnotationクラスのC++ソースを参考にPythonでQgsTextAnnotationをMapCanvas上に追加する
間違ったコード
[code]
txt = QTextDocument(‘HELLO\r\nHELLO’)
annotation = QgsTextAnnotation()
annotation.setDocument(txt)
mapPos = QgsPointXY(138.9776,35.6712)
annotation.setMapPosition(mapPos)
annotation.setMapPositionCrs(iface.mapCanvas().mapSettings().destinationCrs())
annotation.setRelativePosition(QPointF(0, 0))
#annotation.setFrameSize(QSize(100, 50))
annotation.setFrameSize(txt.size())
annotationManager = QgsProject.instance().annotationManager()
annotationManager.addAnnotation(annotation)
[/code]
※setMapPositionには緯度、経度をセットしているが必要があればMapCanvasのDestinationCrsの座標系に変換が行う。
全てのAnnotationはQgsAnnotationManagerのannotationsに入っている
[code]
annotations= QgsProject.instance().annotationManager().annotations()
for annotation in annotations :
print(annotation.document().toPlainText())
[/code]
座標を指定してMapCanvas上のAnnotationを照会するにはMapCanvasのitemsを使用する
[code]
items = iface.mapCanvas().items(QPoint(10,10))
for item in items :
if item.__class__.__name__ == ‘QgsMapToolAnnotation’ :
print(item.document().toPlainText())
[/code]
ところがここでitemsにQgsMapToolAnnotationが存在しない。
全てがQGraphicsItemになっている
どうやらPythonでQgsAnnotationをMapCanvasに追加するには「annotationManager.addAnnotation」ではなく
「QgsMapCanvasAnnotationItem」を使うみたい
正しいコード
[code]
txt = QTextDocument(‘HELLO\r\nHELLO’)
annotation = QgsTextAnnotation()
annotation.setDocument(txt)
mapPos = QgsPointXY(138.9776,35.6712)
annotation.setMapPosition(mapPos)
annotation.setMapPositionCrs(iface.mapCanvas().mapSettings().destinationCrs())
#annotation.setRelativePosition(QPointF(0, 0))
annotation.setFrameOffsetFromReferencePoint(QtCore.QPointF(30, 30))
#annotation.setFrameSize(QSize(100, 50))
annotation.setFrameSize(txt.size())
i = QgsMapCanvasAnnotationItem(annotation, iface.mapCanvas())
[/code]
setRelativePositionではなく、setFrameOffsetFromReferencePointを使用して吹き出しの位置を設定
参考