From a48e022ccd9615eca46bbd4f4cde16f641296eb5 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sat, 20 Sep 2014 22:21:35 +0000 Subject: getmap (20sep14) git-svn-id: svn://tug.org/texlive/trunk@35218 c570f23f-e606-0410-a88d-b1316a301751 --- .../texlive/linked_scripts/getmap/getmapdl.lua | 210 ++++++++-- Master/texmf-dist/doc/latex/getmap/README | 17 +- Master/texmf-dist/doc/latex/getmap/getmap.dtx | 451 ++++++++++++++++----- Master/texmf-dist/doc/latex/getmap/getmap.pdf | Bin 1767909 -> 1938258 bytes Master/texmf-dist/scripts/getmap/getmapdl.lua | 210 ++++++++-- Master/texmf-dist/tex/latex/getmap/getmap.sty | 2 +- 6 files changed, 709 insertions(+), 181 deletions(-) diff --git a/Build/source/texk/texlive/linked_scripts/getmap/getmapdl.lua b/Build/source/texk/texlive/linked_scripts/getmap/getmapdl.lua index f8dac4aa3cd..0ca4ac6bbb3 100644 --- a/Build/source/texk/texlive/linked_scripts/getmap/getmapdl.lua +++ b/Build/source/texk/texlive/linked_scripts/getmap/getmapdl.lua @@ -3,7 +3,8 @@ -- getmapdl [options] -- -- downloads an OpenStreetMap, Google Maps or Google Street View map --- specified by [options] or parses gpx or gps files to create encoded polylines +-- specified by [options] or parses gpx, gps and kml files to create +-- encoded polylines -- -- License: LPPL -- @@ -36,9 +37,10 @@ local FOV = "" local PITCH = "" local LANGUAGE = "" local GPFILE = "" +local KMLFILE = "" local OFILE = "getmap" local QUIET = "false" -local VERSION = "v1.3 (16/08/2014)" +local VERSION = "v1.4 (18/09/2014)" function pversion() print("getmapdl.lua " .. VERSION) @@ -51,12 +53,12 @@ function phelp() getmapdl.lua [options] downloads an OpenStreetMap, Google Maps or Google Street View map - specified by [options] or parses gpx or gps files to create + specified by [options] or parses gpx, gps and kml files to create encoded polylines Options: - -m specify the mode (osm|gm|gsv|gpx2epl|gps2epl|gpx2gps) + -m specify the mode (osm|gm|gsv|gpx2epl|gps2epl|gpx2gps|kml2epl|kml2gps) -l specify a location e.g. 'Bergheimer Straße 110A, 69115 Heidelberg, Germany' @@ -124,6 +126,10 @@ getmapdl.lua [options] -G specify the gpx or gps file + kml2epl and kml2gps mode only: + + -K specify the kml file + ]]) pversion() end @@ -172,6 +178,13 @@ function encodeNumber(number) return table.concat(t) end +function printepl(epltable) + local string = table.concat(epltable) + -- sometimes the sting contains unwanted control characters + local stingwithoutcontrolcharacters = string:gsub("%c", "") + print(stingwithoutcontrolcharacters) +end + do local newarg = {} local i, limit = 1, #arg @@ -242,6 +255,9 @@ do elseif arg[i] == "-G" then GPFILE = arg[i+1] i = i + 1 + elseif arg[i] == "-K" then + KMLFILE = arg[i+1] + i = i + 1 elseif arg[i] == "-o" then OFILE = arg[i+1] i = i + 1 @@ -264,22 +280,42 @@ if QUIET == 1 then end if MODE == "gpx2epl" then - local file = io.open(GPFILE, "r") + local file = GPFILE + local name + local desc local Olatitude = 0 local Olongitude = 0 local epl = {} - io.input(file) - while true do - local line = io.read() - if line == nil - then - break + for line in io.lines(file) + do + local latitude + local longitude + local encnum + + if string.match(line, "") then + Olatitude = 0 + Olongitude = 0 + name = "" + desc = "" + epl = {} end - if string.match(line, "trkpt") then - local latitude - local longitude - local encnum + if string.match(line, "(.-)') + if name == nil then + name = "Name (E)" + end + end + if string.match(line, "(.-)') + if desc == nil then + desc = "" + end + end + if string.match(line, "") then + printepl(epl) + print("\n") + end end - local string = table.concat(epl) - -- sometimes the sting contains unwanted control characters - local stingwithoutcontrolcharacters = string:gsub("%c", "") - print(stingwithoutcontrolcharacters) os.exit(0) end if MODE == "gpx2gps" then - local file = io.open(GPFILE, "r") - io.input(file) - while true do - local line = io.read() - if line == nil - then - break + local file = GPFILE + local name + local desc + + for line in io.lines(file) + do + local latitude + local longitude + local encnum + + if string.match(line, "") then + name = "" + desc = "" end - if string.match(line, "trkpt") then - local latitude - local longitude + if string.match(line, "(.-)') + if name == nil then + name = "Name (E)" + end + end + if string.match(line, "(.-)') + if desc == nil then + desc = "" + end + end + if string.match(line, "") then + print("\n") + end end os.exit(0) end if MODE == "gps2epl" then - local file = io.open(GPFILE, "r") + local file = GPFILE local Olatitude = 0 local Olongitude = 0 local epl = {} - io.input(file) - while true do - local line = io.read() - if line == nil - then - break - end + for line in io.lines(file) + do local latitude local longitude local encnum @@ -345,10 +398,85 @@ if MODE == "gps2epl" then Olatitude = latitude Olongitude = longitude end - local string = table.concat(epl) - -- sometimes the sting contains unwanted control characters - local stingwithoutcontrolcharacters = string:gsub("%c", "") - print(stingwithoutcontrolcharacters) + printepl(epl) + os.exit(0) +end + +if MODE == "kml2gps" or MODE == "kml2epl" then + local file = KMLFILE + local name + local cdata + local cotype + local Olatitude = 0 + local Olongitude = 0 + local epl = {} + + for line in io.lines(file) + do + local latitude + local longitide + local elevation + + -- reset for new route + if string.match(line, "") then + Olatitude = 0 + Olongitude = 0 + cotype = nil + epl = {} + end + if string.match(line, "") then + name = string.match(line, '(.-)') + if name == nil then + name = "Name (E)" + end + end + if string.match(line, "CDATA") then + cdata = string.match(line, 'CDATA%[(.-)%]') + if cdata == nil then + cdata = "" + end + end + if string.match(line, "") then + cotype = "point" + end + if string.match(line, "") then + cotype = "route" + end + if cotype == "point" or cotype == "route" then + if string.match(line, "") then + local colist = string.match(line, '(.-)') + if cotype == "route" then + print("Route: " .. name) + else + print("Point: " .. name .. " [" .. cdata .. "]") + end + for cocsv in string.gmatch(colist, "%S+") do + longitude, latitude, altitude = cocsv:match("([^,]+),([^,]+),([^,]+)") + if MODE == "kml2epl" then + local encnum + if cotype == "route" then + latitude = round(latitude,5)*100000 + longitude = round(longitude,5)*100000 + encnum = encodeNumber(latitude - Olatitude) + table.insert(epl,encnum) + encnum = encodeNumber(longitude - Olongitude) + table.insert(epl,encnum) + Olatitude = latitude + Olongitude = longitude + else + print(latitude .. "," .. longitude) + end + else + print(latitude .. "," .. longitude) + end + end + if MODE == "kml2epl" and cotype == "route" then + printepl(epl) + end + print("\n") + end + end + end os.exit(0) end diff --git a/Master/texmf-dist/doc/latex/getmap/README b/Master/texmf-dist/doc/latex/getmap/README index c3ce117374a..ef8f4e64f16 100644 --- a/Master/texmf-dist/doc/latex/getmap/README +++ b/Master/texmf-dist/doc/latex/getmap/README @@ -8,16 +8,21 @@ use this script also from the command line. License: LPPL -Changes in v1.6: +Changes in v1.7: -- added gpx2epl, gps2epl and gpx2gps modes to getmapdl.lua +- added kml2epl and kml2gps modes to getmapdl.lua - parses gpx and gps files and outputs gps or epl (encoded - polylines) to STDOUT, e.g: + Google's *new* version of 'My Maps' allows the definition of + markers, routes and arbitrary lines on different layers and + export of all of these into kml files. - getmapdl -m gpx2epl -G myroute.gpx >myroute.epl + getmapdl -m kml2epl -K file.kml -- removed gpx2gps bash file + will parse the file and output the geographical coordinates of + defined places and the routes and lines as encoded polylines + +- added multi track support for gpx2epl and gpx2gps modes; + revised gps2epl mode - updated documentation diff --git a/Master/texmf-dist/doc/latex/getmap/getmap.dtx b/Master/texmf-dist/doc/latex/getmap/getmap.dtx index c6b299b4652..29d6404f5fd 100644 --- a/Master/texmf-dist/doc/latex/getmap/getmap.dtx +++ b/Master/texmf-dist/doc/latex/getmap/getmap.dtx @@ -14,16 +14,21 @@ use this script also from the command line. License: LPPL -Changes in v1.6: +Changes in v1.7: -- added gpx2epl, gps2epl and gpx2gps modes to getmapdl.lua +- added kml2epl and kml2gps modes to getmapdl.lua - parses gpx and gps files and outputs gps or epl (encoded - polylines) to STDOUT, e.g: + Google's *new* version of 'My Maps' allows the definition of + markers, routes and arbitrary lines on different layers and + export of all of these into kml files. - getmapdl -m gpx2epl -G myroute.gpx >myroute.epl + getmapdl -m kml2epl -K file.kml + + will parse the file and output the geographical coordinates of + defined places and the routes and lines as encoded polylines -- removed gpx2gps bash file +- added multi track support for gpx2epl and gpx2gps modes; + revised gps2epl mode - updated documentation @@ -134,6 +139,13 @@ download getmap.dtx and makefile (Linux) or install.bat (Windows) year = {2014}, } +@misc{bib:berlinkml, + author = {Kleber, Josef}, + note = {\href{https://bitbucket.org/kleberj/getmap/downloads/Berlin.kml}{https://bitbucket.org/kleberj/getmap/downloads/Berlin.kml}}, + title = {{Berlin: Hbf Berlin - Brandenburger Tor (getmap Test)}}, + year = {2014}, + } + % %<*luafile> #!/usr/bin/env texlua @@ -141,7 +153,8 @@ download getmap.dtx and makefile (Linux) or install.bat (Windows) -- getmapdl [options] -- -- downloads an OpenStreetMap, Google Maps or Google Street View map --- specified by [options] or parses gpx or gps files to create encoded polylines +-- specified by [options] or parses gpx, gps and kml files to create +-- encoded polylines -- -- License: LPPL -- @@ -174,9 +187,10 @@ local FOV = "" local PITCH = "" local LANGUAGE = "" local GPFILE = "" +local KMLFILE = "" local OFILE = "getmap" local QUIET = "false" -local VERSION = "v1.3 (16/08/2014)" +local VERSION = "v1.4 (18/09/2014)" function pversion() print("getmapdl.lua " .. VERSION) @@ -189,12 +203,12 @@ function phelp() getmapdl.lua [options] downloads an OpenStreetMap, Google Maps or Google Street View map - specified by [options] or parses gpx or gps files to create + specified by [options] or parses gpx, gps and kml files to create encoded polylines Options: - -m specify the mode (osm|gm|gsv|gpx2epl|gps2epl|gpx2gps) + -m specify the mode (osm|gm|gsv|gpx2epl|gps2epl|gpx2gps|kml2epl|kml2gps) -l specify a location e.g. 'Bergheimer Straße 110A, 69115 Heidelberg, Germany' @@ -262,6 +276,10 @@ getmapdl.lua [options] -G specify the gpx or gps file + kml2epl and kml2gps mode only: + + -K specify the kml file + ]]) pversion() end @@ -310,6 +328,13 @@ function encodeNumber(number) return table.concat(t) end +function printepl(epltable) + local string = table.concat(epltable) + -- sometimes the sting contains unwanted control characters + local stingwithoutcontrolcharacters = string:gsub("%c", "") + print(stingwithoutcontrolcharacters) +end + do local newarg = {} local i, limit = 1, #arg @@ -380,6 +405,9 @@ do elseif arg[i] == "-G" then GPFILE = arg[i+1] i = i + 1 + elseif arg[i] == "-K" then + KMLFILE = arg[i+1] + i = i + 1 elseif arg[i] == "-o" then OFILE = arg[i+1] i = i + 1 @@ -402,22 +430,42 @@ if QUIET == 1 then end if MODE == "gpx2epl" then - local file = io.open(GPFILE, "r") + local file = GPFILE + local name + local desc local Olatitude = 0 local Olongitude = 0 local epl = {} - - io.input(file) - while true do - local line = io.read() - if line == nil - then - break + + for line in io.lines(file) + do + local latitude + local longitude + local encnum + + if string.match(line, "") then + Olatitude = 0 + Olongitude = 0 + name = "" + desc = "" + epl = {} end - if string.match(line, "trkpt") then - local latitude - local longitude - local encnum + if string.match(line, "(.-)') + if name == nil then + name = "Name (E)" + end + end + if string.match(line, "(.-)') + if desc == nil then + desc = "" + end + end + if string.match(line, "") then + printepl(epl) + print("\n") + end end - local string = table.concat(epl) - -- sometimes the sting contains unwanted control characters - local stingwithoutcontrolcharacters = string:gsub("%c", "") - print(stingwithoutcontrolcharacters) os.exit(0) end if MODE == "gpx2gps" then - local file = io.open(GPFILE, "r") - io.input(file) - while true do - local line = io.read() - if line == nil - then - break + local file = GPFILE + local name + local desc + + for line in io.lines(file) + do + local latitude + local longitude + local encnum + + if string.match(line, "") then + name = "" + desc = "" + end + if string.match(line, "(.-)') + if name == nil then + name = "Name (E)" + end end - if string.match(line, "trkpt") then - local latitude - local longitude + if string.match(line, "(.-)') + if desc == nil then + desc = "" + end + end + if string.match(line, "") then + print("\n") + end end os.exit(0) end if MODE == "gps2epl" then - local file = io.open(GPFILE, "r") + local file = GPFILE local Olatitude = 0 local Olongitude = 0 local epl = {} - io.input(file) - while true do - local line = io.read() - if line == nil - then - break - end + for line in io.lines(file) + do local latitude local longitude local encnum @@ -483,10 +548,85 @@ if MODE == "gps2epl" then Olatitude = latitude Olongitude = longitude end - local string = table.concat(epl) - -- sometimes the sting contains unwanted control characters - local stingwithoutcontrolcharacters = string:gsub("%c", "") - print(stingwithoutcontrolcharacters) + printepl(epl) + os.exit(0) +end + +if MODE == "kml2gps" or MODE == "kml2epl" then + local file = KMLFILE + local name + local cdata + local cotype + local Olatitude = 0 + local Olongitude = 0 + local epl = {} + + for line in io.lines(file) + do + local latitude + local longitide + local elevation + + -- reset for new route + if string.match(line, "") then + Olatitude = 0 + Olongitude = 0 + cotype = nil + epl = {} + end + if string.match(line, "") then + name = string.match(line, '(.-)') + if name == nil then + name = "Name (E)" + end + end + if string.match(line, "CDATA") then + cdata = string.match(line, 'CDATA%[(.-)%]') + if cdata == nil then + cdata = "" + end + end + if string.match(line, "") then + cotype = "point" + end + if string.match(line, "") then + cotype = "route" + end + if cotype == "point" or cotype == "route" then + if string.match(line, "") then + local colist = string.match(line, '(.-)') + if cotype == "route" then + print("Route: " .. name) + else + print("Point: " .. name .. " [" .. cdata .. "]") + end + for cocsv in string.gmatch(colist, "%S+") do + longitude, latitude, altitude = cocsv:match("([^,]+),([^,]+),([^,]+)") + if MODE == "kml2epl" then + local encnum + if cotype == "route" then + latitude = round(latitude,5)*100000 + longitude = round(longitude,5)*100000 + encnum = encodeNumber(latitude - Olatitude) + table.insert(epl,encnum) + encnum = encodeNumber(longitude - Olongitude) + table.insert(epl,encnum) + Olatitude = latitude + Olongitude = longitude + else + print(latitude .. "," .. longitude) + end + else + print(latitude .. "," .. longitude) + end + end + if MODE == "kml2epl" and cotype == "route" then + printepl(epl) + end + print("\n") + end + end + end os.exit(0) end @@ -1219,7 +1359,7 @@ emph={}} % &markers=label:P|color:green|Pergamonmuseum, Berlin% % &markers=label:N|color:blue|Neues Museum, Berlin}% % ]{} -% \includegraphics[width=10cm]{bmus1} +% \begin{center}\includegraphics[width=10cm]{bmus1}\end{center} % \iffalse %<*example> % \fi @@ -1250,7 +1390,7 @@ markers={&markers=size:mid|label:B|color:green|Bode Museum, Berlin% % &markers=label:P|color:green|Pergamonmuseum, Berlin % &markers=label:N|color:blue|Neues Museum, Berlin}, % visible={Brandenburger Tor, Berlin|Reichstagsufer 1, Berlin}]{} -% \includegraphics[width=10cm]{bmus2} +% \begin{center}\includegraphics[width=10cm]{bmus2}\end{center} % \iffalse %<*example> % \fi @@ -1299,7 +1439,7 @@ path={&path=weight:5|color:orange|Bode Museum, Berlin|% % James-Simon-Park,Berlin|52.522649,13.402523% % &path=weight:5|color:purple|James-Simon-Park, Berlin|% % Weinmeisterstraße 6, Berlin}]{} -% \includegraphics[width=10cm]{bmus3} +% \begin{center}\includegraphics[width=10cm]{bmus3}\end{center} % % You can also use \texttt{fillcolor} to mark areas! In paths, you % can also specify RGB32 colors, in which the last byte defines opacity, @@ -1310,7 +1450,7 @@ path={&path=weight:5|color:orange|Bode Museum, Berlin|% % 40.764302, -73.973004|40.768044, -73.981903|% % 40.800642, -73.958193|40.796887, -73.949226|% % 40.764302, -73.973004}]{Central Park, New York} -% \includegraphics[width=10cm]{cpny} +% \begin{center}\includegraphics[width=10cm]{cpny}\end{center} % \iffalse %<*example> % \fi @@ -1355,7 +1495,7 @@ path={&path=weight:5|color:orange|Bode Museum, Berlin|% % By default, the image is saved under the name \texttt{getmap.png}! % If you need only one map (e.g. the office of Dante e.V.) in your document, it can be as simple as: % -% \includegraphics[width=9cm]{getmap} +% \begin{center}\includegraphics[width=9cm]{getmap}\end{center} % % \iffalse %<*example> @@ -1368,12 +1508,13 @@ path={&path=weight:5|color:orange|Bode Museum, Berlin|% % % \fi % +% \clearpage % \section{Examples}\marginnote{\attachfile[author={Josef Kleber},subject={getmap-example.tex},description={getmap-example.tex (source example)} ,mimetype={text/plain}, icon={Tag}]{getmap-example.tex}} % % The same map as before from Google Maps: % % \getmap[file=dantegm,mode=gm]{Bergheimer Straße 110A, 69115 Heidelberg, Germany} -% \includegraphics[width=9cm]{dantegm} +% \begin{center}\includegraphics[width=9cm]{dantegm}\end{center} % \iffalse %<*example> % \fi @@ -1389,7 +1530,7 @@ path={&path=weight:5|color:orange|Bode Museum, Berlin|% % The same map as satellite image: % % \getmap[file=dantegmsat,mode=gm,type=satellite]{Bergheimer Straße 110A, 69115 Heidelberg, Germany} -% \includegraphics[width=9cm]{dantegmsat} +% \begin{center}\includegraphics[width=9cm]{dantegmsat}\end{center} % \iffalse %<*example> % \fi @@ -1401,10 +1542,11 @@ path={&path=weight:5|color:orange|Bode Museum, Berlin|% % \iffalse % % \fi +% \clearpage % L'afrique, mon amour! % % \getmap[file=africa,mode=gm,type=terrain,xsize=500,ysize=500,scale=2,zoom=3]{0,16} -% \includegraphics[width=9cm]{africa} +% \begin{center}\includegraphics[width=9cm]{africa}\end{center} % \iffalse %<*example> % \fi @@ -1419,7 +1561,7 @@ path={&path=weight:5|color:orange|Bode Museum, Berlin|% % L'amour, ... % % \getmap[file=paris,mode=gm,type=hybrid,xsize=500,ysize=300,scale=2,zoom=16]{Tour Eiffel, Paris} -% \includegraphics[width=9cm]{paris} +% \begin{center}\includegraphics[width=9cm]{paris}\end{center} % \iffalse %<*example> % \fi @@ -1431,10 +1573,11 @@ path={&path=weight:5|color:orange|Bode Museum, Berlin|% % \iffalse % % \fi +% \clearpage % Street View now: % % \getmap[file=parisgsv,mode=gsv,heading=320,pitch=30,fov=40,xsize=300,ysize=600]{Avenue Piere-Loti, Paris} -% \includegraphics[width=4cm]{parisgsv} +% \begin{center}\includegraphics[width=4cm]{parisgsv}\end{center} % \iffalse %<*example> % \fi @@ -1446,11 +1589,11 @@ path={&path=weight:5|color:orange|Bode Museum, Berlin|% % \iffalse % % \fi -% \clearpage +% % and from the platform: % % \getmap[file=parisgsvp,mode=gsv,heading=30,pitch=-25,fov=60]{Tour Eiffel, Paris} -% \includegraphics[width=8cm]{parisgsvp} +% \begin{center}\includegraphics[width=8cm]{parisgsvp}\end{center} % \iffalse %<*example> % \fi @@ -1464,7 +1607,7 @@ path={&path=weight:5|color:orange|Bode Museum, Berlin|% % \fi % \section{The \texttt{getmapdl} Lua script} % Basically, the \texttt{getmapdl} Lua script downloads static map images -% depending on command line options and allows to parse \texttt{gpx} and +% depending on command line options and allows to parse \texttt{kml}, \texttt{gpx} and % \texttt{gps} (a plain list of geographical coordinate pairs \texttt{(latitude,longitude)} % on each line) files and outputs \texttt{gps} or encoded polylines (epl). % The script offers the following modes (\texttt{-m}): @@ -1475,6 +1618,9 @@ path={&path=weight:5|color:orange|Bode Museum, Berlin|% % \item[gpx2epl] parses a \texttt{gpx} file and outputs encoded polylines (\texttt{epl}) to \texttt{STDOUT} % \item[gps2epl] parses a \texttt{gps} file and outputs \texttt{epl} % \item[gpx2gps] parses a \texttt{gpx} file and outputs a list of geographic coordinate pairs (\texttt{gps}) +% \item[kml2epl] parses a \texttt{kml} file and outputs geographical coordinates of places and +% encoded polylines for routes and lines +% \item[kml2gps] parses a \texttt{kml} file and outputs geographical coordinates % \end{description} % The first three modes are used by \cmd\getmap. You may use the script also from the command line! % \texttt{getmapdl -h} will give you a list of available commad line options. @@ -1509,12 +1655,55 @@ _p~iF~ps|U_ulLnnqClqNvxq`@ % This encoded polyline can be used for the \texttt{path} or \texttt{pathfile} % option of \cmd\getmap. % \section{How to define routes} -% One possible way is to use Google Maps -% online interactive map tool\footnote{\href{https://developers.google.com/maps/documentation/utilities/polylineutility}{https://developers.google.com/maps/documentation/utilities/polylineutility}}! -% Simply use \texttt{enc:polyline\_data} as location specifier. +% Routes are described by so called encoded polylines and can be used with +% \texttt{enc:polyline\_data} as location specifier in a \texttt{path}. % This string can contain all sorts of troublesome characters for \LaTeX{}. % \cmd\getmap\ can deal with them, with the exception of curly braces! % These will break your \LaTeX{} document. As a work-around, use the \texttt{pathfile} option. +% Please note that the length of the URL is limited to 2048 bytes. So, there's +% no way to support extreme long paths! +% \subsection{OpenStreetMap} +% OpenStreetMap does not offer routing service directly, but you can +% use an OpenStreetMap based route service\footnote{\href{http://openrouteservice.org}{http://openrouteservice.org}} +% to create your route and export it to a \texttt{gpx} file\footnote{This also means that you can visualize your own routes tracked with hardware or a software app!}. +% It's basically a xml-packaged list of geographical coordinates. +% You can use the \texttt{getmapdl} script to convert a route to encoded polylines, e.g. +% a pedestrian route from Berlin Central Station to Brandenburg Gate: +% +% \begin{filecontents*}{berlin.epl} +% &path=weight:5|color:purple|enc:_xq_IcgrpA?AFE@?^BFE@A^U@CLQXEZU?gCR?B?DBF@@?vA?D?D?BAHE@JBN@JLGFCG[DC~C?@?F?R?vA?p@iB@i@Fe@JWRSTOf@Gh@C^A?e@?gE?w@r@?lB@hA?`@??M?aA?]dI??O?O?Cn@cBfBeF|AeEHNVNBc@H@H_AEwA?OAMNA@N +% \end{filecontents*} +% \getmap[file=berlin, mode=gm, language=de, scale=2, +% xsize=400, ysize=600, +% markers={&markers=size:mid|label:H|color:green|Berlin, Hbf +% &markers=label:B|color:blue|Brandenburger Tor, Berlin}, +% pathfile={berlin.epl}]{} +% \begin{center}\includegraphics[width=6cm]{berlin}\end{center} +% +% \iffalse +%<*example> +% \fi +\begin{lstlisting} +\begin{filecontents*}{berlin.epl} +&path=weight:5|color:purple|enc:_xq_IcgrpA?AFE@?^BFE@A^U@CLQXEZU? +gCR?B?DBF@@?vA?D?D?BAHE@JBN@JLGFCG[DC~C?@?F?R?vA?p@iB@i@Fe@JWRSTO +f@Gh@C^A?e@?gE?w@r@?lB@hA?`@??M?aA?]dI??O?O?Cn@cBfBeF|AeEHNVNBc@H +@H_AEwA?OAMNA@N +\end{filecontents*} +\getmap[file=berlin, mode=gm, language=de, scale=2, + xsize=400, ysize=600, +markers={&markers=size:mid|label:H|color:green|Berlin, Hbf + &markers=label:B|color:blue|Brandenburger Tor, Berlin}, +pathfile={berlin.epl}]{} +\includegraphics[width=6cm]{berlin} +\end{lstlisting} +% \iffalse +% +% \fi +% +% \subsection{Google Maps} +% One possible way is to use Google Maps' +% online interactive map tool\footnote{\href{https://developers.google.com/maps/documentation/utilities/polylineutility}{https://developers.google.com/maps/documentation/utilities/polylineutility}}! % % \begin{filecontents*}{muc.epl} % &path=weight:5|color:orange|enc:okydHa}peAXOHi@jANv@A@kJJmFAiDJuAHmDXcBb@cC`@gC^_DV}CJaCF{APaBVkBdAyEf@qC`@{B\aDSwB @@ -1524,14 +1713,15 @@ _p~iF~ps|U_ulLnnqClqNvxq`@ % &markers=label:S|color:yellow|Stachus, München % &markers=label:M|color:blue|Marienplatz, München}, % pathfile={muc.epl}]{} -%\includegraphics[width=10cm]{muc} +% \begin{center}\includegraphics[width=10cm]{muc}\end{center} +% % \iffalse %<*example> % \fi \begin{lstlisting} \begin{filecontents*}{muc.epl} -&path=weight:5|color:orange|enc:okydHa}peAXOHi@jANv@A@kJJmFAi% -DJuAHmDXcBb@cC`@gC^_DV}CJaCF{APaBVkBdAyEf@qC`@{B\aDSwB +&path=weight:5|color:orange|enc:okydHa}peAXOHi@jANv@A@kJJmFAiDJuA +HmDXcBb@cC`@gC^_DV}CJaCF{APaBVkBdAyEf@qC`@{B\aDSwB \end{filecontents*} \getmap[file=muc, mode=gm, markers={&markers=size:mid|label:H|color:green|München, Hbf @@ -1544,42 +1734,116 @@ pathfile={muc.epl}]{} % % \fi % -% You can also use an OpenStreetMap based route service\footnote{\href{http://openrouteservice.org}{http://openrouteservice.org}} -% to create your route and export it to a \texttt{gpx} file\footnote{This also means that you can visualize your own routes tracked with hardware or a software app!}. -% It's basically a xml-packaged list of geographical coordinates. -% You can use the \texttt{getmapdl} script to convert a route to encoded polylines, e.g. -% a pedestrian route from Berlin Central Station to Brandenburg Gate: +% You can also use the \textbf{new} version of \textit{My Maps}. +% It allows you to define markers, routes and arbitrary lines on +% different layers and to export these into a \texttt{kml} file, +% e.g \href{https://bitbucket.org/kleberj/getmap/downloads/Berlin.kml}{berlin.kml}\footnote{\href{https://bitbucket.org/kleberj/getmap/downloads/Berlin.kml}{https://bitbucket.org/kleberj/getmap/downloads/Berlin.kml}}: % -% \begin{filecontents*}{berlin.epl} -% &path=weight:5|color:purple|enc:_xq_IcgrpA?AFE@?^BFE@A^U@CLQXEZU?gCR?B?DBF@@?vA?D?D?BAHE@JBN@JLGFCG[DC~C?@?F?R?vA?p@iB@i@Fe@JWRSTOf@Gh@C^A?e@?gE?w@r@?lB@hA?`@??M?aA?]dI??O?O?Cn@cBfBeF|AeEHNVNBc@H@H_AEwA?OAMNA@N +% \iffalse +%<*example> +% \fi +\begin{lstlisting} +$ getmapdl -m kml2epl -K Berlin.kml +Route: Route von Berlin Hbf, Moabit nach Brandenburger Tor, Paris +er Platz, Berlin +k}q_IufrpA?iFQ?gCDQBMHSm@Wq@GQIK]{AUaA}AaICIMm@Kg@EUiByIi@cDSqA_@ +uBIa@a@gBpB[fAMhCS|@Gd@Ev@Ep@GfAIpC[bAMr@IbAMp@G\GtBUdCSp@MrAK~AQ +pAMhAKx@IjDc@VAB?D@@?B?dCU`AKjAMRCPlGNtEBhABh@BVF`@D`@D\rB{@ZKDAH +CLAHAHBHBFHFFDNHRHJHHDDHDHBF?F?VCJCJILQJUJg@HQJMJKHAFAJ?X?bCRH@R? +AWQ?K@iBKq@GYAK@EBIFEFEFEFCFAD + + +Point: Berlin Hbf, Moabit [Europaplatz 1, 10557 Berlin, Deutschl +and] +52.52581820000001,13.3695451 + + +Point: Brandenburger Tor, Pariser Platz, Berlin [Ebertstraße 21, + 10117 Berlin, Deutschland] +52.5159099,13.3773202 + + +Point: Berlin Hbf [arrive with train] +52.5249948,13.368988 + + +Point: Reichstag [nice view from the roof] +52.5185973,13.3758974 + + +Point: Brandenburger Tor [once behind the wall] +52.5163514,13.3789873 + + +Route: Route von Berlin Hbf, Moabit nach Pariser Platz, Berlin +k}q_IufrpA?iFQ?@hH@H@F@B@B@?DB?\?|B@F@DB@B@~FCB?X@V??O?O?O?wF@W?o +@?k@?Y?eAvAD`@?`@ARCFAP?hAAZ?B?D?J?B?DAJB^@T?~B?MsAAIAEAM?S@OBM?A +@IDKBKDKFKFIJEFCJAJATAL?XAN?P?VAlBCbB?L@RB?kH@}Gp@]|@ObA?BAz@JTF^ +LZN?wF@aCE]~Am@\KREJCNANAH@HBJHHFLPP\DBFFDB@@@?D@F?JAJCKiEAQ?K@I? +KBSXC + + +Point: Berlin Hbf, Moabit [Europaplatz 1, 10557 Berlin, Deutschl +and] +52.52581820000001,13.3695451 + + +Point: Deutscher Bundestag Redaktion Das Parlament, Berlin [Plat +z der Republik 1, 10557 Berlin, Deutschland] +52.518502000000005,13.3751849 + + +Point: Pariser Platz, Berlin [Pariser Platz 1, 10117 Berlin, Deu +tschland] +52.5160749,13.3783013 + +\end{lstlisting} +% \iffalse +% +% \fi +% +% Now, you can take these data for your map: +% +% \begin{filecontents*}{berlin2.epl} +% &path=weight:5|color:orange|enc:k}q_IufrpA?iFQ?@hH@H@F@B@B@?DB?\?|B@F@DB@B@~FCB?X@V??O?O?O?wF@W?o@?k@?Y?eAvAD`@?`@ARCFAP?hAAZ?B?D?J?B?DAJB^@T?~B?MsAAIAEAM?S@OBM?A@IDKBKDKFKFIJEFCJAJATAL?XAN?P?VAlBCbB?L@RB?kH@}Gp@]|@ObA?BAz@JTF^LZN?wF@aCE]~Am@\KREJCNANAH@HBJHHFLPP\DBFFDB@@@?D@F?JAJCKiEAQ?K@I?KBSXC&path=weight:5|color:purple|enc:k}q_IufrpA?iFQ?gCDQBMHSm@Wq@GQIK]{AUaA}AaICIMm@Kg@EUiByIi@cDSqA_@uBIa@a@gBpB[fAMhCS|@Gd@Ev@Ep@GfAIpC[bAMr@IbAMp@G\GtBUdCSp@MrAK~AQpAMhAKx@IjDc@VAB?D@@?B?dCU`AKjAMRCPlGNtEBhABh@BVF`@D`@D\rB{@ZKDAHCLAHAHBHBFHFFDNHRHJHHDDHDHBF?F?VCJCJILQJUJg@HQJMJKHAFAJ?X?bCRH@R?AWQ?K@iBKq@GYAK@EBIFEFEFEFCFAD % \end{filecontents*} -% \getmap[file=berlin, mode=gm, language=de, xsize=400, ysize=600, -% markers={&markers=size:mid|label:H|color:green|Berlin, Hbf -% &markers=label:B|color:blue|Brandenburger Tor, Berlin}, -% pathfile={berlin.epl}]{} -% \includegraphics[width=6cm]{berlin} +% \getmap[file=berlin2, language=de, xsize=400, ysize=600, scale=2, mode=gm, +% markers={&markers=size:mid|label:H|color:green|52.5249948,13.368988 +% &markers=size:mid|label:R|color:yellow|52.5185973,13.3758974 +% &markers=label:B|color:blue|52.5163514,13.3789873}, +% pathfile={berlin2.epl}]{} +% \begin{center}\includegraphics[width=6cm]{berlin2}\end{center} +% % \iffalse %<*example> % \fi \begin{lstlisting} -\begin{filecontents*}{berlin.epl} -&path=weight:5|color:purple|enc:_xq_IcgrpA?AFE@?^BFE@A^U@CLQXEZU?% -gCR?B?DBF@@?vA?D?D?BAHE@JBN@JLGFCG[DC~C?@?F?R?vA?p@iB@i@Fe@JWRSTO% -f@Gh@C^A?e@?gE?w@r@?lB@hA?`@??M?aA?]dI??O?O?Cn@cBfBeF|AeEHNVNBc@H% -@H_AEwA?OAMNA@N +\begin{filecontents*}{berlin2.epl} +&path=weight:5|color:orange|enc:k}q_IufrpA?iFQ?@hH@H@F@B@B@?DB?\? +|B@F@DB@B@~FCB?X@V??O?O?O?wF@W?o@?k@?Y?eAvAD`@?`@ARCFAP?hAAZ?B?D? +J?B?DAJB^@T?~B?MsAAIAEAM?S@OBM?A@IDKBKDKFKFIJEFCJAJATAL?XAN?P?VAl +BCbB?L@RB?kH@}Gp@]|@ObA?BAz@JTF^LZN?wF@aCE]~Am@\KREJCNANAH@HBJHHF +LPP\DBFFDB@@@?D@F?JAJCKiEAQ?K@I?KBSXC&path=weight:5|color:purple| +enc:k}q_IufrpA?iFQ?gCDQBMHSm@Wq@GQIK]{AUaA}AaICIMm@Kg@EUiByIi@cDS +qA_@uBIa@a@gBpB[fAMhCS|@Gd@Ev@Ep@GfAIpC[bAMr@IbAMp@G\GtBUdCSp@MrA +K~AQpAMhAKx@IjDc@VAB?D@@?B?dCU`AKjAMRCPlGNtEBhABh@BVF`@D`@D\rB{@Z +KDAHCLAHAHBHBFHFFDNHRHJHHDDHDHBF?F?VCJCJILQJUJg@HQJMJKHAFAJ?X?bCR +H@R?AWQ?K@iBKq@GYAK@EBIFEFEFEFCFAD \end{filecontents*} -\getmap[file=berlin, mode=gm, language=de, xsize=400, ysize=600, -markers={&markers=size:mid|label:H|color:green|Berlin, Hbf - &markers=label:B|color:blue|Brandenburger Tor, Berlin}, -pathfile={berlin.epl}]{} -\includegraphics[width=6cm]{berlin} +\getmap[file=berlin2, language=de, xsize=400, ysize=600, + scale=2, mode=gm, +markers={&markers=size:mid|label:H|color:green|52.5249948,13.3689 +88 + &markers=size:mid|label:R|color:yellow|52.5185973,13.375 +8974 + &markers=label:B|color:blue|52.5163514,13.3789873}, +pathfile={berlin2.epl}]{}% +\includegraphics[width=6cm]{berlin2}% \end{lstlisting} % \iffalse % % \fi % -% Please note that the length of the URL is limited to 2048 bytes. So, there's -% no way to support extreme long paths! % \section{Implementation} % \changes{v1.0}{2014/05/25}{CTAN upload} % \changes{v1.2}{2014/07/11}{added support for Google Maps} @@ -1589,13 +1853,16 @@ pathfile={berlin.epl}]{} % \changes{v1.5}{2014/08/12}{added \texttt{gpx2gps} \texttt{bash} script} % \changes{v1.6}{2014/08/16}{removed \texttt{gpx2gps} \texttt{bash} script} % \changes{v1.6}{2014/08/16}{added \texttt{gpx2epl}, \texttt{gps2epl} and \texttt{gpx2gps} modes to \texttt{getmapdl.lua}} +% \changes{v1.7}{2014/09/18}{added \texttt{kml2gps} and \texttt{kml2epl} modes to \texttt{getmapdl.lua}} +% \changes{v1.7}{2014/09/18}{added multi track support for \texttt{gpx2gps} and \texttt{gpx2epl} mode} +% \changes{v1.7}{2014/09/18}{revised \texttt{gps2epl} mode} % \begin{macrocode} %<*package> % \end{macrocode} % First, we provide the \LaTeX\ package \package{getmap}. % \begin{macrocode} \NeedsTeXFormat{LaTeX2e}% -\ProvidesPackage{getmap}[2014/08/16 v1.6 getmap.sty - Josef Kleber (C) 2014]% +\ProvidesPackage{getmap}[2014/09/18 v1.7 getmap.sty - Josef Kleber (C) 2014]% % \end{macrocode} % We need a few packages! % \begin{macrocode} diff --git a/Master/texmf-dist/doc/latex/getmap/getmap.pdf b/Master/texmf-dist/doc/latex/getmap/getmap.pdf index bd291ed0574..fc1e7d94797 100644 Binary files a/Master/texmf-dist/doc/latex/getmap/getmap.pdf and b/Master/texmf-dist/doc/latex/getmap/getmap.pdf differ diff --git a/Master/texmf-dist/scripts/getmap/getmapdl.lua b/Master/texmf-dist/scripts/getmap/getmapdl.lua index f8dac4aa3cd..0ca4ac6bbb3 100755 --- a/Master/texmf-dist/scripts/getmap/getmapdl.lua +++ b/Master/texmf-dist/scripts/getmap/getmapdl.lua @@ -3,7 +3,8 @@ -- getmapdl [options] -- -- downloads an OpenStreetMap, Google Maps or Google Street View map --- specified by [options] or parses gpx or gps files to create encoded polylines +-- specified by [options] or parses gpx, gps and kml files to create +-- encoded polylines -- -- License: LPPL -- @@ -36,9 +37,10 @@ local FOV = "" local PITCH = "" local LANGUAGE = "" local GPFILE = "" +local KMLFILE = "" local OFILE = "getmap" local QUIET = "false" -local VERSION = "v1.3 (16/08/2014)" +local VERSION = "v1.4 (18/09/2014)" function pversion() print("getmapdl.lua " .. VERSION) @@ -51,12 +53,12 @@ function phelp() getmapdl.lua [options] downloads an OpenStreetMap, Google Maps or Google Street View map - specified by [options] or parses gpx or gps files to create + specified by [options] or parses gpx, gps and kml files to create encoded polylines Options: - -m specify the mode (osm|gm|gsv|gpx2epl|gps2epl|gpx2gps) + -m specify the mode (osm|gm|gsv|gpx2epl|gps2epl|gpx2gps|kml2epl|kml2gps) -l specify a location e.g. 'Bergheimer Straße 110A, 69115 Heidelberg, Germany' @@ -124,6 +126,10 @@ getmapdl.lua [options] -G specify the gpx or gps file + kml2epl and kml2gps mode only: + + -K specify the kml file + ]]) pversion() end @@ -172,6 +178,13 @@ function encodeNumber(number) return table.concat(t) end +function printepl(epltable) + local string = table.concat(epltable) + -- sometimes the sting contains unwanted control characters + local stingwithoutcontrolcharacters = string:gsub("%c", "") + print(stingwithoutcontrolcharacters) +end + do local newarg = {} local i, limit = 1, #arg @@ -242,6 +255,9 @@ do elseif arg[i] == "-G" then GPFILE = arg[i+1] i = i + 1 + elseif arg[i] == "-K" then + KMLFILE = arg[i+1] + i = i + 1 elseif arg[i] == "-o" then OFILE = arg[i+1] i = i + 1 @@ -264,22 +280,42 @@ if QUIET == 1 then end if MODE == "gpx2epl" then - local file = io.open(GPFILE, "r") + local file = GPFILE + local name + local desc local Olatitude = 0 local Olongitude = 0 local epl = {} - io.input(file) - while true do - local line = io.read() - if line == nil - then - break + for line in io.lines(file) + do + local latitude + local longitude + local encnum + + if string.match(line, "") then + Olatitude = 0 + Olongitude = 0 + name = "" + desc = "" + epl = {} end - if string.match(line, "trkpt") then - local latitude - local longitude - local encnum + if string.match(line, "(.-)') + if name == nil then + name = "Name (E)" + end + end + if string.match(line, "(.-)') + if desc == nil then + desc = "" + end + end + if string.match(line, "") then + printepl(epl) + print("\n") + end end - local string = table.concat(epl) - -- sometimes the sting contains unwanted control characters - local stingwithoutcontrolcharacters = string:gsub("%c", "") - print(stingwithoutcontrolcharacters) os.exit(0) end if MODE == "gpx2gps" then - local file = io.open(GPFILE, "r") - io.input(file) - while true do - local line = io.read() - if line == nil - then - break + local file = GPFILE + local name + local desc + + for line in io.lines(file) + do + local latitude + local longitude + local encnum + + if string.match(line, "") then + name = "" + desc = "" end - if string.match(line, "trkpt") then - local latitude - local longitude + if string.match(line, "(.-)') + if name == nil then + name = "Name (E)" + end + end + if string.match(line, "(.-)') + if desc == nil then + desc = "" + end + end + if string.match(line, "") then + print("\n") + end end os.exit(0) end if MODE == "gps2epl" then - local file = io.open(GPFILE, "r") + local file = GPFILE local Olatitude = 0 local Olongitude = 0 local epl = {} - io.input(file) - while true do - local line = io.read() - if line == nil - then - break - end + for line in io.lines(file) + do local latitude local longitude local encnum @@ -345,10 +398,85 @@ if MODE == "gps2epl" then Olatitude = latitude Olongitude = longitude end - local string = table.concat(epl) - -- sometimes the sting contains unwanted control characters - local stingwithoutcontrolcharacters = string:gsub("%c", "") - print(stingwithoutcontrolcharacters) + printepl(epl) + os.exit(0) +end + +if MODE == "kml2gps" or MODE == "kml2epl" then + local file = KMLFILE + local name + local cdata + local cotype + local Olatitude = 0 + local Olongitude = 0 + local epl = {} + + for line in io.lines(file) + do + local latitude + local longitide + local elevation + + -- reset for new route + if string.match(line, "") then + Olatitude = 0 + Olongitude = 0 + cotype = nil + epl = {} + end + if string.match(line, "") then + name = string.match(line, '(.-)') + if name == nil then + name = "Name (E)" + end + end + if string.match(line, "CDATA") then + cdata = string.match(line, 'CDATA%[(.-)%]') + if cdata == nil then + cdata = "" + end + end + if string.match(line, "") then + cotype = "point" + end + if string.match(line, "") then + cotype = "route" + end + if cotype == "point" or cotype == "route" then + if string.match(line, "") then + local colist = string.match(line, '(.-)') + if cotype == "route" then + print("Route: " .. name) + else + print("Point: " .. name .. " [" .. cdata .. "]") + end + for cocsv in string.gmatch(colist, "%S+") do + longitude, latitude, altitude = cocsv:match("([^,]+),([^,]+),([^,]+)") + if MODE == "kml2epl" then + local encnum + if cotype == "route" then + latitude = round(latitude,5)*100000 + longitude = round(longitude,5)*100000 + encnum = encodeNumber(latitude - Olatitude) + table.insert(epl,encnum) + encnum = encodeNumber(longitude - Olongitude) + table.insert(epl,encnum) + Olatitude = latitude + Olongitude = longitude + else + print(latitude .. "," .. longitude) + end + else + print(latitude .. "," .. longitude) + end + end + if MODE == "kml2epl" and cotype == "route" then + printepl(epl) + end + print("\n") + end + end + end os.exit(0) end diff --git a/Master/texmf-dist/tex/latex/getmap/getmap.sty b/Master/texmf-dist/tex/latex/getmap/getmap.sty index cad23cbdd0c..041ffca259b 100644 --- a/Master/texmf-dist/tex/latex/getmap/getmap.sty +++ b/Master/texmf-dist/tex/latex/getmap/getmap.sty @@ -27,7 +27,7 @@ %% This work consists of all files listed in manifest.txt. %% \NeedsTeXFormat{LaTeX2e}% -\ProvidesPackage{getmap}[2014/08/16 v1.6 getmap.sty - Josef Kleber (C) 2014]% +\ProvidesPackage{getmap}[2014/09/18 v1.7 getmap.sty - Josef Kleber (C) 2014]% \RequirePackage{xkeyval}% \RequirePackage{stringenc}% \RequirePackage{ifthen}% -- cgit v1.2.3