EN | PT
Recentemente tive necessidade de colocar etiquetas de texto em elementos com geometrias muito próximas, fazendo com que as mesmas colidissem umas com as outras.
Controlando a posição das etiquetas através dos dados (para configurar rapidamente a camada usei o plugin “layer to labeled layer“) e usando a ferramenta do qgis para mover as etiquetas, foi relativamente fácil reposicioná-las de forma a que todas coubessem no mapa sem se sobreporem. Porém, em certos casos, tornou-se difícil perceber a que elemento cada uma correspondia.
Precisava de criar “linhas de guia” que, sempre que necessário, ligassem o elemento e a respectiva etiqueta. Conhecia a existência de outro excelente plugin, chamado “Easy Custom Labeling” do Regis Haubourg, que fazia o que eu pretendia, mas como criava um duplicado da camada original significava que a mesma não seria actualizada quando a camada original fosse editada.
Uma vez que os dados estavam guardados numa base de dados PostgreSQL/Postgis, decidi criar uma consulta que me devolvesse uma camada com as linhas de guia. Usei a seguinte consulta no gestor de bases de dados:
SELECT gid, label, ST_Makeline(St_setSRID(ST_PointOnSurface(geom),27493), St_setSRID(St_Point(x_label::numeric, y_label::numeric),27493)) FROM epvu.sgev WHERE x_label IS NOT NULL AND y_label IS NOT NULL AND NOT ST_Within(ST_Makeline(St_setSRID(ST_PointOnSurface(geom),27493), St_setSRID(St_Point(x_label::numeric, y_label::numeric),27493)),geom))
Esta consulta cria uma linha composta pelo centro (interno) do polígono e a coordenada do ponto para a qual a etiqueta foi movida. A última condição da cláusula WHERE garante que a linha só é criada se a coordenada da etiqueta não estiver dentro do polígono.
Com a camada resultante carregada no meu projecto, basta-me mover as etiquetas e gravar a edição da camada original para que a respectiva linha de guia apareça.
Bem lragal, Alexandre! Vc estão salvou a coordenada x e y da label (x_label, y_label), usando algum desses plugins? Ou fez isso através no banco de dados, mesmo?
Abs
oops.. quis dizer: “Bem legal…” 🙂
Olá Felipe,
As coordenadas X e Y da label, são escritas na tabela de atributos automaticamente quando se usa a ferramenta “mover label”. Mas para essa opção ficar activa na barra de ferramentas das labels, temos de definir que campos queremos usar para guardar as coordenadas. Podia fazê-lo manualmente (criar dois campos e depois nas opções das labels usá-los na posição), mas preferi usar o plugin layer to labeled layer que faz essa configuração toda de forma automática.
Thanks for sharing!
E será que o princípio aplica-se a uma base de dados spatialite, por exemplo com o makeline ?
Paulo, creio que sim. Mas numa experimentei.
obrigado. tenho que testar. muito útil o que fez.
Como faço para exportar a autocad os atributos ? preciso fazer um mapa com o nome de todas as ruas de uma cidade e poder exportar no autocad pra um projeto de ftth
Hallo Alexander, I am making a map of pottery distribution for the project I am working for and I am facing a similar problem with labels, so I tried your solution but it is not working. I am for sure making some mistakes and maybe you have some time to help me understanding where.
– I transformed the shapefile (which is a point shapefile) into a postgres table and imported it in my QGIS-project (which is in WGS84)
– I used the “Layer to labelled layer” plug-in to create the fields for the labels
– then I copied your SQL-query in the DB-Manager and changed the “gid”, “label” / 27493 / “epvu.sgev” in your query to match my fields / coordinate system / “table name” and pressed “execute”
and it returned me the following errors:
– sintax error: in line 10 the last round paranthesis was marked as a mistake and I removed it
– error: Relation „qpw_sites“ does not exist (qpw_sites is the name of my table)
and I do not really understand what the problem is here. I searched on-line and it seems a problem related to the spelling of the table name but the spelling is correct (it is auto-completed by DB manager 😀 ). I am sure I am missing something very basic since I am quite new to SQL. Thanks for your time and for sharing your work which is always a great inspiration.
Ciao
Sebastiano
Ciao Sebastiano,
Can you please send your final query? as well as the creation query of your table.
Ci vidiamo
Alexandre
Hallo Alexander, of course:
This is the query:
SELECT
id,
site_name,
ST_Makeline(St_setSRID(ST_PointOnSurface(geom),4326), St_setSRID(St_Point(LblX::numeric, LblY::numeric),4326))
FROM
qpw
WHERE
LblX IS NOT NULL AND
LblY IS NOT NULL AND
NOT ST_Within(ST_Makeline(St_setSRID(ST_PointOnSurface(geom),4326), St_setSRID(St_Point(LblX::numeric, LblY::numeric),4326)),geom)
I did not write a query for the table since I imported the shapefile with the DB Manager. These are the table fields onve imported. I am wondering if the multipoint in the geometry table could be a problem.
# Name Type Length
1 id int4 4
2 geom geometry (MultiPoint,4326)
3 site_name varchar (254)
4 precision varchar (254)
5 e varchar (254)
6 n varchar (254)
7 sherds int4 4
8 sherds_pre varchar (254)
9 dating varchar (254)
10 visibility int4 4
11 vis_min varchar (15)
12 vis_max varchar (15)
13 LblSize int4 4
14 LblColor varchar (7)
15 LblBold int4 4
16 LblItalic int4 4
17 LblUnderl int4 4
18 LblStrike int4 4
19 LblFont varchar (100)
20 LblX numeric (20,5)
21 LblY numeric (20,5)
22 LblSclMin int4 4
23 LblSclMax int4 4
24 LblAlignH varchar (15)
25 LblAlignV varchar (15)
26 LblRot numeric (20,5)
thanks for helping!
Sebastiano
“I am wondering if the multipoint in the geometry table could be a problem”
It certainly does!!
The function ST_PointOnSurface(geom) only works in Polygons and Multipolygons. Therefore, the query must be adapted. If the layer was of single points, you could just replace the “ST_PointOnSurface(geom)” for “geom” only. Since you mention multipoints, try replacing it by ST_Centroid(geom).
Ciao Alexander, it took me some time but I solved it. There were two problems, the first being of course what you pointed out (replacing ST_PointOnSurface with geom when working with point geometry) and the second being related to the use of uppercase in the field names of the table. I quoted the field name (“LblX” instead of plain LblX for example) and everything went smooth.
I wanted to thank you again for your help and for sharing the query. I really like it especially because (as you told) you do not have to duplicate a layer to create the labels as in the “easy custom label plug-in”. Furthermore its working in WGS84 as well (“easy custom label plug-in” is not creating the connectors in WGS84, or at least not for me 🙂 ).
It would be great if it were possible to change the anchor point of the connector (sometimes the line passes trough the text; I saw that you solved the problem adding a buffer around it but sometimes buffers are too heavy for the maps I make).
Thanks again and I am looking forward for your next post!
Ciao
Sebastiano
Hola Alexandre,
Primero, muchas gracias por este blog muy interesante! Luego te quería preguntar una pequeña cosa. Estoy empezando en el mundo de los SIG y por diversas razones instalé la versión 2.10 Pisa. En un proyecto que tengo que hacer, tengo un shapefile con las líneas de tren de una provincia, y otro con las estaciones. Para las estaciones, me gustaría poder mover la etiqueta de la estación donde aparece el número de la estación. Para esto, el la tabla de atributos de la capa estaciones, he creado 3 nuevas columnas (X, Y y ROTACION en números decimales [real]) como han dicho en muchos foros. Luego, en las propiedades de la capa de las estaciones, activo las etiquetas, y “definido por datos”
> coordenada X (seleccionando la columna de la tabla de atributos)
> coordenada Y (seleccionando la columna de la tabla de atributos)
> rotación (seleccionando la columna de la tabla de atributos)
aplico, cierro y paso en modo edición de la capa. Muevo la primera etiqueta, la segunda, etc. y cuando guardo, todas se agrupan a la izquierda o derecha o debajo o arriba del área de la red de líneas de tren.
Puse el proyecto y la capa en el mismo SRC, todo está en metros… No entiendo lo que ocurre… ¿Sabrías ayudarme?
Muchas gracias y saludos!
Olá,
Confirma se os valores das coordenadas, depois de gravados, não se transformam em inteiros. Experimenta em vez de usares decimais usar campos de texto. E por fim, podes recorrer ao plugin layer to labeled layer que faz toda a configuração por ti. Boa sorte.
Hola Alexandre! Me funcionó perfectamente usando campos de texto. Muchísimas gracias por tu ayuda! 🙂
Boa noite, Alexandre.
Tem como criar essas linhas guias com alguma ferramenta do qgis em vez do banco de dados?
Agora tem com o geometry generator. Infelizmente ainda não tive tempo de actualizar a dica.
Obrigado pela rápida resposta, Alexandre. Estou vendo sobre geometry generator agora mesmo!
Há um colega que já escreveu sobre isso no seu blog. Não me recordo quem…
Ah foi o Natercio de Sá
Obrigado, Alexandre.
Continuando o assunto, ha formas de espalhar os rotulos automaticamente a fim de evitar sobreposicoes?
Queria utilizar junto a geração de geometria na criacao das linhas guia.
Por defeito, e dependendo das opções escolhidas para o posicionamento dos rótulos, o QGIS tenta evitar a colisão de rótulos. Em certos casos até esconde alguns. Não sei se é possível obter a coordenada do rótulo para conseguir fazer a guia.