6 votos

¿Generando automáticamente líneas de etiquetas en QGIS?

He estado experimentando con proyecciones ortográficas y me he encontrado con un problema con las etiquetas.

enter image description here

Me gustaría etiqueta de los países, pero quiero las etiquetas para ejecutar oeste-este a lo largo del país que no lo es (actualmente) una opción en el QGis opciones de etiquetado.

Así que, sé que puedo colocarlos a lo largo de una línea, pero me falta la paciencia para dibujar una línea en cada país. Así que estoy buscando una manera automática para dibujar una línea a través del centroide de un polígono y a los bordes para que lo puedo usar como etiqueta la colocación de la línea.

Por 'la colocación de la etiqueta de la línea de" yo tengo una línea que atraviesa el país y que puedo utilizar como base de mis etiquetas para que yo pueda seguir la línea (en paralelo creo) en el etiquetado del panel. (véase, por ejemplo, esta pregunta). Por lo que será una línea recta horizontal en EPSG:4326, pero muy bien curvada en mi proyección ortográfica (+proj=ortho +lat_0=51.470129 +lon_0=-0.452751 +x_0=0 +y_0=0 +a=6371000 +b=6371000 +units=m +no_defs).

Lo ideal sería una densa línea de modo que las curvas cuando se vuelve a proyectar pero siempre se puede ejecutar un densificar proceso en la salida.

8voto

Geoffrey Puntos 228

No estoy seguro de si este es el resultado esperado, pero usted puede intentar usar esta expresión de la Calculadora de Campo:

intersection(
 make_line(
  make_point(
   x(centroid($geometry)) - bounds_width($geometry),
   y(centroid($geometry))
   ),
  make_point(
  x(centroid($geometry)) + bounds_width($geometry),
  y(centroid($geometry))
  )
 ),
 $geometry
)

En esencia, crea una línea de dos puntos, con referencia a la del centroide de cada característica. Entonces, desde la línea de excedería el país de los límites, de una intersección con el país en sí se hace.

Este será el resultado:

enter image description here

He creado con una Geometría generador desde el panel Estilo (mi máquina requiere una gran cantidad de tiempo de procesamiento, así que tal vez realizar una prueba en algunas de las características antes para ver rápidamente si es lo que quieres).

4voto

Adam Ernst Puntos 6939

Me las he arreglado para generar una solución para esto el uso de GeoTools que parece ser una exageración, así que todavía estoy esperando una QGis solución.

enter image description here

Básicamente yo uso la misma matemáticas como en @mgri la solución, con un poco de tocar el violín alrededor con sólo utilizar el mayor polígono en un país (por lo que Francia y los Estados Unidos a trabajar mejor). Como usted puede ver, hay ahora una cuestión que muchos de los países más pequeños no reciben etiquetados como de la línea es demasiado corto para la etiqueta.

Aquí es el código real:

try (SimpleFeatureIterator itr = features.features()) {
  while (itr.hasNext()) {
    SimpleFeature feature = itr.next();
    Collection<Property> props = feature.getProperties();
    for (Property p : props) {
      if (p.getDescriptor() instanceof GeometryDescriptor) {
        Geometry geom = (MultiPolygon) feature.getDefaultGeometry();
        int numGeometries = geom.getNumGeometries();
        if(numGeometries>1) {
          //find largest polygon
          Geometry biggest = null;
          double maxArea = Double.NEGATIVE_INFINITY;
          for(int i=0;i<numGeometries;i++) {
            Geometry g = geom.getGeometryN(i);
            double area = g.getArea();
            if(area>maxArea) {
              biggest =  g;
              maxArea = area;
            }
          }
          geom = biggest;
        }
        Point pt = geom.getCentroid();
        Envelope env = geom.getEnvelopeInternal();
        Coordinate[] coords = new Coordinate[2];
        coords[0] = new Coordinate(env.getMinX(), pt.getY());
        coords[1] = new Coordinate(env.getMaxX(), pt.getY());
        LineString line = gf.createLineString(coords);

        Geometry intersection = line.intersection(geom);
        if (!intersection.isEmpty()) {
          Geometry inter = Densifier.densify(intersection, 0.1);
          builder.set(p.getName(), inter);
        } else {
          builder.set(p.getName(),intersection);
        }
      } else {
        builder.set(p.getName(), p.getValue());
      }

    }
    ret.add(builder.buildFeature(feature.getID()));
  }

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X