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_label
pero 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
-geom
leader_line
-geom
- la clave principal debe sergid
point_labels
-geom
- la clave principal debe sergid
Ahora 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
geography
tipos, ya que ST_Azimuth se comporta de manera diferente.Actualización: al agregar nuevos puntos a la
points
capa, elgeom
campo se actualiza como de costumbre, perolabel_geom
no lo es. Para completar un valor predeterminado delabel_geom
con nuevos puntos, se debe crear un activador . Pero si se utiliza una función de activación, elquadrant
especificador se puede almacenar en lapoints
tabla ypoint_labels
se 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 points
yCREATE OR REPLACE VIEW leader_line
, ya que no requieren modificación. Pero ignora laleader_line
vista.Luego, en QGIS, agregue:
points
-geom
points
-label_geom
leader_line
-geom
- la clave principal debe sergid
Ahora configure las propiedades de la capa
points
conlabel_geom
como lo hizo el primer ejemplopoint_labels
. Elquadrant
especificador 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 | label
ygid, geom, label
).label_geom
, y también actualiza elquadrant
valor también, por lo que lapoint_label
capa / vista ya no es necesaria.label_geom
archivo, 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