瓦片索引

作者

杰夫麦克纳

联系

jmckenna在gatewaygeomatics.com

原作者

主机地理信息系统

最后更新

2021-03-23

介绍

切片索引是MapServer进行动态镶嵌的方法。

什么是tileindex?我怎么做?

Tileindex是将多个数据集绑定到单个层中的数据集(通常是shapefile)。因此,您不需要为每一幅图像或每个县的道路数据创建单独的层;创建一个tileindex并让MapServer动态地将马赛克拼接在一起。

创建平铺索引很容易使用 gdaltindex 对于GDAL数据源(栅格)和 ogrtindex 用于OGR数据源(向量)。您只需运行它们,指定要创建的索引文件和要添加到索引的数据源列表。

备注

还有一个是 Ti4Ms 实用工具,但它只处理shapefile马赛克/索引。

例如,要制作多个GeoTIFF的镶嵌,请创建名为的索引文件 tileindex-tif.shp

gdaltindex tileindex-tif.shp folder/*.tif

并制作矢量的马赛克,创建一个名为 tileindex-tiger.shp

ogrtindex tileindex-tiger.shp tiger/CA/*.shp tiger/NV/*.shp

如果您的数据文件位于不同的子文件夹中,则可以使用 --optfile 切换到 vectorsrasters 要将文件列表传递给ogrtindex/gdaltindex,例如:

#windows (create a file listing all .tif in subfolders)
dir /s/b *.tif > tif_list.txt
#unix
find . -name "*.tif" > tif_list.txt

#call gdaltindex with the --optfile switch
gdaltindex gdaltindex-dirs.shp --optfile tif_list.txt

备注

Ogratindex和Gdatindex add 索引的指定文件。有时您必须删除索引文件以避免创建重复条目。

在映射文件中使用tileindex

使用tileindex作为层最好用一个例子来解释:

LAYER
    NAME "Roads"
    STATUS ON
    TYPE LINE
    TILEINDEX "tiger/index.shp"
    TILEITEM "LOCATION"
END

这里有两个注意事项: TILEINDEXTILEITEM . tileindex只是索引文件的路径,tileitem指定shapefile中包含索引引用的文件名的字段。tileitem通常是“location”,除非在运行gdaltindex或ogrtindex时指定了*-tileindex*选项。

关于路径名的两个重要说明:

  • tileindex的路径遵循与任何其他数据源相同的约定,例如使用shapepath或与mapfile的位置相关。

  • 在命令行上指定给gdaltindex或ogrtindex的文件名也将与相同的约定一起使用,遵循SHAPEPATH或相对于映射文件的位置。您可能会发现,切换到SHAPEPATH目录,然后从那里运行ogrtindex/gdaltindex会很有用;这可以确保路径名正确。

tileindexes可以使地图更快

tileindex通常是性能提升的两个原因:

  • 它比有几个单独的层更有效。

  • MapServer将检查tileIndex以确定哪些数据集属于地图视图,并将仅打开这些数据集。这可以极大地节省大型数据集的开销,尤其是在大多数时间只使用非常小的数据空间区域的情况下。(例如,具有全国性街道图像的城市范围地图)

小技巧

您还可以运行 希普特里 在您的tileindex文件上,以便MapServer可以更快地找到关联的要素/记录。

TileIndex在所有/大部分数据源通常都会被打开的情况下(例如,按县划分的街道数据,显示州或更大的区域)没有帮助。在这种情况下,它甚至可能导致性能下降,因为打开100个文件可能比打开一个大文件慢。

TileIndex的理想情况是,当最典型的请求地图区域属于非常少的图块时。例如,如果要显示州和更大的区域,请尝试将数据拟合到州大小的块,而不是县大小的块;如果要显示市和县,请转到县大小的块。

您只需要对它进行试验,看看什么最适合您的用例。

不同投影中的瓷砖索引

从用于栅格图层的MapServer 6.4和用于矢量图层的MapServer 7.2开始,标题索引可以包含不同投影中的栅格/层。这种标题索引可以用 gdaltindex (GDAL 1.11或更高版本)和 ogrtindex (GDAL 2.2或更高版本),带有-t_srs和-src_srs_name选项。-t_srs指示gdaltindex/ogrtindex将每个瓦片的包络写入到公共目标投影中,以便瓦片索引中写入的几何图形是一致的。此公共投影必须是栅格/矢量层的投影。

gdaltindex -t_srs EPSG:4326 -src_srs_name src_srs imagery.shp imagery/*.tif

相应的层定义需要指定 TILESRS 关键字,其值为-src_srs_name选项。

例如:

LAYER
    NAME "My Imagery"
    STATUS ON
    TYPE RASTER
    TILEINDEX "imagery.shp"
    TILEITEM "LOCATION"
    TILESRS "src_srs"
    PROJECTION
        AUTO
        # or :
        # "+init=EPSG:4326"
    END
END

然后,MapServer将能够进行实时的镶嵌和重新投影。

WCS层的注意事项

对于必须作为WCS层公开的层,必须在层定义中指定一些元数据字段(“WCS范围”、“WCS大小”、“WCS分辨率”),以便定义“虚拟数据集”覆盖范围(请参见 WCS服务器 )gdal wcs_virtds_params.py示例脚本可以帮助生成这些元数据字段。

较长的ogrtindex示例

本例使用老虎普查数据,其中数据包含按县划分的文件。在本例中,我们将展示如何显示明尼苏达州的所有湖泊。明尼苏达州的老虎普查数据由85个不同的县组成,每个县都有自己的湖泊文件(‘xxxx_areawater.shp’)。

图1:QGIS中显示的县湖文件

../_images/tileindex-qgis-shps.png

我们的目录结构如下所示(‘tiger2020’包含85个shapefile):

- mainfolder
   - data
     - tiger2020
   - tileindex.map
  1. 我们需要使用ogrtindex生成索引文件。首先,我们将目录更改为 data 文件夹,以便在那里生成索引文件,然后执行ogrtindex:

    cd data
    ogrtindex lakes-ogrtindex.shp tiger2020/*.shp
    
  2. 我们现在可以加载该新索引文件 lakes-ogrtindex.shp 进入QGIS进行检查。

    图2:ogrtindex实用程序创建的索引文件

    ../_images/tileindex-qgis-shps-index.png

    图3:ogrtindex实用程序创建的索引文件的属性

    ../_images/tileindex-qgis-shps-index-attributes.png

备注

请注意Location字段中的相对路径,这是ogrtindex的默认(也是推荐的)。如果需要完整/绝对路径,可以使用 -write_absolute_path 换一下。

  1. 一个建议是,然后跑 希普特里 在ogrtindex文件和所有使用的.shp文件上,以便MapServer可以快速访问它们。

    cd data
    #windows command:
    for /R %f in (*.shp) do shptree %f
    #unix command:
    find /path/to/data -name "*.shp" -exec shptree {} \;
    

    现在,您应该看到关联的 .qix 为每个shapefile创建的文件。

  2. 最后一步是在您的映射文件中使用它。

    • Layer对象的TILEINDEX-必须指向索引文件的位置

    • Layer对象的TILEITEM-指定索引文件中包含路径的字段的名称(缺省值为‘Location’)

    • 不需要使用图层的数据参数

    • Tileindex文件中的位置路径将相对于SHAPEPATH,如下所示:

    例如:

    MAP
      NAME "tileindex-map"
      STATUS ON
      SIZE 600 400
      SYMBOLSET "../etc/symbols.txt"
      EXTENT -99.99 43.13 -86.70 49.60
      UNITS DD
      SHAPEPATH "./data"
      IMAGECOLOR 255 255 255
      FONTSET "../etc/fonts.txt"
      PROJECTION
        "init=epsg:4269"
      END # projection
    
      /* Lakes: Tiger Census 2020 */
      LAYER
        NAME "lakes"
        TYPE POLYGON
        STATUS OFF
        TILEITEM "LOCATION"
        TILEINDEX "lakes-ogrtindex.shp"
        PROJECTION
          "init=epsg:4269"
        END # projection
        CLASS
          NAME "Lakes"
          STYLE
            COLOR 134 204 249
          END # style
        END # class
      END # layer
    
    END # Map File
    
  3. 当然还有使用 Sp2IMG 以生成您的地图图像。

    shp2img -m tileindex.map -o ttt.png -map_debug 3
    
    ../_images/tileindex-lakes.png

    当您在MapServer应用程序中查看该层时,您会注意到,当您放大到该州的一小块区域(如一个县)时,仅加载了必要的湖泊shapefile,这加快了应用程序的运行速度。

较长的gdaltindex示例

本例使用明尼苏达州各县的NAIP正射影像。格式为Mr SID。由于数据如此之大,在本练习中使用了6个县(因此使用了6个MRSID栅格文件)。本例中的示例文件名为 ortho_xxxx.sid

图1:QGIS中显示的MRSID图像

../_images/tileindex-qgis-mrsid.png

我们的目录结构如下所示(‘neip2019’包含6个Mr SID镜像):

- mainfolder
   - data
     - naip2019
   - tileindex.map
  1. 我们需要使用gdaltindex生成索引文件。首先,我们将目录更改为 data 文件夹,以便在那里生成索引文件,然后执行gdaltindex:

    cd data
    gdaltindex naip-imagery-gdaltindex.shp naip2019/*.sid
    
  2. 我们现在可以加载该新索引文件 naip-imagery-gdaltindex.shp 进入QGIS进行检查。

    图2:由gdaltindex实用程序创建的索引文件

    ../_images/tileindex-qgis-mrsid-index.png

    图3:gdaltindex实用程序创建的索引文件的属性

    ../_images/tileindex-qgis-mrsid-index-attributes.png

备注

请注意Location字段中的相对路径,这是gdaltindex的默认(也是推荐的)。如果需要完整/绝对路径,可以使用 -write_absolute_path 换一下。

  1. 一个建议是,然后跑 希普特里 Gdaltindex文件上,以便MapServer可以快速访问它。

    cd data
    shptree naip-imagery-gdaltindex.shp
    

    现在,您应该看到一个 .qix 已创建文件。

  2. 最后一步是在您的映射文件中使用它。

    • Layer对象的TILEINDEX-必须指向索引文件的位置

    • Layer对象的TILEITEM-指定索引文件中包含路径的字段的名称(缺省值为‘Location’)

    • 不需要使用图层的数据参数

    • Tileindex文件中的位置路径将相对于SHAPEPATH,如下所示:

    例如:

    MAP
      NAME "tileindex-map"
      STATUS ON
      SIZE 600 400
      SYMBOLSET "../etc/symbols.txt"
      EXTENT -99.99 43.13 -86.70 49.60
      UNITS DD
      SHAPEPATH "./data"
      IMAGECOLOR 255 255 255
      FONTSET "../etc/fonts.txt"
      PROJECTION
        "init=epsg:4269"
      END # projection
    
      /* Ortho imagery: NAIP 2019 */
      LAYER
        NAME "ortho"
        TYPE RASTER
        STATUS ON
        TILEITEM "LOCATION"
        TILEINDEX "naip-imagery-gdaltindex.shp"
        PROJECTION
          "init=epsg:26915"
        END # projection
      END # layer
    
    END # Map File
    
  3. 当然还有使用 Sp2IMG 以生成您的地图图像。

    shp2img -m tileindex.map -o ttt.png -map_debug 3
    
    ../_images/tileindex-mrsid.png

    当您在MapServer应用程序中查看该层时,您会注意到,当您放大到该州的一小块区域(例如一个县)时,只加载了必要的mr SID图像,这加快了应用程序的运行速度。