Etiquetas com guias em QGIS e Postgis

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.

Capturar_3

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.

Capturar_2

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.

Capturar_1

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.

guidelines

Advertisement

29 thoughts on “Etiquetas com guias em QGIS e Postgis

    1. 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.

  1. 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

  2. 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

      1. 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

  3. “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).

    1. 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

  4. 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!

    1. 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.

      1. Hola Alexandre! Me funcionó perfectamente usando campos de texto. Muchísimas gracias por tu ayuda! 🙂

  5. Boa noite, Alexandre.

    Tem como criar essas linhas guias com alguma ferramenta do qgis em vez do banco de dados?

      1. Obrigado pela rápida resposta, Alexandre. Estou vendo sobre geometry generator agora mesmo!

    1. 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.

  6. 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.

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão /  Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão /  Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão /  Alterar )

Connecting to %s