Ir al contenido

Generar teselas de mapa

QCAD incluye dos herramientas de línea de comandos para crear teselas de mapa destinadas a visualizadores de mapas en línea como Leaflet. Leaflet es una biblioteca JavaScript para trabajar con mapas interactivos en un navegador.

El caso de uso más sencillo de un mapa en línea consiste en ofrecer a los visitantes de un sitio web una vista interactiva y con zoom de un dibujo.

Aquí tiene un ejemplo que genera las teselas de mapa para cualquier archivo de dibujo:

dwg2maptiles -z 0-6 -c -b white -hq-postfix=@2x -a -o path/to/output/directory drawing.dxf

El conmutador -z especifica los niveles de zoom que se van a generar, aquí del nivel de zoom 0 al nivel de zoom 6. Esto significa que, partiendo del nivel 0 (dibujo completo o zoom automático), el usuario puede acercar el zoom 6 veces hasta alcanzar el límite. Cada vez que el usuario acerca el zoom, el dibujo se amplía en un factor de 2, de modo que con 6 niveles de zoom el usuario puede acercar el zoom en un factor de 2^6 (=64). Generar más niveles de zoom requiere más tiempo y espacio en disco. Cada nivel de zoom adicional suele requerir cuatro veces más tiempo y espacio en disco para generarse que el anterior.

Las teselas se generan en el directorio de salida dado (-o) con la estructura de directorios y los nombres de archivo estándar para teselas de mapa (z/x/y.png).

En el ejemplo anterior, queremos que el dibujo se renderice sobre un fondo blanco (-b white). Las líneas blancas deberían corregirse a negro para asegurarse de que todas las líneas sean visibles (-c).

El argumento -hq-postfix=@2x indica a dwg2maptiles que genere teselas de alta calidad (hq, alta resolución, retina) de 512x512px además de las teselas de resolución estándar de 256x256px.

Para aumentar aún más la calidad, también usamos el conmutador -a para el suavizado de bordes (antialiasing).

Ver ejemplo con Leaflet en línea

dwg2maptiles también se puede usar para generar superposiciones exactas para mapas del mundo. Para ello, normalmente hay que transformar un dibujo de un sistema de coordenadas local a coordenadas Web Mercator, tal como las usan habitualmente los mapas en línea.

QCAD Professional incluye una herramienta de línea de comandos independiente para transformar dibujos de un sistema de referencia de coordenadas (CRS) a otro: dwgmapconvert.

dwgmapconvert se usa normalmente para convertir todas las coordenadas de un archivo de dibujo dado desde un sistema de coordenadas local conocido al sistema de coordenadas EPSG:3857 (a veces llamado “Web Mercator”). Este es el sistema de coordenadas que usan la mayoría de los mapas en línea, por ejemplo Google Maps o Mapbox. Para usar un dibujo como entrada para dwg2maptiles y producir teselas de mapa georreferenciadas, el dibujo debe estar en el sistema de coordenadas EPSG:3857.

En el sistema de coordenadas EPSG:3857, todo el mapa del mundo cabe en un cuadrado de 20037508.3427892m en el nivel de zoom 0. Si un dibujo se convierte a este sistema de coordenadas, el dibujo se transforma de tal manera que cabe en ese cuadrado del mundo y que el dibujo se encuentra en las coordenadas mundiales proyectadas correctas.

Por ejemplo, si un dibujo se creó en EPSG:2056 (también LV95, el sistema de coordenadas local suizo), se puede transformar a EPSG:3857 con dwgmapconvert de la siguiente manera:

dwgmapconvert -segment-length=0.5 -crs-in=EPSG:2056 -crs-out=EPSG:3857 -f -o drawing_epsg3857.dxf drawing_epsg2056.dxf

Como las proyecciones cartográficas suelen ser no lineales, las curvas y las líneas más largas deben dividirse en pequeños segmentos de línea que luego se pueden proyectar de forma no lineal. Si se proporciona el conmutador -segment-length, dwgmapconvert realiza esta segmentación automáticamente, usando la longitud de segmento dada. La longitud de segmento se especifica en unidades de dibujo del dibujo original (aquí metros).

-crs-in se usa para especificar el sistema de coordenadas de entrada, aquí EPSG:2056.

-crs-out se usa para especificar el sistema de coordenadas de salida, que debe ser EPSG:3857 si la salida se va a usar después con dwg2maptiles.

dwgmapconvert admite LV95 como entrada y WebMercator como salida.

Otros sistemas de coordenadas se añadirán en futuras versiones o pueden ser añadidos por el usuario.

Para añadir soporte para un nuevo sistema de coordenadas, deben proporcionarse dos ecuaciones para convertir las coordenadas del nuevo sistema de coordenadas a WGS84 (longitud/latitud, como las coordenadas GPS).

Se pueden añadir nuevos sistemas de coordenadas a un archivo de configuración JSON llamado CRS.json, ubicado en la carpeta “scripts” de la instalación de QCAD que se utiliza. Aquí tiene un ejemplo de archivo CRS.json que configura el sistema de coordenadas LV95. Para poder usar LV95 como entrada para la herramienta dwgmapconvert, necesitamos proporcionar la sección “toWgs84” con ecuaciones para la conversión de las coordenadas x e y. Aquí también usamos dos variables auxiliares, x_ e y_, que deben inicializarse en la ecuación x para que sean accesibles en ambas ecuaciones.

También podríamos proporcionar una sección “fromWgs84” para permitir la conversión de otros sistemas de coordenadas a LV95. Ambas secciones son opcionales, según la dirección de conversión que desee admitir.

{
"CRS" : [
{
"id" : "EPSG:2056 CH1903+ / LV95",
"toWgs84" : {
"x": "x_ = (y-1200000)/1000000; y_ = (x-2600000)/1000000; (2.6779094 + 4.728982*y_ + 0.791484*y_*x_ + 0.1306*y_*x_*x_ - 0.0436*y_*y_*y_) * 100 / 3",
"y": "(16.9023892 + 3.238272*x_ - 0.270978*y_*y_ - 0.002528*x_*x_ - 0.0447*y_*y_*x_ - 0.0140*x_*x_*x_) * 100 / 36"
},
"aliases" : [ "LV95", "Swiss" ]
}
]
}

Una vez que hemos convertido el dibujo a coordenadas EPSG:3857, podemos usar dwg2maptiles para generar las teselas de la capa de superposición en Leaflet:

dwg2maptiles -web-mercator -skip-empty -hq-postfix=@2x -z 22 -b transparent -o path/to/output/directory drawing_epsg3857.dxf

Tenga en cuenta que debemos pasar el conmutador -web-mercator a dwg2maptiles para indicarle que no debe realizar un zoom automático, sino generar una superposición de mapa en coordenadas EPSG:3857 exactas tal como están presentes en el archivo.

-skip-empty indica a dwg2maptiles que no genere teselas que no contengan ninguna parte del dibujo. Sin este conmutador, se generarán 2^zoomLevel teselas por nivel de zoom. Eso serían 4’194’304 teselas para el nivel de zoom 22. Dado que un dibujo de superposición muy probablemente solo cubre una parte muy pequeña del mapa del mundo, este conmutador debería usarse siempre al crear mapas de superposición.

-b transparent establece el fondo como transparente, de modo que el mapa se pueda usar como superposición para un mapa del mundo existente (por ejemplo, Google Map, Mapbox, etc.). Para controlar el color en el que se muestran las líneas negras o blancas, el fondo se puede establecer como negro transparente o blanco transparente con -b "#00ffffff" (fondo blanco transparente, líneas negras) o -b "#00000000" (fondo negro transparente, líneas blancas) respectivamente. En este caso, asegúrese de pasar también el conmutador -c para forzar una corrección automática del color.

El argumento -hq-postfix=@2x se puede usar para generar teselas de alta resolución (512px) además de las teselas normales de 256px. El valor “@2x” es el recomendado y ampliamente utilizado para teselas de alta resolución, también en Leaflet. Con este conmutador, por cada tesela de baja resolución “N.png” se crea una tesela de alta resolución “[email protected]”.

Generar teselas de mapa puede ser una tarea que exige mucho de la CPU, según los niveles de zoom, la complejidad del dibujo y otros ajustes.

Para generar teselas de mapa más rápido, puede repartir la tarea entre varios núcleos de CPU disponibles. Para esta función, dwg2maptiles ofrece el conmutador -s para generar solo una porción (slice) de las teselas necesarias. El conmutador -s espera dos parámetros separados por comas: la porción que se va a generar y el número total de porciones utilizadas. Por ejemplo, -s 1,4 generaría la primera porción de cuatro en total. Para generar todas las teselas del ejemplo anterior usando cuatro núcleos de CPU, podría ejecutar:

dwg2maptiles -web-mercator -skip-empty -hq-postfix=@2x -z 22 -s 1,4 -b transparent -o path/to/output/directory drawing_epsg3857.dxf &
dwg2maptiles -web-mercator -skip-empty -hq-postfix=@2x -z 22 -s 2,4 -b transparent -o path/to/output/directory drawing_epsg3857.dxf &
dwg2maptiles -web-mercator -skip-empty -hq-postfix=@2x -z 22 -s 3,4 -b transparent -o path/to/output/directory drawing_epsg3857.dxf &
dwg2maptiles -web-mercator -skip-empty -hq-postfix=@2x -z 22 -s 4,4 -b transparent -o path/to/output/directory drawing_epsg3857.dxf &
wait

Por supuesto, también podría dividir las tareas por niveles de zoom o usar porciones solo para los niveles de zoom más altos y un único proceso para todos los niveles de zoom más bajos (más económicos), etc.

Un ejemplo interactivo proporciona dos capas de superposición al mapa del cantón suizo de Zúrich: la zona forestal protegida y los corredores de fauna. Los datos originales estaban en coordenadas EPSG:2056 (LV95) y se transformaron a EPSG:3857 usando dwgmapconvert.

Ver ejemplo con Leaflet en línea