4 votos

¿Renderización de dos formas por punto, y superposición, utilizando Mapnik?

Estoy usando Mapnik para renderizar una lista de puntos; para cada uno de estos puntos quiero renderizar una forma redonda simple, y un icono dentro de la forma, usando dos SVGs diferentes. Para ello, escribí una hoja de estilo CartoCSS como esta (simplificada):

[marker="true"] {
    marker-file: url('marker.svg');
    marker-allow-overlap: true;
    marker-fill: purple;
    marker-line-color: white;
    marker-line-width: 2;
    marker-height: 40;
    marker-transform: translate(0, @marker-height/-2);
}
[marker="true"]::inner-icon {
    marker-file: url('tree.svg');
    marker-allow-overlap: true;
    marker-height: @marker-icon-height;
    marker-fill: white;
    marker-transform: translate(0, @marker-icon-offset);
}

Por lo que entendí cómo funciona el renderizado de Mapnik, esperaba que cada punto renderizara las dos formas juntas a la vez (marker.svg y luego tree.svg, en el orden de la hoja de estilos) antes de renderizar el siguiente punto, lo que aseguraría que si dos puntos se superponen un poco, entonces la forma del plano redondo se dibujaría SOBRE las dos formas del punto anterior.

Sin embargo, el resultado final parece dibujar todas las formas marker.svg, y luego todas las formas tree.svg: render

Estoy utilizando Mapnik 3.0.0-pre.

1voto

David Holm Puntos 312

Tras plantear esta cuestión al equipo de Mapnik, obtuve una respuesta definitiva de Dane: https://github.com/mapnik/mapnik-support/issues/26

Básicamente, utilizando el :: dentro de una hoja de estilo MSS genera un nuevo Style dentro de la configuración de Mapnik. Cada estilo consulta los datos y renderiza las características. Así, en mi primera hoja de estilos, tengo todos mis marker.svg en una sola pasada, y todos mis tree.svg se renderiza en una segunda pasada.

La solución es utilizar otra sintaxis para generar todos los simbolizadores dentro del mismo Style :

[marker="true"] {
    marker/marker-file: url('marker.svg');
    marker/marker-allow-overlap: true;
    marker/marker-fill: purple;
    marker/marker-line-color: white;
    marker/marker-line-width: 2;
    marker/marker-height: 40;
    marker/marker-transform: translate(0, @marker-height/-2);

    inner-icon/marker-file: url('tree.svg');
    inner-icon/marker-allow-overlap: true;
    inner-icon/marker-height: @marker-icon-height;
    inner-icon/marker-fill: white;
    inner-icon/marker-transform: translate(0, @marker-icon-offset);
}

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