生成包含多个地图的 tikz 图像

生成包含多个地图的 tikz 图像

我为这个问题奋斗了一段时间,却未能找到一个直接的答案。

我有几张地图需要在tikz环境中使用getmap包来显示。地图位置(街道、城镇、国家)的数据都存储在.dat文件中,因此我用来pgfplotstablegetelem读取位置并将其存储为新定义。然后,存储的参数用于输入drawMapE应该生成地图的命令。

问题是我找不到getmap正确的方法。生成的 URL 中没有城镇、街道和国家的名称,只有变量的名称。

该文件包含几列,其中包括国家、城镇、街道、缩写。

我感谢您对此的帮助。

请看一下这个MWE:

\documentclass[margin=0pt]{standalone}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[overwrite=true,mode=gm]{getmap}
\usepackage{tikz}
\usepackage{pgfplotstable}
\usetikzlibrary{backgrounds,decorations.pathmorphing,calc,external,fadings}
\pgfplotsset{compat=1.15}

\newcommand{\drawMapE}[6]{
\getmap[file=img/#1,
overwrite=true,
    color=blue,
    xsize=600,
    ysize=600,
    zoom=16,
    scale=2,
    markers={&markers=size:mid|color:green|#2},
    visible={#3},
]{}
   \node at (#4,#5) {\includegraphics[width=#6cm]{img/#1}};
}

\begin{document}

\pgfplotstableread[col sep=comma,header=has colnames]{table/places.dat}{\datawhead}

\begin{tikzpicture}
\pgfmathsetmacro\W{40}
\pgfmathsetmacro\H{40}
\pgfmathsetmacro\R{10}
\clip (0,0) rectangle (\W,\H);
\foreach \a/\i in {0/1,30/2}{
   \pgfmathsetmacro\x{\W/2+\R*cos(\a)}
   \pgfmathsetmacro\y{\H/2+\R*sin(\a)}
   \pgfplotstablegetelem{\i}{street}\of{\datawhead}
   \edef\street{\expandafter\pgfplotsretval}
   \pgfplotstablegetelem{\i}{town}\of{\datawhead}
   \edef\town{\pgfplotsretval}
   \pgfplotstablegetelem{\i}{country}\of{\datawhead}
   \edef\country{\pgfplotsretval}
   \pgfplotstablegetelem{\i}{abbr}\of{\datawhead}
   \def\fileName{\pgfplotsretval}

   \drawMapE{\fileName}{\street,\town,\country}{}{\x}{\y}{5}
}
\end{tikzpicture}
\end{document}

本例中假设生成两个内容不同(地址不同)的地图,中间相距 R 处。此处由于 URL 错误,地址自动更改为默认地址。日志文件示例:

PGFPlots: reading {table/places.dat}
Package getmap Info: using latin1 encoding on input line 47.
(/usr/local/texlive/2016/texmf-dist/tex/generic/oberdiek/se-iso-8859-1.def
File: se-iso-8859-1.def 2016/05/16 v1.11 stringenc: ISO-8859-1
)
(/usr/local/texlive/2016/texmf-dist/tex/generic/oberdiek/se-utf8.def
File: se-utf8.def 2016/05/16 v1.11 stringenc: UTF-8
)
runsystem(getmapdl  -l "" -m gm -x 600 -y 600 -z 16 -s 2 -t roadmap -i  png -c "
blue" -n 1 -L "en" -M "&markers=size:mid|color:green|\street ,\town ,\country "
 -C "" -P "" -p "" -V "" -o img/kaart6c)...executed.

该代码生成以下图片: 两张地图与中心的距离为 R

places.dat 包含以下内容:

abbr,street,town,country,month,year
arne5,Arne Ulstrups vei 4,H{\o}vik,Norway,October,2008

答案1

我拜访了德语论坛@naphaneal 的建议,并找到了一些有用的信息,谢谢!首先,似乎需要使用数据工具包使用 \expandonce 为 \getmap 命令提供正确的位置地址。这与前列腺素命令解决了我遇到的问题。

需要说明的是:我有大约 12 张地图要放入我的图像中,但编译 tex 文件后,并非所有地图都已提取,其中三张是空文件。在这种情况下,删除空的 .png 文件,然后重新编译,并将 \getmap 命令的选项 overwrite 设置为 false。

overwrite=false

通常一次尝试就足以获取丢失的文件。完整的工作代码:

\documentclass[margin=0pt,crop,tikz]{standalone}
\usepackage[utf8]{inputenc}
\usepackage{graphicx}
\usepackage{tikz}
\usepackage{datatool}
\usepackage[mode=gm]{getmap}

\begin{document}

\DTLsetseparator{,}
\DTLloaddb{places}{table/places.dat}

\begin{tikzpicture}

\pgfmathsetmacro\W{40}
\pgfmathsetmacro\H{40}
\pgfmathsetmacro\R{15}
\clip (0,0) rectangle (\W,\H);
\draw (0,0) rectangle (\W,\H);   

\DTLforeach*{places}{\street=street,\town=town, \country=country,\abbr=abbr}{%
    \begingroup
    \edef\x{\endgroup
    \noexpand\getmap[
        file=img/\abbr,%
        overwrite=false,
        color=blue,
        xsize=600,
        ysize=600,
        zoom=16,
        scale=2
        ]{%
            \expandonce\street, \expandonce\town, \expandonce\country%
         }%
     }\x
     \pgfmathsetmacro\xi{0.5*\W+\R*cos(\DTLcurrentindex*30)}
     \pgfmathsetmacro\yi{0.5*\H+\R*sin(\DTLcurrentindex*30)}

     \node[anchor=center,inner sep=0,outer sep=0] at (\xi,\yi) {\includegraphics[width=8cm]{img/\abbr}};
}
\end{tikzpicture}
\end{document}

places.dat 文件的示例:

abbr,street,town,country,month,year
arne5,Arne Ulstrups vei 4,H{\o}vik,Norway,October,2008

相关内容