为啥 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 文件?的主要内容,如果未能解决你的问题,请参考以下文章