Skip to content

MBTilesVector

Álvaro Ramírez edited this page Nov 21, 2024 · 22 revisions

MBTilesVector es una especificación para almacenar de forma optimizada datos en forma de puntos líneas y polígonos usando una estructura de base de datos SQLite. Es decir, agrupa estos datos clasificándolos por sus coordenadas X Y Z y utilizando para un zoom determinado únicamente los correspondientes a las coordenadas dadas.

Para visualizar capas MBTilesVector, se pueden:

1.- Añadir en el constructor del mapa, tanto en modo cadena como objeto:

const mapa = M.map({
  container: "map",
  center: { x: -965497.2717184591, y: 4166095.580546307 },
  zoom: 5,
  controls: ['backgroundlayers'],
  layers: ["MBTilesVector*Capa*url*Capa*true**eyJwYXJhbWV0ZXJzIjpbeyJyYWRpdXMiOjUsImZpbGwiOnsiY29sb3IiOiJvcmFuZ2UiLCJvcGFjaXR5IjoiMC44In0sInN0cm9rZSI6eyJjb2xvciI6InJlZCIsIndpZHRoIjoxfX1dLCJkZXNlcmlhbGl6ZWRNZXRob2QiOiIoKHNlcmlhbGl6ZWRQYXJhbWV0ZXJzKSA9PiBNLnN0eWxlLlNpbXBsZS5kZXNlcmlhbGl6ZShzZXJpYWxpemVkUGFyYW1ldGVycywgJ00uc3R5bGUuUG9pbnQnKSkifQ=="]
});

Siendo el formato de la cadena:

MBTilesVector*legend*url*name*visibility*tileSize*style

2.- O añadiéndolas con el método correspondiente (addLayers o addMBTilesVector):

/* 
  Crear una capa MBTilesVector cambiando el estilo de los puntos
  por el especificado en el parámetro style.
*/
const mbtilevector = new M.layer.MBTilesVector(
  {
    name: 'mbtilesvector',
    legend: 'Capa',
    url: '<url de la capa>',
  },
  {
    style: {
      point: {
        fill: {
          color: '#fff',
          opacity: 0.6,
        },
        stroke: {
          color: '#827ec5',
          width: 2,
        },
        radius: 5,
      }
    }
  }
);
mapa.addLayers(mbtilevector);

Donde:

  • name: nombre de la capa.

  • url: URL del servicio que genera la capa.

  • type: tipo de la capa.

  • maxExtent: restringe la visualización a una región específica.

  • legend: nombre que aparece en el árbol de contenidos.

  • tileLoadFunction: función de carga de la tesela vectorial.

  • source: fuente de la capa.

  • tileSize: tamaño de la tesela.

  • visibility: indica si la capa es visible o no.

  • infoEventType: Opcional Parametriza el método de activación del popup para obtener la información de una feature ('click' / 'hover'), por defecto 'click'.

  • extract: opcional, activa la consulta por click en el objeto geográfico, por defecto falso.

  • attribution: Atribución de la capa.

    • name. Nombre de la atribución
    • description. Descripción de la atribución.
    • url. URL de la atribución.
    • contentAttributions. Atribuciones por objetos geográficos, por defecto vacío.
    • contentType. Tipo de url de “contentAttributions” (KML o GeoJSON).
  • options: estas opciones se mandarán a la implementación de la capa.

    • opacity: opacidad de la capa.
    • style: estilo de la capa.
    • predefinedStyles: Estilos predefinidos para la capa, aparecen en el selector de capas "LayerSwitcher" para cambiar el estilo de la capa.
    • displayInLayerSwitcher: indica si la capa se muestra en el selector de capas.
    • minZoom: Zoom mínimo aplicable a la capa.
    • maxZoom: Zoom máximo aplicable a la capa.
  • vendorOptions: Opciones para la biblioteca base (el código se envía directamente a la librería base para ejecutar la funcionalidad). Ejemplo vendorOptions:

tileLoadFunction = (z, x, y) => {
  return new Promise((resolve) => {
    fetch(`https://ahocevar.com/geoserver/gwc/service/tms/1.0.0/ne:ne_10m_admin_0_countries@EPSG%3A900913@pbf/${z}/${x}/${y}.pbf`).then((response) => {
      resolve(response.arrayBuffer());
    });
  });
}

loadVectorTile = (tile, formatter) =>  {
  tile.setState(1); // ol/TileState#LOADING
  tile.setLoader((extent, resolution, projection) => {
    const tileCoord = tile.getTileCoord();
    // eslint-disable-next-line
    tileLoadFunction(tileCoord[0], tileCoord[1], -tileCoord[2] - 1).then((_vectorTile) => {
      if (_vectorTile) {
        try {
          const vectorTile = new Uint8Array(_vectorTile);
          const features = formatter.readFeatures(vectorTile, {
            extent,
            featureProjection: projection,
          });
          tile.setFeatures(features);
          tile.setState(2); // ol/TileState#LOADED
        } catch (e) {
          tile.setState(3); // ol/TileState#ERROR
        }
      } else {
        tile.setState(3); // ol/TileState#ERROR
      }
    });
  });
}

new M.layer.MBTilesVector({}, {
  minZoom: 5,
}, {
  source: new ol.source.VectorTile({
    projection: 'EPSG:3857',
    url: '{z},{x},{y}',
    tileLoadFunction: (tile) => loadVectorTile(tile, new ol.format.MVT()),
    tileGrid: new ol.tilegrid.TileGrid({
      extent: [-20037508.342789244, -20037508.342789244, 20037508.342789244, 20037508.342789244],
      origin: [-20037508.342789244, -20037508.342789244],
      resolutions: [156543.03392804097, 78271.51696402048, 39135.75848201024, 19567.87924100512, 9783.93962050256, 4891.96981025128, 2445.98490512564, 1222.99245256282, 611.49622628141, 305.748113140705, 152.8740565703525, 76.43702828517625, 38.21851414258813, 19.109257071294063, 9.554628535647032, 4.777314267823516, 2.388657133911758, 1.194328566955879, 0.5971642834779395, 0.29858214173896974, 0.14929107086948487, 0.07464553543474244, 0.03732276771737122, 0.01866138385868561, 0.009330691929342804, 0.004665345964671402, 0.002332672982335701, 0.0011663364911678506, 0.0005831682455839253],
    }),
  }),
});

Ejemplo completo de creación de capa MBTilesVector:

const mbtilevector = new M.layer.MBTilesVector(
  {
    name: 'mbtilesvector',
    legend: 'Capa',
    url: '<url de la capa>',
    maxExtent:[-541472.2966587595,4905925.103840003,-248565.6042699641,5072252.0773885455]
  },
  { 
    displayInLayerSwitcher: false, // no muestra la capa en el TOC
  // aplica un estilo a la capa    
    style: {
      point: {
        fill: {
          color: '#fff',
          opacity: 0.6,
        },
        stroke: {
          color: '#827ec5',
          width: 2,
        },
        radius: 5,
      }
    }
  },
  {
    opacity: 0.5 // aplica opacidad a la capa
  }
);
mapa.addLayers(mbtilevector);

Ejemplo de uso del parámetro tileLoadFunction:

Este ejemplo hace uso de una función personalizada para la carga de los tiles recibiendo las coordenadas x,y,z y devolviendo una promesa con el dato .pbf para esas coordenadas.

const mbtileVector = new M.layer.MBTilesVector({
  name: 'mbtilesvector',
  legend: 'Capa personalizada MBTilesVector',
  tileLoadFunction: (z, x, y) => {
    return new Promise((resolve) => {
      fetch(`https://ahocevar.com/geoserver/gwc/service/tms/1.0.0/ne:ne_10m_admin_0_countries@EPSG%3A900913@pbf/${z}/${x}/${y}.pbf`).then((response) => {
        resolve(response.arrayBuffer());
      });
    });
  },
});
mapa.addLayers(mbtileVector);

Ejemplos:

1.INICIO
   1.1. Componentes de la API-CNIG
   1.2. Documentación y Puntos de acceso
   1.3. Primeros pasos
   1.4. Diagrama API CNIG

2. MAPA
2.1. Capas

 ■ 2.1.1. Fuentes
   • 2.1.1.1. Capas vectoriales
     + Vector
     + WFS
     + GeoJSON
     + KML
     + MVT
     + OGCAPIFeatures
     + MBTilesVector
     + GenericVector
     + MapLibre
   • 2.1.1.2. Capas ráster
     + WMS
     + WMTS
     + TMS
     + XYZ
     + OSM
     + MBTiles
     + GenericRaster
     + GeoTIFF
   • 2.1.1.3. Capas rápidas
   • 2.1.1.4. Grupo de capas

 ■ 2.1.2. Simbolización
   • 2.1.2.1. Genérica
     + Puntos
     + Líneas
     + Polígonos
   • 2.1.2.2. Básica
     + Puntos
     + Líneas
     + Polígonos
   • 2.1.2.3. Avanzada
     + Coropletas
     + Proporcional
     + Categorías
     + Estadísticos
     + Mapas de Calor
     + Cluster
     + Línea de flujo
     + Composición

 ■ 2.1.3. Filtros

2.3.-Plugins

  > Creación de plugin en cliente

  » Tutorial de creación de un plugin

2.4. Paneles

  » Creación de panel desde cero sin controles

  » Tutorial Panel de un único control

  » Tutorial Panel de un único control con más de un botón

  » Tutorial Panel con más de un control

2.5. Eventos

  » Gestión de eventos
  » Gestión de eventos en controles personalizados

    2.6. Internacionalización

    2.7. Configuración

    2.8. Acceso librerías base

3. UTILIDADES

4. PROXY

5. API REST
 5.1. Parametrización API-REST
 5.2. Base de Datos API-REST
 5.3. API REST Actions
 5.4. Servicio de correos electrónicos
 5.5. Capas rápidas

6. PARAMETRIZACIÓN VISUALIZADORES

7. SOLUCIÓN DE PROBLEMAS

8. PROCESO DE VERSIONADO

9. GUÍA DE DESARROLLO
  > Guía para el desarrollo de API-CNIG
  » Tutorial desarrollo del núcleo de API-CNIG - (Cliente)
  > Guía de desarrollo de componentes
  » Tutorial desarrollo del núcleo de API-CNIG - (Servidor)
  > Guía de desarrollo de plugins
  » Tutorial desarrollo de plugins ya creados
  » Tutorial desarrollo de nuevos plugins
  > Guía de desarrollo de visualizadores con React

  > Compilación proyecto API-CNIG

Clone this wiki locally