我正在尝试创建一个环境,在其中我可以将多个地理参考图像放入 PGFPlots 轴。
我有可执行的代码,可以读取指定的图像,读取世界文件(一个文本文件,指定现实世界坐标中的图像边界框),然后将所有内容保存在 pgfplotstable 中。所有这些都按预期工作。
当我尝试绘制图像时,问题就出现了。\foreach
我使用的循环逐行读取表格,分配表格中定义的图形限制,然后应该包含表格第一列中列出的图形文件。结果却是,循环中的每个步骤都使用表格中的最后一幅图像,而之前的图像则不会被绘制。
这三幅图像的位置正确 - 只是在最后一步之前的所有步骤都使用了错误的图像文件。我尝试\let\imageName\pgfplotsretval
在宏中使用\ExtractRow
,但在编译时出现未定义的控制序列错误。我唯一能让它编译的方法是使用\xdef\imageName\pgfplotsretval
。
MWE 如下:
\documentclass{standalone}
\usepackage{pgfplots,pgfplotstable}
\def\ExtractRow#1#2{
\pgfplotstablegetelem{#2}{1}\of#1
\let\xmin\pgfplotsretval
\pgfplotstablegetelem{#2}{2}\of#1
\let\xmax\pgfplotsretval
\pgfplotstablegetelem{#2}{3}\of#1
\let\ymin\pgfplotsretval
\pgfplotstablegetelem{#2}{4}\of#1
\let\ymax\pgfplotsretval
\pgfplotstablegetelem{#2}{0}\of#1
\xdef\imageName{\pgfplotsretval}
}
\begin{document}
\pgfplotstableread[col sep=comma,header=false]{
image1,357294.259463,359521.072742,4574707.814338,4576076.199597
image2,357298.194481,357792.613845,4575702.121062,4576047.871412
image3,357772.545188,358761.387418,4575306.493347,4575997.994047
}\GeoTable
\pgfplotstablegetrowsof{\GeoTable}
\pgfmathsetmacro{\RowCount}{\pgfplotsretval-1}
\begin{tikzpicture}
\begin{axis}
\foreach \i in {0,...,\RowCount}{
\ExtractRow\GeoTable{\i}
\addplot graphics[xmin=\xmin,ymin=\ymin,xmax=\xmax,ymax=\ymax]{\imageName};
}
\end{axis}
\end{tikzpicture}
\end{document}
答案1
\foreach
关于和可能存在一些扩展问题\addplot
。依我拙见,\addplot
将读取文件名而不进行扩展。因此,包含的三幅图像不是image1
、image2
和image3
,而是\imageName
、\imageName
和\imageName
。当 PGFPLOTS 尝试包含图像时,三个\imageName
标记将全部扩展为最新值:image3
,从而得到结果。
为了解决此类问题,PGF 系列通常会定义一个,\pgf@marshal
以便可以使用单个\expandafter
来跳过它。在这种情况下,您可以执行以下操作:
\begin{axis}
\foreach \i in {0,...,\RowCount}{
\ExtractRow\GeoTable{\i}
\def\pgfplotsmarshal{\addplot graphics[xmin=\xmin,ymin=\ymin,xmax=\xmax,ymax=\ymax]}
\expandafter\pgfplotsmarshal\expandafter{\imageName.png};
}
\end{axis}