Estou tentando criar linhas de liderança dinâmicas usando uma exibição PostGIS, além da ferramenta QGIS „Move Label”.
CREATE VIEW leader_line AS
SELECT
gid,
ST_MakeLine(geom, ST_SetSRID(ST_MakePoint(xcord_label, ycord_label), SRID))::geometry(linestring, SRID) AS geom
FROM point
WHERE xcord_label IS NOT NULL;
Isso funciona bem para todos os rótulos, WHERE ST_X(geom) < xcord_label
mas cria linhas de líder com aparência errada para rótulos WHERE ST_X(geom) > xcord_label
.
Alguém sabe como obter linhas de liderança corretamente colocadas para etiquetas WHERE ST_X(geom) > xcord_label
? Existe alguma maneira de se referir à coordenada xmax dos rótulos?
qgis
postgis
labeling
coordinates
dynamic-layer
Mar Lunar
fonte
fonte
Respostas:
Você pode usar o especificador de posicionamento de quadrante do QGIS determinado a partir do azimute da linha para colocar um rótulo melhor. O quadrante especifica 8 posições em torno de um ponto:
Aqui está um exemplo em torno da Ilha Null , criando uma tabela e duas visualizações.
Em seguida, no QGIS, adicione:
points
-geom
leader_line
-geom
- a chave primária precisa sergid
point_labels
-geom
- a chave primária precisa sergid
Agora configure as propriedades da camada para
point_labels
:label
e altere o posicionamento para "Offset from point", modificando o "Quadrante" para usar o campo de atributoquadrant
Bingo!
Observe que é necessária uma abordagem ligeiramente diferente para os
geography
tipos, pois o ST_Azimuth se comporta de maneira diferente.Atualização: ao adicionar novos pontos à
points
camada, ogeom
campo é atualizado normalmente, maslabel_geom
não é. Para preencher um valor padrão delabel_geom
com novos pontos, um gatilho precisa ser criado . Mas se uma função de disparo for usada, oquadrant
especificador poderá ser armazenado napoints
tabela e apoint_labels
exibição poderá ser ignorada:Por exemplo, vamos começar novamente com um exemplo ligeiramente diferente com uma tabela e uma exibição:
A partir do primeiro exemplo, refaça as instruções
INSERT INTO points
eCREATE OR REPLACE VIEW leader_line
, pois elas não requerem modificação. Mas ignore aleader_line
vista.Em seguida, no QGIS, adicione:
points
-geom
points
-label_geom
leader_line
-geom
- a chave primária precisa sergid
Agora configure as propriedades da camada para
points
comlabel_geom
como no primeiro exemplopoint_labels
. Oquadrant
especificador será modificado automaticamente para pontos novos e movidos, mas você notará essas alterações sempre que salvar suas edições.fonte
gid | label_geom | label
egid, geom, label
).label_geom
e também atualiza oquadrant
valor, para que apoint_label
camada / visualização não seja mais necessária.label_geom
eu tenho que salvar a edição de camada e atualizar a tela para ver a posição real do rótulo. É uma pena que não seja possível usar um especificador de quadrante com a ferramenta "Mover rótulo" do QGIS.ok .. como está nas unidades do mapa, isso deve ser bastante direto, dentro de limitações. Você já sabe a altura do rótulo. Se estivesse em pontos, seria dependente da escala.
Isso pressupõe um tamanho fixo de etiqueta, portanto, o quão bem isso funciona depende de quão uniformes são suas etiquetas e se você usa ou não uma fonte proporcional ou de largura fixa (largura fixa é mais fácil - multiplique o comprimento da etiqueta pelo tamanho da etiqueta para obtenha a largura da etiqueta).
Infelizmente, isso não responde à sua pergunta sobre como encontrar os limites do rótulo como renderizados .
você tem 4 casos (NE, NW, SE, SW).
Presumo que sua tabela se parece com isso (desculpas, alguns nomes de campo são diferentes)
Em seguida, adicione 4 pontos (todos idênticos), mas com rótulos nos 4 quadrantes para representar os 4 principais casos de uso
Usei o CRS 27700 (0,0 em unidades do mapa inferior esquerdo, em m). Assumi uma largura de etiqueta 50, altura 30 unidades de mapa.
Transformações Afins
Outra possibilidade é reduzir todas as linhas principais, ou seja, 80%.
Isso pode funcionar melhor, embora eu não tenha tentado.
fonte