#!/usr/bin/env texlua -- -- getmapdl [options] -- -- downloads an OpenStreetMap or Google Maps map specified by [options] -- -- License: LPPL -- local http = require("socket.http"); local ltn12 = require("ltn12") local url = require("socket.url") local OSMURL = "http://open.mapquestapi.com/staticmap/v4/getplacemap" local GMURL = "http://maps.googleapis.com/maps/api/staticmap" local KEY = "" local MODE = "" local LOCATION = "" local XSIZE = "" local CENTER = "" local YSIZE = "" local SIZE = "" local SCALE = "" local ZOOM = "" local TYPE = "" local IMAGETYPE = "" local COLOR = "" local NUMBER = "" local VISIBLE = "" local IPATH = "" local MARKERS = "" local OFILE = "getmap" local QUIET = "false" local VERSION = "v1.0 (15/07/2014)" function pversion() print("getmapdl.lua " .. VERSION) print("(C) Josef Kleber License: LPPL") os.exit(0) end function phelp() print([[ getmapdl.lua [options] downloads an OpenStreetMap or Google Maps map specified by [options] Options: -m specify the mode (osm|gm) -l specify a location e.g. 'Bergheimer Straße 110A, 69115 Heidelberg, Germany' -x specify a xsize (600) -y specify a ysize (400) -S short form to specify a size, e.g. 600,400 (osm) or 600x400 (gm) -s specify a scale factor in the range 1692-221871572 (osmm) or 1-2 (osm) -z specify a zoom in the range 1-18 (osm) or 0-21 (17) (gm) -t specify map type {map|sathyb} (map) (osm) or {roadmap|satellite|hybrid|terrain} (roadmap) (gm) -i specify image type {png|gif|jpg|jpeg} (png) (osm) or {png|png8|png32|gif|jpg|jpg-baseline} (png) (gm) -c specify icon color (yelow_1) (osm) or (blue) (gm) see: http://open.mapquestapi.com/staticmap/icons.html https://developers.google.com/maps/documentation/staticmaps/#MarkerStyles -n specify the icon number (1) -o specify output basename without file extension (getmap.IMAGETYPE) -q quiet; no output! -v prints version information -h prints help information gm mode only: -M specify markers; see: https://developers.google.com/maps/documentation/staticmaps/index#Markers e.g.: &markers=size:mid|color:blue|label:1|address or more of these location and zoom will be ignored if used! -C specify center of the map -V specify a list of visible locations (loc1|loc2) -P specify path from location to location e.g.: &path=weight:7|color:purple|loc1|loc2 ]]) pversion() end function getmap_error(exitcode, errortext) io.stderr:write ("Error (" .. exitcode .. "): " .. errortext .. "\n") os.exit(exitcode) end function getmap_warning(warningtext) io.stderr:write("WARNING: " .. warningtext .. "\n") end function check_number(var, varname) local number='^[0-9]+$' if not(string.match(var, '^[0-9]+$')) then getmap_error(2, varname .. " can't be " .. var .. "! Not a number!") end end function check_range(var,min,max,exitcode,varname) check_number(var,varname) if (tonumber(var) < tonumber(min) or tonumber(var) > tonumber(max)) then getmap_error(exitcode, varname .. " = " .. var .. "; must be in the range of " .. min .. "-" .. max) end end do local newarg = {} local i, limit = 1, #arg while (i <= limit) do if arg[i] == "-l" then LOCATION = arg[i+1] i = i + 1 elseif arg[i] == "-C" then CENTER = arg[i+1] i = i + 1 elseif arg[i] == "-m" then MODE = arg[i+1] i = i + 1 elseif arg[i] == "-k" then KEY = arg[i+1] i = i + 1 elseif arg[i] == "-x" then XSIZE = arg[i+1] i = i + 1 elseif arg[i] == "-y" then YSIZE = arg[i+1] i = i + 1 elseif arg[i] == "-S" then SIZE = arg[i+1] i = i + 1 elseif arg[i] == "-s" then SCALE = arg[i+1] i = i + 1 elseif arg[i] == "-z" then ZOOM = arg[i+1] i = i + 1 elseif arg[i] == "-t" then TYPE = arg[i+1] i = i + 1 elseif arg[i] == "-i" then IMAGETYPE = arg[i+1] i = i + 1 elseif arg[i] == "-c" then COLOR = arg[i+1] i = i + 1 elseif arg[i] == "-n" then NUMBER = arg[i+1] i = i + 1 elseif arg[i] == "-M" then MARKERS = arg[i+1] i = i + 1 elseif arg[i] == "-V" then VISIBLE = arg[i+1] i = i + 1 elseif arg[i] == "-P" then IPATH = arg[i+1] i = i + 1 elseif arg[i] == "-o" then OFILE = arg[i+1] i = i + 1 elseif arg[i] == "-q" then QUIET = 1 elseif arg[i] == "-v" then pversion() elseif arg[i] == "-h" then phelp() else newarg[#newarg+1] = arg[i] end i = i + 1 end arg = newarg end if QUIET == 1 then getmap_warning("-q option currently not supported!") end if KEY == "" then if MODE == "osm" then KEY="Kmjtd|luu7n162n1,22=o5-h61wh" getmap_warning("KEY not specified; using mapquest example key as default!") end end if LOCATION == "" then LOCATION = "Bergheimer Straße 110A, 69115 Heidelberg, Germany" getmap_warning("LOCATION not specified; using Dante e.V. Office as default!") end if MODE == "gm" then if ZOOM == "" then ZOOM=17 getmap_warning("ZOOM not specified; using ZOOM=17 as default!") end end if XSIZE == "" then XSIZE=600 getmap_warning("XSIZE not specified; using XSIZE=600 as default!") end if YSIZE == "" then YSIZE=400 getmap_warning("YSIZE not specified; using YSIZE=400 as default!") end if SIZE == "" then if MODE == "gm" then SIZE = XSIZE .. "x" .. YSIZE elseif MODE == "osm" then SIZE = XSIZE .. "," .. YSIZE end end if SCALE == "" then if MODE == "gm" then SCALE=1 getmap_warning("SCALE not specified, using SCALE=1 as default!") elseif MODE == "osm" then if ZOOM == "" then SCALE=3385 getmap_warning("SCALE not specified, using SCALE=3385 as default!") end end end if TYPE == "" then if MODE == "gm" then TYPE = "roadmap" getmap_warning("TYPE not specified; using roadmap as default!") elseif MODE == "osm" then TYPE = "map" getmap_warning("TYPE not specified; using map as default!") end end if IMAGETYPE == "" then IMAGETYPE="png" getmap_warning("IMAGETYPE not specified; using png as default!") end if COLOR == "" then if MODE == "gm" then COLOR="blue" getmap_warning("COLOR not specified; using blue as default!") elseif MODE == "osm" then COLOR="yellow_1" getmap_warning("COLOR not specified; using yellow_1 as default!") end end if NUMBER == "" then NUMBER=1 getmap_warning("NUMBER not specified; using 1 as default!") end if MODE == "gm" then if ZOOM == "" then ZOOM = 17 else check_range(ZOOM,0,21,11,"ZOOM") end check_range(XSIZE,1,640,12,"XSIZE") check_range(YSIZE,1,640,13,"YSIZE") check_range(SCALE,1,2,14,"SCALE") elseif MODE == "osm" then check_range(XSIZE,1,3840,11,"XSIZE") check_range(YSIZE,1,3840,12,"YSIZE") if ZOOM == "" then check_range(SCALE,1692,221871572,13,"SCALE") else check_range(ZOOM,1,18,14,"ZOOM") end check_number(NUMBER,"NUMBER") end local UKEY = "" local ULOCATION = "" local UZOOM = "" local USCALEZOOM = "" local UMARKERS = "" local USIZE = "" local USCALE = "" local UTYPE = "" local USHOWICON = "" local UIMAGETYPE = "" local UVISIBLE = "" local UIPATH = "" local UOFILE = "" local IMGURL = "" if MODE == "gm" then ULOCATION = "center=" .. url.escape(LOCATION) if MARKERS == "" then UMARKERS = "&markers=size:mid|color:" .. COLOR .. "|label:" .. NUMBER .. "|" .. url.escape(LOCATION) UZOOM = "&zoom=" .. url.escape(ZOOM) else UMARKERS = "" .. url.escape(MARKERS) -- correct cruft escaping of "&markers=" UMARKERS = UMARKERS:gsub("%%26markers%%3d","&markers=") UZOMM = "" if CENTER == "" then ULOCATION = "" else ULOCATION = "center=" .. url.escape(CENTER) end end USIZE = "&size=" .. url.escape(SIZE) USCALE = "&scale=" .. url.escape(SCALE) UTYPE = "&maptype=" .. url.escape(TYPE) UIMAGETYPE = "&format=" .. url.escape(IMAGETYPE) if IMAGETYPE == "jpg-baseline" then IMAGETYPE = "jpg" end if VISIBLE == "" then UVISIBLE = "" else UVISIBLE = "&visible=" .. url.escape(VISIBLE) end if IPATH == "" then UIPATH = "" else UIPATH = "" .. url.escape(IPATH) -- correct cruft escaping of "&path=" UIPATH = UIPATH:gsub("%%26path%%3d","&path=") end UOFILE = OFILE .. "." .. IMAGETYPE IMGURL = GMURL .. "?" .. ULOCATION .. USIZE .. UZOOM .. UMARKERS .. UTYPE .. USCALE .. UIMAGETYPE .. UVISIBLE .. UIPATH .. "&sensor=false" elseif MODE == "osm" then UKEY = "?key=" .. url.escape(KEY) ULOCATION = "&location=" .. url.escape(LOCATION) USIZE = "&size=" .. url.escape(SIZE) if ZOOM == "" then USCALEZOOM = "&scale=" .. url.escape(SCALE) else USCALEZOOM = "&zoom=" .. url.escape(ZOOM) end UTYPE = "&type=" .. url.escape(TYPE) UIMAGETYPE = "&imagetype=" .. url.escape(IMAGETYPE) USHOWICON = "&showicon=" .. url.escape(COLOR) .. "-" .. url.escape(NUMBER) UOFILE = OFILE .. "." .. IMAGETYPE IMGURL = OSMURL .. UKEY .. ULOCATION .. USIZE .. USCALEZOOM .. UTYPE .. UIMAGETYPE .. USHOWICON end local ret, msg local ofile ofile, msg = io.open(UOFILE, "wb") if not ofile then getmap_error(21, msg) end print("\n\ngetmap.lua:") print("url = " .. IMGURL) print("output = " .. UOFILE) ret, msg = http.request{ url = IMGURL, sink = ltn12.sink.file(ofile) } if not ret then getmap_error(22, msg) end