为啥 MapServer 不能识别从 ogrtindex 创建的 shp 文件?

Posted

技术标签:

【中文标题】为啥 MapServer 不能识别从 ogrtindex 创建的 shp 文件?【英文标题】:Why doesn't MapServer recognize shp file created from ogrtindex?为什么 MapServer 不能识别从 ogrtindex 创建的 shp 文件? 【发布时间】:2021-04-20 07:36:22 【问题描述】:

我正在尝试从 tif 金字塔创建 MapServer 图层,但总是遇到相同的错误:

msDrawMap():图像处理错误。未能绘制名为“ign_2020”的图层。; msDrawRasterLayerLow():无法访问文件。层“ign_2020”的文件“/srv/shapes/ign_2020/PLANIGN08_TIF_LAMB93_D074/dalles.shp,0”损坏、空或丢失。 /srv/shapes/ign_2020/PLANIGN08_TIF_LAMB93_D074/dalles.sh,0:没有这样的文件或目录

这是我的/srv/shapes 目录的样子:

.
`-- ign_2020
    |-- PLANIGN08_TIF_LAMB93_D074
    |   |-- PLANIGN08_0840_6550_L93.tab
    |   |-- PLANIGN08_0840_6550_L93.tif
    |   |-- PLANIGN08_0840_6750_L93.tab
    |   |-- PLANIGN08_0840_6750_L93.tif
    |   |-- dalles.dbf
    |   |-- dalles.prj
    |   |-- dalles.shp
    |   `-- dalles.shx
    |-- PLANIGN09_TIF_LAMB93_D074
    |   |-- PLANIGN09_0840_6550_L93.tab
    |   |-- PLANIGN09_0840_6550_L93.tif
    |   |-- PLANIGN09_0840_6750_L93.tab
    |   |-- PLANIGN09_0840_6750_L93.tif
    |   |-- dalles.dbf
    |   |-- dalles.prj
    |   |-- dalles.shp
    |   `-- dalles.shx
    |-- PLANIGN10_TIF_LAMB93_D074
    |   |-- PLANIGN10_0840_6550_L93.tab
    |   |-- PLANIGN10_0840_6550_L93.tif
    |   |-- PLANIGN10_0840_6750_L93.tab
    |   |-- PLANIGN10_0840_6750_L93.tif
    |   |-- dalles.dbf
    |   |-- dalles.prj
    |   |-- dalles.shp
    |   `-- dalles.shx
    |-- tileindex.dbf
    |-- tileindex.prj
    |-- tileindex.shp
    `-- tileindex.shx

还有许多其他目录,例如名为 PLANIGN##_TIF_LAMB93_D074 的目录,其中 ## 是 tiff 金字塔的一层。 现在,根据this page,我运行的命令来生成每个 dalles.shp :

for d in /srv/shapes/ign_2020/PLAN*; do gdaltindex $d/dalles.shp $d/*.tif; done

还有我用来创建主 tileindex.shp 到 ign_2020 目录的那个:

ogrtindex srv/shapes/ign_2020/tileindex.shp /srv/shapes/ign_2020/*/*.shp

请注意,我只使用绝对路径来避免 MapServer 使用随机相对路径。 最后是我的 MapServer 版本和关联的图层文件:

MapServer version 7.4.0 OUTPUT=PNG OUTPUT=JPEG SUPPORTS=PROJ SUPPORTS=AGG SUPPORTS=FREETYPE SUPPORTS=CAIRO SUPPORTS=ICONV SUPPORTS=XMP SUPPORTS=FRIBIDI SUPPORTS=WMS_SERVER SUPPORTS=WMS_CLIENT SUPPORTS=WFS_SERVER SUPPORTS=WFS_CLIENT SUPPORTS=WCS_SERVER SUPPORTS=FASTCGI SUPPORTS=GEOS SUPPORTS=POINT_Z_M INPUT=JPEG INPUT=POSTGIS INPUT=OGR INPUT=GDAL INPUT=SHAPEFILE
LAYER
    NAME                    "ign_2020"
    TYPE                    RASTER
    TILEINDEX               "ign_2020/tileindex.shp"
    TILEITEM                "LOCATION"
END

所以 MapServer 找到了 tileindex.shp 但看起来 ogrtindex 在每个 dalles.shp 文件的路径之后添加了一个,0,正如您在错误消息中看到的那样。我错过了什么吗?

【问题讨论】:

【参考方案1】:

澄清一下:ogrtindex 用于索引矢量,而 gdaltindex 用于索引 MapServer 中的栅格。因此,这里有一些可能的步骤:

    假设您具有以下目录结构:

    - mainfolder
      - data
        - ign_2020
          - PLANIGN08_TIF
          - PLANIGN09_TIF
          ...
      - tileindex.map
    

    为 .tif 文件生成 tileindex。因为您有各种包含数据的子文件夹,所以我们可以使用 gdaltindex 的 --optfile 开关来传递要使用的文件列表。以下是命令(适用于 Windows 和 Unix):

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

    因为我们应该始终使用相对路径,所以在文本编辑器中打开那个“tif_list.txt”,然后搜索并替换到数据的路径,而不是完整路径,例如:

    D:\mainfolder\data\ign_2020\PLANIGN08_TIF\PLANIGN08_0840_6550_L93.tif
    D:\mainfolder\data\ign_2020\PLANIGN08_TIF\PLANIGN08_0840_6750_L93.tif
    D:\mainfolder\data\ign_2020\xxxxxx1\xxxx1.tif
    D:\mainfolder\data\ign_2020\xxxxxx1\xxxx2.tif
    

    它列出了这个:

    ign_2020\PLANIGN08_TIF\PLANIGN08_0840_6550_L93.tif
    ign_2020\PLANIGN08_TIF\PLANIGN08_0840_6750_L93.tif
    ign_2020\xxxxxx1\xxxx1.tif
    ign_2020\xxxxxx1\xxxx2.tif
    

    现在您已准备好生成索引:

    gdaltindex gdaltindex.shp --optfile tif_list.txt
    

    将该 gdaltindex.shp 文件加载到 QGIS 并查看其属性表,“位置”字段将包含那些不错的相对路径。

    #protip:您可以通过shptree 运行该索引文件,以便 MapServer 快速找到特征/记录:

    shptree gdaltindex.shp
    

    现在您已准备好将该图层包含在您的地图文件中。请记住,您的地图文件位于“数据”文件夹上方的“主文件夹”中。这是一个示例地图文件:

    MAP
      NAME "tileindex-map"
      STATUS ON
      SIZE 600 400
      SYMBOLSET "../etc/symbols.txt"
      #output extents
      EXTENT -99.99 43.13 -86.70 49.60
      UNITS DD
      SHAPEPATH "./data"
      IMAGECOLOR 255 255 255
      FONTSET "../etc/fonts.txt"
      #output projection
      PROJECTION 
        "init=epsg:4269"
      END # projection
    
      /* your index layer */
      LAYER
        NAME "ortho"
        TYPE RASTER
        STATUS ON
        TILEITEM "LOCATION"
        TILEINDEX "gdaltindex.shp"
        #source projection
        PROJECTION
          "init=epsg:26915"
        END # projection
      END # layer
    
    END # Map File
    

    注意 SHAPEPATH 指向数据文件夹,因此,当 MapServer 找到该索引记录时,它使用相对于地图文件位置的 SHAPEPATH/LOCATION 路径,例如

    /data/ign_2020/PLANIGN08_TIF/PLANIGN08_0840_6550_L93.tif
    

    最后用shp2img测试你的mapfile,生成地图图片,如:

    #make sure you cd into /mainfolder (that's where you mapfile lives)
    shp2img -m tileindex.map -o ttt.png -map_debug 3
    

    您应该会看到列出绘制速度的输出,并且应该在您的“主文件夹”中创建一个文件“ttt.png”

我希望这会有所帮助。我今天还将所有这些(作为 2 个完整示例,带有图像,用于 ogrtindex 和 gdaltindex)添加到主 tileindex 文档https://mapserver.org/optimization/tileindex.html#long-ogrtindex-example

谢谢,

 Jeff McKenna
 GatewayGeo
 @mapserving

【讨论】:

以上是关于为啥 MapServer 不能识别从 ogrtindex 创建的 shp 文件?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Django 模板不能从对象字段中识别列表?

为啥mac的virtualbox不能识别win 10的iso文件

为啥不能识别“异步无效”单元测试?

为啥命令行不能识别这个 java 命令?

为啥流明不能识别正在发送的字段

为啥 Xcode 不能识别这些着色器?