将 PGFPlotsTable 中的多个外部图像放置在 PGFPlots 轴中

将 PGFPlotsTable 中的多个外部图像放置在 PGFPlots 轴中

我正在尝试创建一个环境,在其中我可以将多个地理参考图像放入 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: 图片1.png

图片2: 图片2.png

图片3: 图片3.png

答案1

\foreach关于和可能存在一些扩展问题\addplot。依我拙见,\addplot将读取文件名而不进行扩展。因此,包含的三幅图像不是image1image2image3,而是\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}

相关内容