Estoy tratando de crear líneas líderes dinámicas mediante el uso de una vista PostGIS además de la herramienta QGIS "Mover etiqueta".
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;
Esto funciona bien para todas las etiquetas, WHERE ST_X(geom) < xcord_labelpero crea líneas de guía de aspecto incorrecto para las etiquetas WHERE ST_X(geom) > xcord_label.

¿Alguien sabe cómo obtener líneas de guía correctamente colocadas para las etiquetas WHERE ST_X(geom) > xcord_label? ¿Hay alguna forma de referirse a la coordenada xmax de las etiquetas?

qgis
postgis
labeling
coordinates
dynamic-layer
Mar lunar
fuente
fuente

Respuestas:
Puede utilizar el especificador de colocación de cuadrantes de QGIS determinado a partir del acimut de la línea para colocar una mejor etiqueta. El cuadrante especifica 8 posiciones alrededor de un punto:
Aquí hay un ejemplo de Null Island , creando una tabla y dos vistas.
Luego, en QGIS, agregue:
points-geomleader_line-geom- la clave principal debe sergidpoint_labels-geom- la clave principal debe sergidAhora configure las propiedades de capa para
point_labels:label, y cambie la ubicación a "Desplazamiento desde el punto", modificando el "Cuadrante" para usar el campo de atributoquadrant¡Bingo!
Tenga en cuenta que se requiere un enfoque ligeramente diferente para los
geographytipos, ya que ST_Azimuth se comporta de manera diferente.Actualización: al agregar nuevos puntos a la
pointscapa, elgeomcampo se actualiza como de costumbre, perolabel_geomno lo es. Para completar un valor predeterminado delabel_geomcon nuevos puntos, se debe crear un activador . Pero si se utiliza una función de activación, elquadrantespecificador se puede almacenar en lapointstabla ypoint_labelsse puede ignorar la vista:Por ejemplo, comencemos nuevamente con un ejemplo ligeramente diferente con una tabla y una vista:
Desde el primer ejemplo, vuelva a hacer las declaraciones
INSERT INTO pointsyCREATE OR REPLACE VIEW leader_line, ya que no requieren modificación. Pero ignora laleader_linevista.Luego, en QGIS, agregue:
points-geompoints-label_geomleader_line-geom- la clave principal debe sergidAhora configure las propiedades de la capa
pointsconlabel_geomcomo lo hizo el primer ejemplopoint_labels. Elquadrantespecificador se modificará automáticamente para los puntos nuevos y movidos, pero solo notará estos cambios cada vez que guarde sus ediciones.fuente
gid | label_geom | labelygid, geom, label).label_geom, y también actualiza elquadrantvalor también, por lo que lapoint_labelcapa / vista ya no es necesaria.label_geomarchivo, tengo que guardar la edición de la capa y actualizar el lienzo para ver la posición real de la etiqueta. Es una pena que no haya forma de utilizar un especificador de cuadrante con la herramienta QGIS "Mover etiqueta".bien ... como está en unidades de mapa, esto debería ser bastante sencillo, dentro de las limitaciones. Ya sabes la altura de la etiqueta. Si estuviera en puntos, dependería de la escala.
Esto supone un tamaño de etiqueta fijo, por lo que su funcionamiento depende de cuán uniformes sean sus etiquetas y de si usa o no una fuente proporcional o de ancho fijo (el ancho fijo es más fácil: multiplique la longitud de la etiqueta por el tamaño de la etiqueta para obtener el ancho de la etiqueta).
Lamentablemente, esto no responde a su pregunta sobre cómo encontrar realmente los límites de la etiqueta tal como se representa .
Tiene 4 casos (NE, NW, SE, SW).
Supongo que su tabla se ve así (disculpas, algunos nombres de campo son diferentes)
Luego, agregue 4 puntos (todos idénticos) pero con etiquetas en los 4 cuadrantes para representar los 4 casos de uso principales
Utilicé CRS 27700 (0,0 en la parte inferior izquierda, unidades de mapa en m). Asumí un ancho de etiqueta 50, altura 30 unidades de mapa.
Transformaciones afines
Otra posibilidad es acortar todas las líneas principales, por ejemplo, el 80%.
Esto podría funcionar mejor, aunque no lo he probado.
fuente