MBTiles

司机简称

MBTiles

生成依赖项

libsqlite3

MBTiles驱动程序允许读取MBTiles格式的栅格,MBTiles格式是在SQLite数据库中存储平铺地图数据的规范。

从GDAL 2.1开始,MBTiles驱动程序支持创建和写入MBTiles栅格数据集。

从GDAL 2.3开始,MBTiles驱动程序对MBTiles矢量数据集提供读写支持。对于独立的Mapbox矢量平铺文件或MVT文件集,请参见 MVT 司机。注意:矢量写支持需要用GEOS构建GDAL。

GDAL/OGR必须使用OGR SQLite驱动程序支持以及JPEG和PNG驱动程序进行编译。

SRS总是伪墨卡托(又称Google墨卡托)投影。

从gdal2.3开始,驱动程序将打开一个数据集RGBA。对于以前的版本,驱动程序将尝试通过探测一个磁贴的内容来确定条带数。通过将MBTILESu BANDu COUNT配置选项(或从GDAL 2.1开始,BANDu COUNT open选项)定义为带数,可以改变此行为。支持的值为1、2、3或4。四波段(红、绿、蓝、Alpha)数据集提供了与可存储的磁贴的各种编码的最大兼容性。

驱动程序将使用元数据表中的“bounds”元数据,并在需要时执行必要的平铺剪裁以尊重该范围。但是,该信息是可选的,如果忽略,则驱动程序将使用最大缩放级别的平铺范围。用户还可以指定USE_BOUNDS=NO open选项以强制在最大缩放级别使用分幅的实际范围。或者它可以指定MINX/MINY/MAXX/MAXY中的任意一个具有自定义范围。

驱动程序可以检索根据某些MBTiles文件中可用的UTFGrid规范编码的像素属性。它们可以通过gdallocationinfo实用程序获得,也可以通过对band对象的GetMetadataItem(“Pixel_iCol_iLine”,“LocationInfo”)调用获得。

驱动程序功能

Supports CreateCopy()

This driver supports the GDALDriver::CreateCopy() operation

Supports Create()

This driver supports the GDALDriver::Create() operation

Supports Georeferencing

This driver supports georeferencing

Supports VirtualIO

This driver supports virtual I/O operations (/vsimem/, etc.)

打开选项

从GDAL 2.1开始,以下打开选项可用:

  • 栅格和矢量:

    • ZOOM_LEVEL =值:0到最大值之间的整数值,填入 瓷砖 桌子。默认情况下,驱动程序将选择最大缩放级别,例如在“tiles”表中至少可以找到该缩放级别的一个平铺。

    • USE_BOUNDS =是/否:如果可用,是否使用“边界”元数据来确定AOI。默认为“是”。

    • MINX =值:相关区域的最小东距(EPSG:3857)。

    • MINY =值:相关区域的最小北距(EPSG:3857)。

    • MAXX =值:相关区域的最大东距(EPSG:3857)。

    • MAXY =值:相关区域的最大北距(EPSG:3857)。

  • 仅栅格:

    • BAND_COUNT =AUTO/1/2/3/4:打开后暴露的数据集的带数。一些转换将在可能的情况下完成并实现,但这在某些情况下可能会失败,具体取决于磁贴的带区计数值和带区数。默认为自动。

    • TILE_FORMAT =PNG/PNG8/JPEG:用于存储平铺的格式。见 Tile formats 章节。仅在更新模式下使用。默认为PNG。

    • QUALITY =1-100:JPEG压缩的质量设置。仅在更新模式下使用。默认为75。

    • ZLEVEL =1-9:PNG平铺的放气压缩级别。仅在更新模式下使用。默认为6。

    • DITHER =是/否:是否使用Floyd Steinberg抖动(对于TILE_FORMAT=PNG8)。仅在更新模式下使用。默认为否。

  • 仅矢量(GDAL>=2.3):

    • CLIP =是/否:是否将矢量特征的几何图形剪裁到平铺范围。默认为“是”。

    • ZOOM_LEVEL_AUTO =是/否:是否根据空间过滤范围自动选择矢量层的缩放级别。仅供展示之用。默认为否。

栅格创建问题

根据输入数据集的频带数和所选的平铺格式,驱动程序将进行必要的转换以与平铺格式兼容。使用CreateCopy()API(例如使用gdal_translate)时,将自动将输入数据集重新投影到EPSG:3857(WebMercator),并选择适当的缩放级别。

根据格式允许,完全透明的磁贴将不会写入数据库。

驱动程序实现了Create()和IWriteBlock()方法,因此可以任意写入栅格块,从而可以直接使用MBTiles作为gdalwarp等实用程序的输出数据集。

创建时,仅当使用SetGeoTransform()设置了geotransform矩阵时,才能写入栅格块。这是根据像素分辨率、数据集和平铺尺寸确定全分辨率数据集的缩放级别所必需的。

技术/实现注意:一般情况下,GDAL块与单个MBTiles块不完全匹配。在这种情况下,每个GDAL块将重叠四个MBTiles块。这在读取端很容易处理,但在创建/更新端,这样的配置可能会导致大量解压缩/重新压缩磁贴,这可能会在使用有损压缩(JPEG)时造成不必要的质量损失。为了避免这种情况,驱动程序将在主MBTiles文件旁边创建一个临时数据库,以无损(和未压缩)的方式存储部分MBTiles块。一旦磁贴接收到四个象限和所有频带的数据(或数据集已关闭或使用FlushCache()显式刷新),这些未压缩的磁贴肯定会通过适当的压缩传输到MBTiles文件。所有这些对GDAL API/utilities的用户都是透明的

平铺格式

MBTiles可以以PNG或JPEG格式存储tiles。对这些平铺格式的支持取决于底层驱动程序是否在GDAL中可用。默认情况下,GDAL将PNG平铺。

通过将“创建/打开”选项“平铺格式”设置为PNG、PNG8或JPEG之一,可以选择平铺格式。使用JPEG时,不会存储alpha通道。

可以选择PNG8使用8位PNG,颜色表最多256色。创建时,将为每个平铺计算优化的颜色表。抖动选项可以设置为是以使用Floyd/Steinberg抖动算法,该算法将量化误差扩展到相邻像素上以获得更好的渲染效果(注意,与放大时相比,这可能会导致不理想的视觉伪影)。将其设置为“是”通常会导致压缩效率降低。请注意,当时,这种8位PNG公式仅用于完全不透明的瓷砖,因为当前用于计算最佳颜色表的中值切割算法不支持alpha通道(即使PNG8格式可能允许具有透明度的颜色表)。因此,当选择PNG8时,非完全不透明的平铺将存储为32位PNG。

矢量创建问题

使用WebMercator生成平铺(EPSG:3857)投影。可以决定写入给定层的缩放级别范围。可以写入多个层,但驱动程序对矢量数据只有一次写入支持。要将多个矢量数据集写入MBTiles文件,必须使用GeoPackage等中间格式作为容器,以便可以同时转换所有图层。一次写入支持也意味着现有的向量层不能被编辑。

创建选项

以下创建选项可用:

  • 栅格和矢量:

    • NAME =字符串。Tileset name,用于设置“name”元数据项。如果未指定,则将使用文件名的基名称。

    • DESCRIPTION =字符串。层的说明,用于设置“说明”元数据项。如果未指定,则将使用文件名的基名称。

    • TYPE =覆盖层/基层。层类型,用于设置“类型”元数据项。默认为“覆盖”。

  • 仅栅格:

    • VERSION =字符串。用于设置“version”元数据项的平铺集的版本(纯数字)。默认为“1.1”。

    • BLOCKSIZE =整数。(GDAL>=2.3)块/平铺的宽度和高度(以像素为单位)。默认为256。支持的最大值为4096。

    • TILE_FORMAT =PNG/PNG8/JPEG:用于存储平铺的格式。见 Tile formats 章节。默认为PNG。

    • QUALITY =1-100:JPEG压缩的质量设置。默认为75。

    • ZLEVEL =1-9:PNG平铺的放气压缩级别。默认为6。

    • DITHER =是/否:是否使用Floyd Steinberg抖动(对于TILE_FORMAT=PNG8)。默认为否。

    • ZOOM_LEVEL_STRATEGY =自动/下降/上升。确定缩放级别的策略。LOWER将选择紧靠在理论计算的非积分缩放级别之下的缩放级别,从而导致子采样。相反,UPPER将选择紧靠放大级别之上的,导致过采样。默认为自动,选择最近的缩放级别。

    • RESAMPLING =最近/双线性/立方/立方线/LANCZOS/模式/平均值。重采样算法。默认为双线性。

    • WRITE_BOUNDS =是/否:是否写入边界“metadata”项。默认为“是”。

  • 仅矢量(GDAL>=2.3):

    • MINZOOM =整数:生成平铺的最小缩放级别。默认为0。

    • MAXZOOM =整数:生成平铺的最小缩放级别。默认为5。支持的最大值为22

    • CONF =string:层配置为JSon序列化字符串。

    • SIMPLIFICATION =float:线性或多边形几何图形的简化因子。单位是将几何坐标量化为平铺坐标后的整型平铺单位。适用于所有缩放级别,除非还定义了“简化最大缩放”。

    • SIMPLIFICATION_MAX_ZOOM =float:线性或多边形几何体的简化因子,仅适用于最大缩放级别。

    • EXTENT =正整数。平铺中的单位数。几何坐标越大,越精确(以牺牲平铺字节大小为代价)。默认为4096

    • BUFFER =正整数。几何缓冲的单位数。此值对应于一个平铺的每一侧周围的缓冲区,几何图形将被提取并剪裁到该缓冲区中。这用于正确渲染某些渲染客户端覆盖平铺边界的几何图形。如果区段=4096,则默认为80。

    • COMPRESS =是/否。是否使用Deflate/GZip算法压缩平铺。默认为“是”。对于FORMAT=MBTILES,应保留为YES。

    • TEMPORARY_DB =字符串。用于生成磁贴的临时数据库的路径的文件名。默认情况下,这将是与输出文件/目录位于同一目录中的文件。

    • MAX_SIZE =整数。磁贴的最大大小(压缩后)。默认为50万。如果平铺大于此阈值,则将以较低的精度写入功能,或丢弃这些功能。

    • MAX_FEATURES =整数。每个磁贴的最大功能数。默认为200000。

    • BOUNDS =min_long、min_lat、max_long、max_lat。重写边界元数据项的默认值,该值是根据写入的功能范围计算的。

    • CENTER =长、横向、缩放级别。覆盖中心元数据项的默认值,该值是最小缩放级别的边界中心。

层配置(矢量)

上面提到的CONF dataset creation选项可以设置为一个字符串,该字符串的值是一个JSon序列化文档,如下所示:

{
    "boundaries_lod0": {
        "target_name": "boundaries",
        "description": "Country boundaries",
        "minzoom": 0,
        "maxzoom": 2
    },
    "boundaries_lod1": {
        "target_name": "boundaries",
        "minzoom": 3,
        "maxzoom": 5
    }
}

boundaries_lod0boundaries_lod1 是在目标MVT数据集中创建的OGR层的名称。它们被映射到MVT目标层 边界 .

也可以通过下面的层创建选项获得相同的行为,尽管在ogr2ogr用例中这并不方便。

图层创建选项(矢量)

  • MINZOOM =整数:生成平铺的最小缩放级别。默认为数据集创建选项MINZOOM value。

  • MAXZOOM =整数:生成平铺的最小缩放级别。默认为数据集创建选项MAXZOOM值。支持的最大值为22

  • NAME =字符串:目标层名称。默认为层名称,但可以被重写,以便多个OGR层映射到单个目标MVT层。典型的用例是具有不同的OGR层,用于相互排斥的缩放级别范围。

  • DESCRIPTION =字符串:层的描述。

概述(栅格)

gdaladdo/BuildOverviews()可用于计算概述。只支持两个概览因子(2,4,8,16,…)的幂。

如果指定的概述级别多于可用级别,则会忽略多余的概述级别。

也可以使用gdaladdo的-clean选项清除概述(或使用nOverviews=0的BuildOverviews())

矢量平铺

从GDAL 2.3开始,MBTiles驱动程序可以读取包含符合Mapbox矢量平铺格式(format=pbf)的矢量平铺的MBTiles文件。

驱动程序要求“metadata”表包含一个name=”json“条目,该条目具有描述层及其架构的“vectoru layers”数组。见 metadata.json

注意:对于重叠多个分幅的特征,驱动程序将不遗余力地将几何图形粘在一起。

实例:

  • 访问远程MBTiles栅格:

    $ gdalinfo /vsicurl/http://a.tiles.mapbox.com/v3/kkaefer.iceland.mbtiles
    

    输出:

    Driver: MBTiles/MBTiles
    Files: /vsicurl/http://a.tiles.mapbox.com/v3/kkaefer.iceland.mbtiles
    Size is 16384, 16384
    Coordinate System is:
    PROJCS["WGS 84 / Pseudo-Mercator",
        GEOGCS["WGS 84",
            DATUM["WGS_1984",
                SPHEROID["WGS 84",6378137,298.257223563,
                    AUTHORITY["EPSG","7030"]],
                AUTHORITY["EPSG","6326"]],
            PRIMEM["Greenwich",0,
                AUTHORITY["EPSG","8901"]],
            UNIT["degree",0.0174532925199433,
                AUTHORITY["EPSG","9122"]],
            AUTHORITY["EPSG","4326"]],
        PROJECTION["Mercator_1SP"],
        PARAMETER["central_meridian",0],
        PARAMETER["scale_factor",1],
        PARAMETER["false_easting",0],
        PARAMETER["false_northing",0],
        UNIT["metre",1,
            AUTHORITY["EPSG","9001"]],
        AXIS["X",EAST],
        AXIS["Y",NORTH],
        EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext  +no_defs"],
        AUTHORITY["EPSG","3857"]]
    Origin = (-3757031.250000000000000,11271093.750000000000000)
    Pixel Size = (152.873992919921875,-152.873992919921875)
    Image Structure Metadata:
      INTERLEAVE=PIXEL
    Corner Coordinates:
    Upper Left  (-3757031.250,11271093.750) ( 33d44'59.95"W, 70d36'45.36"N)
    Lower Left  (-3757031.250, 8766406.250) ( 33d44'59.95"W, 61d36'22.97"N)
    Upper Right (-1252343.750,11271093.750) ( 11d14'59.98"W, 70d36'45.36"N)
    Lower Right (-1252343.750, 8766406.250) ( 11d14'59.98"W, 61d36'22.97"N)
    Center      (-2504687.500,10018750.000) ( 22d29'59.97"W, 66d30'47.68"N)
    Band 1 Block=256x256 Type=Byte, ColorInterp=Red
      Overviews: 8192x8192, 4096x4096, 2048x2048, 1024x1024, 512x512
      Mask Flags: PER_DATASET ALPHA
      Overviews of mask band: 8192x8192, 4096x4096, 2048x2048, 1024x1024, 512x512
    Band 2 Block=256x256 Type=Byte, ColorInterp=Green
      Overviews: 8192x8192, 4096x4096, 2048x2048, 1024x1024, 512x512
      Mask Flags: PER_DATASET ALPHA
      Overviews of mask band: 8192x8192, 4096x4096, 2048x2048, 1024x1024, 512x512
    Band 3 Block=256x256 Type=Byte, ColorInterp=Blue
      Overviews: 8192x8192, 4096x4096, 2048x2048, 1024x1024, 512x512
      Mask Flags: PER_DATASET ALPHA
      Overviews of mask band: 8192x8192, 4096x4096, 2048x2048, 1024x1024, 512x512
    Band 4 Block=256x256 Type=Byte, ColorInterp=Alpha
      Overviews: 8192x8192, 4096x4096, 2048x2048, 1024x1024, 512x512
    
  • 读取根据UTFGrid规范编码的像素属性:

    $ gdallocationinfo /vsicurl/http://a.tiles.mapbox.com/v3/mapbox.geography-class.mbtiles -wgs84 2 49 -b 1 -xml
    

    输出:

    <Report pixel="33132" line="22506">
      <BandReport band="1">
        <LocationInfo>
          <Key>74</Key>
          <JSon>{"admin":"France","flag_png":"iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAABPklEQVR42u3cMRLBQBSA4Zc9CgqcALXC4bThBA5gNFyFM+wBVNFqjYTszpfi1Sm++bOv2ETEdNK2pc/T9ny977rCn+fx8rjtc7dMmybnxXy9KncGWGCBBRZYYIEFFlhggQUWWGCBBRZYYIE1/GzSLB0CLLAUCyywwAILLLDAAgsssGyFlcAqnJRiKRZYYIEFFlhggQUWWGDZCsFSLLDAAgsssP4DazQowVIssMACy1ZYG6wP30qxwFIssMACCyywwOr/HAYWWIplKwQLLLDAAgssZyywwAILLLDAqh6We4VgKZatECywFAsssMACCyywwAILLLBshWCBpVhggQUWWGCBBRZYYIFlKwQLLMUCCyywwAILLLBG+T8ZsMBSLFshWIoFFlhg/fp8BhZYigUWWGB9C+t9ggUWWGD5FA44XxBz7mcwZM9VAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDExLTA5LTAyVDIzOjI5OjIxLTA0OjAwcQbBWgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMS0wMi0yOFQyMTo0ODozMS0wNTowMJkeu+wAAABSdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWovQ29kZS90bS1tYXN0ZXIvZXhhbXBsZXMvZ2VvZ3JhcGh5LWNsYXNzL2ZsYWdzL0ZSQS5zdmen2JoeAAAAAElFTkSuQmCC"}</JSon>
        </LocationInfo>
        <Value>238</Value>
      </BandReport>
    </Report>
    
  • 将数据集转换为MBTiles并添加概述:

    $ gdal_translate my_dataset.tif my_dataset.mbtiles -of MBTILES
    $ gdaladdo -r average my_dataset.mbtiles 2 4 8 16
    
  • 打开矢量MBTiles:

    $ ogrinfo /home/even/gdal/data/mvt/out.mbtiles
    INFO: Open of `/home/even/gdal/data/mvt/out.mbtiles'
          using driver `MBTiles' successful.
    Metadata:
      ZOOM_LEVEL=5
      name=out.mbtiles
      description=out.mbtiles
      version=2
      minzoom=0
      maxzoom=5
      center=16.875000,44.951199,5
      bounds=-180.000000,-85.051129,180.000000,83.634101
      type=overlay
      format=pbf
    1: ne_10m_admin_1_states_provinces_shpgeojson (Multi Polygon)
    
  • 将地质包转换为矢量平铺MBTILES:

    $ ogr2ogr -f MBTILES target.mbtiles source.gpkg -dsco MAXZOOM=10
    

也见