Sandbox/Matroc/Mapdraw
From Halal Explorer
< Module:Sandbox/MatrocRevision as of 05:03, 21 January 2019 by imported>Matroc (fix typo)
This documentation is transcluded from Module:Sandbox/Matroc/Mapdraw/doc. (edit | history)
Note to editors: Please don't categorize this template by editing it directly. Instead, place the category in its documentation page, in its "includeonly" section.
Note to editors: Please don't categorize this template by editing it directly. Instead, place the category in its documentation page, in its "includeonly" section.
Documentation removed.
Script error: Lua error: Cannot create process: proc_open(/dev/null): Failed to open stream: Operation not permitted
-- November 2016 ---- An experimental Module -- Matroc -- The following though code is for drawing certain shapes (circle, ellipse, box (square), kite, rectangle, triangle, equitri -- line, star, star2, hexagram, wedge, pointer, pentagon, hexagon, octagon, diamond, crescent etc. -- as a Polygon or LineString -gt Most functions can output a maplink or a mapframe plus optional marker. -- The function newlat below is used by function p.circle as well as functions p.ellipse, p.star, p.pointer, -- p.pentagon and p.hexagon etc. local p = {} -- BETA Rough calculator of distance between 2 coordinates (lat,long) in miles and kilometres function p.distance(frame) -- in Progress local x1 = tonumber(frame.args['lat1']) or 1 local x2 = tonumber(frame.args['lat2']) or 1 local y1 = tonumber(frame.args['long1']) or 1 local y2 = tonumber(frame.args['long2']) or 1 local lat1 = math.rad(x1) local lat2 = math.rad(x2) local long1 = math.rad(y1) local long2 = math.rad(y2) local longd = long2 - long1 local latd = lat2 - lat1 local x = (math.sin(latd/2))^2 + math.cos(lat1) * math.cos(lat2) * (math.sin(longd/2))^2 local y = 2 * math.atan2( math.sqrt(x), math.sqrt(1-x) ) local distance1 = 3959 * y -- miles (2 sources a: 3861 b: 3959) local distance2 = 6371 * y -- kilometers (2 sources a: 6373 b: 6371) return "Approximate distance in '''miles''': " .. string.format("%.6f",distance1) .. " Approximate distance in '''kilometers''': " .. string.format("%.6f",distance2) end -- CONVERT NEWLATITTUDE local function newlat(a) newlatitude = 180/math.pi * (2 * math.atan(math.exp( a * math.pi/180)) - math.pi/2 ) if newlatitude > 89.5 then point = 89.5 end -- END if if newlatitude < -89.5 then point = -89.5 end -- END if return newlatitude end -- GET LATITUDE local function latitude(wikidata) local latitude = "" local entity = mw.wikibase.getEntityObject(wikidata) if entity == nil then error("Wikidata ID " .. wikidata .. " not found!") end local claims = entity.claims if claims == nil then error("Wikidata ID found No Data!") end if claims.P625 ~= nil then latitude = entity.claims.P625[1].mainsnak.datavalue.value.latitude return latitude end if latitude == "" then error("Latitude not found in Wikidata!") end return latitude end -- GET LONGITUDE -- P625 local function longitude(wikidata) local longitude = "" local entity = mw.wikibase.getEntityObject(wikidata) if entity == nil then error("Wikidata ID " .. wikidata .. " not found!") end local claims = entity.claims if claims == nil then error("Wikidata ID found No Data!") end if claims.P625 ~= nil then longitude = entity.claims.P625[1].mainsnak.datavalue.value.longitude return longitude end if longitude == "" then error("Longitude not found in Wikidata!") end return longitude end local function parts(lat,long,group,title,description,fill,stroke) -- local xprogcomment = '\n\t\t"__xprogcomment__" : "Mapdraw",\n\t\t"__xprogcomment__date__" : "' .. os.date("%m/%d/%Y -- %I:%M:%S") .. '",\n' -- ERROR SPOT PART1A MAYBE AS THIS WAS MISSING PIECE PROBABLY DELETED SOMEWHERE DURING DEVELOPMENT -- WILL HAVE TO TEST VARIOUS PIECES TO INSURE THIS HAS BEEN CORRECTED local part1a = '<maplink class="no-icon" text="" latitude="' .. lat .. '" longitude="' .. long .. '" ' local part1a = part1a .. 'zoom="5" group="' .. group .. '">\n{"type": "Feature","geometry": {"type":"LineString", "coordinates":\n' -- local part1b = '\n\t"properties":{' .. xprogcomment .. '\t\t"title": "' .. title .. '",\n' -- local part1b = part1b .. '\t\t"description": "' .. description .. '",\n' -- local part1b = part1b .. '\t\t"stroke":"' .. stroke .. '",\n\t\t"stroke-width":1\n}}\n</maplink>\n' local part1b = '\n\t"properties":{\n\t\t"title": "' .. title .. '",\n' local part1b = part1b .. '\t\t"description": "' .. description .. '",\n' local part1b = part1b .. '\t\t"stroke":"' .. stroke .. '",\n\t\t"stroke-width":1\n}}\n</maplink>\n' local part2a = '<maplink class="no-icon" text="" latitude="' .. lat .. '" longitude="' .. long .. '" ' local part2a = part2a .. 'zoom="5" group="' .. group .. '">\n{"type": "Feature","geometry": { "type":"Polygon", \t"coordinates":\n' -- local part2b = '\n\t"properties":{' .. xprogcomment .. '\t\t"title": "' .. title .. '",\n' -- local part2b = part2b .. '\t\t"description": "' .. description .. '",\n\t\t"fill": "' .. fill .. '",\n' -- local part2b = part2b .. '\t\t"stroke":"' .. stroke .. '",\n\t\t"stroke-width":1\n}}\n</maplink>\n' local part2b = '\n\t"properties":{\n\t\t"title": "' .. title .. '",\n' local part2b = part2b .. '\t\t"description": "' .. description .. '",\n\t\t"fill": "' .. fill .. '",\n' local part2b = part2b .. '\t\t"stroke":"' .. stroke .. '",\n\t\t"stroke-width":1\n}}\n</maplink>\n' local part3a = '<mapframe text="" latitude="' .. lat .. '" longitude="' .. long .. '" ' local part3a = part3a .. 'zoom="5" group="' .. group .. '" width="600" height="400" >\n{"type": "FeatureCollection",\n\t"features": [\n\t\t{\n\t\t"type": "Feature",\n\t\t"geometry": {\n\t\t"type":"LineString", "coordinates":\n' -- local part3b = '\n\t"properties":{' .. xprogcomment .. '\t\t"title": "' .. title .. '",\n' -- local part3b = part3b .. '\t\t"description": "' .. description .. '",\n' -- local part3b = part3b .. '\t\t"stroke":"' .. stroke .. '",\n\t\t"stroke-width":1\n}\n}]}\n</mapframe>\n' local part3b = '\n\t"properties":{\n\t\t"title": "' .. title .. '",\n' local part3b = part3b .. '\t\t"description": "' .. description .. '",\n' local part3b = part3b .. '\t\t"stroke":"' .. stroke .. '",\n\t\t"stroke-width":1\n}\n}]}\n</mapframe>\n' local part4a = '<mapframe text="" latitude="' .. lat .. '" longitude="' .. long .. '" ' local part4a = part4a .. 'zoom="5" group="' .. group .. '" width="600" height="400" >\n{"type": "FeatureCollection",\n\t"features": [\n\t\t{\n\t\t"type": "Feature",\n\t\t"geometry": {\n\t\t"type":"Polygon", "coordinates":\n' -- local part4b = '\n\t"properties": {' .. xprogcomment .. '\t\t"title": "' .. title .. '",\n' -- local part4b = part4b .. '\t\t"description": "' .. description .. '",\n\t\t"fill": "' .. fill .. '",\n' -- local part4b = part4b .. '\t\t"stroke":"' .. stroke .. '",\n\t\t"stroke-width":1\n}\n}]}\n</mapframe>\n' local part4b = '\n\t"properties": {\n\t\t"title": "' .. title .. '",\n' local part4b = part4b .. '\t\t"description": "' .. description .. '",\n\t\t"fill": "' .. fill .. '",\n' local part4b = part4b .. '\t\t"stroke":"' .. stroke .. '",\n\t\t"stroke-width":1\n}\n}]}\n</mapframe>\n' return part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b end local function positions(shape) local positions = {} positions['octagon'] = {45,90,135,180,225,270,315,360} positions['hexagram'] = {30,60,90,120,150,180,210,240,270,300,330,360} positions['star2'] = {36,72,108,144,180,216,252,288,324,360} positions['decagon'] = {18,54,90,126,162,198,234,270,306,342} positions['cross'] = {15,45,75,105,135,165,195,225,255,285,315,345} positions['xshape'] = {30,60,90,120,150,180,210,240,270,300,330,360} positions['bar'] = {90,270} positions['keystone'] = {35,26,55,160,200,305,334,325} positions['cog'] = {45,90,135,180,225,270,315,360} positions['quad'] = {360,90,180,270} positions['arrow'] = {360,45,90,135,180,225,270,315} positions['pentagram'] = {360,144,288,72,216} return positions[shape] end local function checkhex(fill,stroke) if string.len(fill) ~= 7 then error("Incorrect length for argument fill!") end if string.gsub(fill,"#[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]","") ~= "" then error("Incorrect hexidecimal format for argument fill!") end if string.len(stroke) ~= 7 then error("Incorrect length for argument stroke!") end if string.gsub(stroke,"#[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]","") ~= "" then error("Incorrect hexidecimal format for argument stroke!") end end local function checkid(id) id = string.gsub(id,"q","Q") id = string.gsub(id,"%s+","") if string.gsub(id,"^[Q]%d+$","") ~= "" then error("Bad format for parameter id!") end return id end -- CIRCLE function p.circle(frame) local shape = "circle" local id = frame.args['id'] or "" local lat,long = "","" local x,y = 0,0 if id == nil or id == "" then if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end lat = frame.args['lat'] long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end x = string.format("%.6f",lat) y = string.format("%.6f",long) local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end -- FUTURE USE if tonumber(lat) > 85.35 or tonumber(lat) < -85.35 then error("Latitude must be between 85.35 and -85.35!") end if tonumber(long) > 180 or tonumber(long) < -180 then error("Longitude must be between 180 and -180!") end local group = frame.args['group'] or 'circle' local title = frame.args['title'] or 'A circle' local description = frame.args['desc'] or '' local r = frame.args['radius'] or ".5" r = tonumber(r) if r > 10 then error("10 for radius is MAX") end if r <= 0 then error("radius has to be greater than 0") end local fill = frame.args['fill'] or "#ccef64" local stroke = frame.args['stroke'] or "#0000ff" checkhex(fill,stroke) local data = {} local coordinates = "" local ptx,pty,angle = 0,0,0 local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "poly" end local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) if tonumber(x) >= 10.5 then x = math.log(math.tan((90 + x) * math.pi/360)) / (math.pi/180) elseif tonumber(x) <= -10.5 then x = math.log(math.tan((90 + x) * math.pi/360)) / (math.pi/180) end for i = 1, 360 do angle = i * math.pi / 180 ptx = x + r * math.cos( angle ) pty = y + r * math.sin( angle ) -- ptx, pty = x + r * math.cos( angle ), y + r * math.sin( angle ) -- original code split for readability above if tonumber(x) >= 10.5 then ptx = newlat(ptx) -- makes correction to make circle show up on map - upper latitudes end if tonumber(x) <= -10.5 then ptx = newlat(ptx) -- makes correction to make circle show up on map - lower latitudes end data[i] = '[' .. string.format("%.6f",pty) .. "," .. string.format("%.6f",ptx) .. ']' end for i = 5,359, 5 do data[i] = data[i] .. "@@@@@" end for i = 1,360, 1 do coordinates = coordinates .. data[i] end coordinates = coordinates.gsub(coordinates,'%]%[','],[') coordinates = coordinates.gsub(coordinates,'%]@@@@@%[','],\n[') coordinates = "[" .. coordinates .. ',' .. data[1] .. "]," if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = string.gsub(coordinates,'%]%,$',']]},') coordinates = part4a .. string.gsub(coordinates,'^%[','[[') .. part4b else coordinates = string.gsub(coordinates,'%]%,$',']},') coordinates = part3a .. coordinates .. part3b end else if type == "poly" then coordinates = string.gsub(coordinates,'%]%,$',']]},') coordinates = part2a .. string.gsub(coordinates,'^%[','[[') .. part2b else coordinates = string.gsub(coordinates,'%]%,$',']},') coordinates = part1a .. coordinates .. part1b end end if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Circle|lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end -- MULTISIDE - create multi-sided regular polygon - if number of sides > 20 can use to replace circle with its 360 points function p.multiside(frame) local shape = "multiside" local sides = frame.args['sides'] or "3" if sides == nil or sides == "" then sides = "3" end sides = tonumber(sides) if sides < 3 or sides > 40 then sides = 3 end -- as number of sides grow - can use to make a rough circle above 20 local increment = 360/sides local inbetween = increment/2 local id = frame.args['id'] or "" id = string.gsub(id,"%,+","@") id = string.gsub(id,"%s+",'') id = string.gsub(id,"%@+",'@') local lat = frame.args['lat'] or "" local long = frame.args['long'] local matrix = {} local coordinates = "" local count = 1 local type = frame.args['type'] or "line" if type ~= "poly" then type = "line" end if id == nil or id == "" then if lat == "" or lat == nil then error("Missing argument lat!") end if long == "" or long == nil then error("Missing argument long!") end if tonumber( lat ) > 90 or tonumber( lat ) < -90 then error("Latitudes must be between 90 and -90!") end if tonumber(long) > 180 or tonumber(long) < -180 then error("Longitudes must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end local r = frame.args['radius'] or ".5" r = tonumber(r) if r > 10 then error("10 for radius is MAX") end if r <= 0 then error("r has to be greater than 0") end local group = frame.args['group'] or 'multiside' local title = frame.args['title'] or 'A Multi-sided shape' local description = frame.args['desc'] or "" if description == nil then description = "" end local fill = frame.args['fill'] or "#ffff00" local stroke = frame.args['stroke'] or "#000000" checkhex(fill,stroke) local mapframe = frame.args['mapframe'] or "no" if mapframe == nil or mapframe == "" then mapframe = "no" end local marker = frame.args['marker'] or "no" local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) local angle,ptx,pty = 0,0,0 local latitude = lat lat = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) local count = 0 for i = increment,360, increment do angle = (i + inbetween) * math.pi / 180 ptx = lat + r * math.cos( angle ) pty = long + r * math.sin( angle ) ptx,pty = string.format("%.6f",newlat(ptx)),string.format("%.6f",pty) count = count + 1 matrix[count] = "[" .. pty .. "," .. ptx .. "]@@@@@" end for i = 1,table.getn(matrix), 1 do coordinates = coordinates .. matrix[i] end coordinates = coordinates .. matrix[1] coordinates = string.gsub(coordinates,"@@@@@",",") coordinates = string.gsub(coordinates,",$",'') if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part4a .. coordinates .. part4b else coordinates = '[' .. coordinates .. ']},' coordinates = part3a .. coordinates .. part3b end else if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part2a .. coordinates .. part2b else coordinates = '[' .. coordinates .. ']},' coordinates = part1a .. coordinates .. part1b end end if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Multi-sided shape|lat=' .. latitude .. "|long=" .. long .. '}}\n' end return coordinates end -- RECTANGLE function p.rectangle(frame) local shape = "rectangle" if frame.args['upper'] == nil or frame.args['upper'] == "" then error("Missing argument upper!") end if frame.args['lower'] == nil or frame.args['lower'] == "" then error("Missing argument lower!") end local separator = "@@@@@" local x = string.gsub(frame.args['upper'],'%,','@@@@@') local y = string.gsub(frame.args['lower'],'%,','@@@@@') x = string.gsub(x,'%s+','') y = string.gsub(y,'%s+','') local tt = {} local data = {} local latitudes = {} local longitudes = {} local count = 1 local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end -- FUTURE USE for str in string.gmatch(x,"([^"..separator.."]+)") do if str ~= nil and str ~= "" then tt[count] = str count = count + 1 end end for str in string.gmatch(y,"([^"..separator.."]+)") do if str ~= nil and str ~= "" then tt[count] = str count = count + 1 end end if count >=6 then error("Check the upper and lower arguments for format!") end for i=1,4 do if tt[i] == nil or tt[i] == "" then error("Check for missing latitude or longitude separated by a comma!") end end longitudes[1] = tonumber(tt[2]) if longitudes[1] > 180 or longitudes[1] <- 180 then error("longitude should be between 180 and -180") end data[1] = "[" .. tt[2] latitudes[1] = tonumber(tt[1]) if latitudes[1] > 90 or latitudes[1] <- 90 then error("latitude should be between 90 and -90") end data[2] = "," .. tt[1] .. "]" longitudes[2] = tonumber(tt[2]) if longitudes[2] > 180 or longitudes[2] <- 180 then error("longitude should be between 180 and -180") end data[3] = "[" .. tt[2] latitudes[2] = tonumber(tt[3]) if latitudes[2] > 90 or latitudes[2] <- 90 then error("latitude should be between 90 and -90") end data[4] = "," .. tt[3] .. "]" longitudes[3] = tonumber(tt[4]) if longitudes[3] > 180 or longitudes[3] <- 180 then error("longitude should be between 180 and -180") end data[5] = "[" .. tt[4] latitudes[3] = tonumber(tt[3]) if latitudes[3] > 90 or latitudes[3] <- 90 then error("latitude should be between 90 and -90") end data[6] = "," .. tt[3] .. "]" longitudes[4] = tonumber(tt[4]) if longitudes[4] > 180 or longitudes[4] <- 180 then error("longitude should be between 180 and -180") end data[7] = "[" .. tonumber(tt[4]) latitudes[4] = tonumber(tt[1]) if latitudes[4] > 90 or latitudes[4] <- 90 then error("latitude should be between 90 and -90") end data[8] = "," .. tt[1] .. "]" table.sort(latitudes) table.sort(longitudes) local lat = latitudes[1] + ((latitudes[4] - latitudes[1]) / 2 ) local long = longitudes[1] + ((longitudes[4] - longitudes[1]) / 2) local group = frame.args['group'] or 'rectangle' local title = frame.args['title'] or 'A rectangle' local description = frame.args['desc'] or '' local fill = frame.args['fill'] or "#ccef64" local stroke = frame.args['stroke'] or "#0000ff" checkhex(fill,stroke) local coordinates = "" local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "poly" end local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) for i = 1,8, 1 do coordinates = coordinates .. data[i] end coordinates = coordinates .. data[1] .. data[2] coordinates = coordinates.gsub(coordinates,'%]%[','],[') coordinates = coordinates.gsub(coordinates,'%]@@@@@%[','],\n[') coordinates = "[" .. coordinates .. "]," if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = string.gsub(coordinates,'%]%,$',']]},') coordinates = part4a .. string.gsub(coordinates,'^%[','[[') .. part4b else coordinates = string.gsub(coordinates,'%]%,$',']},') coordinates = part3a .. coordinates .. part3b end else if type == "poly" then coordinates = string.gsub(coordinates,'%]%,$',']]},') coordinates = part2a .. string.gsub(coordinates,'^%[','[[') .. part2b else coordinates = string.gsub(coordinates,'%]%,$',']},') coordinates = part1a .. coordinates .. part1b end end if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Rectangle|lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end -- BOX - Square function p.box(frame) local shape = "box" local id = frame.args['id'] or "" local lat,long = "","" if id == nil or id == "" then if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end lat = frame.args['lat'] long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end local group = frame.args['group'] or 'box' local title = frame.args['title'] or 'A box' local description = frame.args['desc'] or '' local r = frame.args['radius'] or ".5" r = tonumber(r) if r > 10 then error("10 for radius is MAX") end if r <= 0 then error("r has to be greater than 0") end local fill = frame.args['fill'] or "#ccef64" local stroke = frame.args['stroke'] or "#0000ff" checkhex(fill,stroke) local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end local coordinates = "" local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "poly" end local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) lat = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) local angle1,angle2,angle3,angle4 = 0,0,0,0 local ptx,ptx2,ptx3,ptx4 = 0,0,0,0 local pty,pty2,pty3,pty4 = 0,0,0,0 local a = 45 local b = 135 local c = 225 local d = 315 angle1 = a * math.pi / 180 ptx = lat + r * math.cos( angle1 ) pty = long + r * math.sin( angle1 ) angle2 = b * math.pi /180 ptx2 = lat + r * math.cos( angle2 ) pty2 = long + r * math.sin( angle2 ) angle3 = c * math.pi /180 ptx3 = lat + r * math.cos( angle3 ) pty3 = long + r * math.sin( angle3 ) angle4 = d * math.pi /180 ptx4 = lat + r * math.cos( angle4 ) pty4 = long + r * math.sin( angle4 ) ptx,pty = string.format("%.6f",newlat(ptx)),string.format("%.6f",pty) ptx2,pty2 = string.format("%.6f",newlat(ptx2)),string.format("%.6f",pty2) ptx3,pty3 = string.format("%.6f",newlat(ptx3)),string.format("%.6f",pty3) ptx4,pty4 = string.format("%.6f",newlat(ptx4)),string.format("%.6f",pty4) lat,long = string.format("%.6f",newlat(lat)),string.format("%.6f",long) coordinates = "[" .. pty .. "," .. ptx .. "],[" .. pty2 .. "," .. ptx2 .. "],[" .. pty3 .. "," .. ptx3 .. "],[".. pty4 .. "," .. ptx4 .. "],[" .. pty .. "," .. ptx .. "]" if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part4a .. coordinates .. part4b else coordinates = '[' .. coordinates .. ']},' coordinates = part3a .. coordinates .. part3b end else if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part2a .. coordinates .. part2b else coordinates = '[' .. coordinates .. ']},' coordinates = part1a .. coordinates .. part1b end end if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Box|lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end -- BOX FRAME function p.boxframe(frame) local shape = "box" local id = frame.args['id'] or "" local lat,long = "","" if id == nil or id == "" then if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end lat = frame.args['lat'] long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end local group = frame.args['group'] or 'boxframe' local title = frame.args['title'] or 'A boxframe' local description = frame.args['desc'] or '' local r = frame.args['radius'] or ".5" r = tonumber(r) if r > 10 then error("10 for radius is MAX") end if r <= 0 then error("r has to be greater than 0") end local r2 = r * .85 local fill = frame.args['fill'] or "#ccef64" local stroke = frame.args['stroke'] or "#0000ff" checkhex(fill,stroke) local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end local coordinates = "" local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "poly" end -- line to become MultiLineString local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) lat = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) local angle1,angle2,angle3,angle4 = 0,0,0,0 local ptx,ptx2,ptx3,ptx4 = 0,0,0,0 local pty,pty2,pty3,pty4 = 0,0,0,0 local ptxa,ptxb,ptxc,ptxd = 0,0,0,0 local ptya,ptyb,ptyc,ptyd = 0,0,0,0 local a = 45 local b = 135 local c = 225 local d = 315 angle1 = a * math.pi / 180 ptx,ptxa = lat + r * math.cos( angle1 ),lat + r2 * math.cos( angle1 ) pty,ptya = long + r * math.sin( angle1 ),long + r2 * math.sin( angle1 ) angle2 = b * math.pi /180 ptx2,ptxb = lat + r * math.cos( angle2 ),lat + r2 * math.cos( angle2 ) pty2,ptyb = long + r * math.sin( angle2 ),long + r2 * math.sin( angle2 ) angle3 = c * math.pi /180 ptx3,ptxc = lat + r * math.cos( angle3 ),lat + r2 * math.cos( angle3 ) pty3,ptyc = long + r * math.sin( angle3 ),long + r2 * math.sin( angle3 ) angle4 = d * math.pi /180 ptx4,ptxd = lat + r * math.cos( angle4 ),lat + r2 * math.cos( angle4 ) pty4,ptyd = long + r * math.sin( angle4 ),long + r2 * math.sin( angle4 ) ptx,pty = string.format("%.6f",newlat(ptx)),string.format("%.6f",pty) ptx2,pty2 = string.format("%.6f",newlat(ptx2)),string.format("%.6f",pty2) ptx3,pty3 = string.format("%.6f",newlat(ptx3)),string.format("%.6f",pty3) ptx4,pty4 = string.format("%.6f",newlat(ptx4)),string.format("%.6f",pty4) ptxa,ptya = string.format("%.6f",newlat(ptxa)),string.format("%.6f",ptya) ptxb,ptyb = string.format("%.6f",newlat(ptxb)),string.format("%.6f",ptyb) ptxc,ptyc = string.format("%.6f",newlat(ptxc)),string.format("%.6f",ptyc) ptxd,ptyd = string.format("%.6f",newlat(ptxd)),string.format("%.6f",ptyd) lat,long = string.format("%.6f",newlat(lat)),string.format("%.6f",long) coordinates = "[" .. pty .. "," .. ptx .. "],[" .. pty2 .. "," .. ptx2 .. "],[" .. pty3 .. "," .. ptx3 .. "],[".. pty4 .. "," .. ptx4 .. "],[" .. pty .. "," .. ptx .. "]" coordinates = coordinates .. "],[" .. "[" .. ptya .. "," .. ptxa .. "],[" .. ptyb .. "," .. ptxb .. "],[" .. ptyc .. "," .. ptxc .. "],[".. ptyd .. "," .. ptxd .. "],[" .. ptya .. "," .. ptxa .. "]" if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part4a .. coordinates .. part4b else coordinates = '[[' .. coordinates .. ']]},' coordinates = part3a .. coordinates .. part3b coordinates = string.gsub(coordinates,'"type":"LineString"','"type":"MultiLineString"') end else if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part2a .. coordinates .. part2b else coordinates = '[[' .. coordinates .. ']]},' coordinates = part1a .. coordinates .. part1b coordinates = string.gsub(coordinates,'"type":"LineString"','"type":"MultiLineString"') end end if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Boxframe|lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end -- TRIANGLE function p.triangle(frame) local shape = "triangle" if frame.args['coord1'] == nil or frame.args['coord1'] == "" then error("Missing argument coord1!") end if frame.args['coord2'] == nil or frame.args['coord2'] == "" then error("Missing argument coord2!") end if frame.args['coord3'] == nil or frame.args['coord3'] == "" then error("Missing argument coord3!") end local separator = "@@@@@" local x = string.gsub(frame.args['coord1'],'%,','@@@@@') local y = string.gsub(frame.args['coord2'],'%,','@@@@@') local z = string.gsub(frame.args['coord3'],'%,','@@@@@') x = string.gsub(x,'%s+','') y = string.gsub(y,'%s+','') z = string.gsub(z,'%s+','') local tt = {} local data = {} local latitudes = {} local longitudes = {} local count = 1 local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end -- FUTURE USE for str in string.gmatch(x,"([^"..separator.."]+)") do if str ~= nil and str ~= "" then tt[count] = str count = count + 1 end end for str in string.gmatch(y,"([^"..separator.."]+)") do if str ~= nil and str ~= "" then tt[count] = str count = count + 1 end end for str in string.gmatch(z,"([^"..separator.."]+)") do if str ~= nil and str ~= "" then tt[count] = str count = count + 1 end end if count >=8 then error("Check the upper and lower arguments for format!") end for i=1,6 do if tt[i] == nil or tt[i] == "" then error("Check for missing latitude or longitude separated by a comma!") end end longitudes[1] = tonumber(tt[2]) if longitudes[1] > 180 or longitudes[1] <- 180 then error("longitude should be between 180 and -180") end data[1] = "[" .. tt[2] latitudes[1] = tonumber(tt[1]) if latitudes[1] > 90 or latitudes[1] <- 90 then error("latitude should be between 90 and -90") end data[2] = "," .. tt[1] .. "]" longitudes[2] = tonumber(tt[4]) if longitudes[2] > 180 or longitudes[2] <- 180 then error("longitude should be between 180 and -180") end data[3] = "[" .. tt[4] latitudes[2] = tonumber(tt[3]) if latitudes[2] > 90 or latitudes[2] <- 90 then error("latitude should be between 90 and -90") end data[4] = "," .. tt[3] .. "]" longitudes[3] = tonumber(tt[6]) if longitudes[3] > 180 or longitudes[3] <- 180 then error("longitude should be between 180 and -180") end data[5] = "[" .. tt[6] latitudes[3] = tonumber(tt[5]) if latitudes[3] > 90 or latitudes[3] <- 90 then error("latitude should be between 90 and -90") end data[6] = "," .. tt[5] .. "]" local lat = (latitudes[1] + latitudes[2] + latitudes[3]) / 3 local long = (longitudes[1] + longitudes[2] + longitudes[3]) / 3 lat = string.format("%.6f",lat) long = string.format("%.6f",long) local group = frame.args['group'] or 'triangle' local title = frame.args['title'] or 'A triangle' local description = frame.args['desc'] or '' local fill = frame.args['fill'] or "#ccef64" local stroke = frame.args['stroke'] or "#0000ff" checkhex(fill,stroke) local coordinates = "" local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "poly" end local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) for i = 1,6, 1 do coordinates = coordinates .. data[i] end coordinates = coordinates .. data[1] .. data[2] coordinates = coordinates.gsub(coordinates,'%]%[','],[') coordinates = coordinates.gsub(coordinates,'%]@@@@@%[','],\n[') coordinates = "[" .. coordinates .. "]," if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = string.gsub(coordinates,'%]%,$',']]},') coordinates = part4a .. string.gsub(coordinates,'^%[','[[') .. part4b else coordinates = string.gsub(coordinates,'%]%,$',']},') coordinates = part3a .. coordinates .. part3b end else if type == "poly" then coordinates = string.gsub(coordinates,'%]%,$',']]},') coordinates = part2a .. string.gsub(coordinates,'^%[','[[') .. part2b else coordinates = string.gsub(coordinates,'%]%,$',']},') coordinates = part1a .. coordinates .. part1b end end if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Triangle|lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end -- EQUITRI function p.equitri(frame) local shape = "equitri" local id = frame.args['id'] or "" local lat,long = "","" if id == nil or id == "" then if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end lat = frame.args['lat'] long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end local group = frame.args['group'] or 'equitri' local title = frame.args['title'] or 'An equilateral triangle' local description = frame.args['desc'] or '' local r = frame.args['radius'] or ".5" r = tonumber(r) if r > 10 then error("10 for radius is MAX") end if r <= 0 then error("r has to be greater than 0") end r = r * 2 local fill = frame.args['fill'] or "#ccef64" local stroke = frame.args['stroke'] or "#0000ff" checkhex(fill,stroke) local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end local coordinates = "" local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "poly" end local direction = frame.args['direction'] or "1" direction = string.gsub(direction,"%..*","") direction = tonumber(direction) if direction <= 0 or direction >=5 then error("direction should be a number from 1 to 4!") end local factors = {} factors[1] = "360,120,240" factors[2] = "90,210,330" factors[3] = "180,300,60" factors[4] = "270,150,30" local points = factors[direction] a = string.gsub(points,'%,.*$','') b = string.gsub(points,'(%d+%,)(%d+)(%,%d+)',"%2") c = string.gsub(points,'^.*,','') local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) lat = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) angle1 = a * math.pi / 180 ptx = lat + r * math.cos( angle1 ) pty = long + r * math.sin( angle1 ) angle2 = b * math.pi /180 ptx2 = lat + r * math.cos( angle2 ) pty2 = long + r * math.sin( angle2 ) angle3 = c * math.pi /180 ptx3 = lat + r * math.cos( angle3 ) pty3 = long + r * math.sin( angle3 ) ptx,pty = string.format("%.6f",newlat(ptx)),string.format("%.6f",pty) ptx2,pty2 = string.format("%.6f",newlat(ptx2)),string.format("%.6f",pty2) ptx3,pty3 = string.format("%.6f",newlat(ptx3)),string.format("%.6f",pty3) lat,long = string.format("%.6f",newlat(lat)),string.format("%.6f",long) coordinates = "[" .. pty .. "," .. ptx .. "],[" .. pty2 .. "," .. ptx2 .. "],[" .. pty3 .. "," .. ptx3 .. "],[" .. pty .. "," .. ptx .. "]" if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part4a .. coordinates .. part4b else coordinates = '[' .. coordinates .. ']},' coordinates = part3a .. coordinates .. part3b end else if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part2a .. coordinates .. part2b else coordinates = '[' .. coordinates .. ']},' coordinates = part1a .. coordinates .. part1b end end lat = (ptx + ptx2 + ptx3) / 3 long = (pty + pty2 + pty3 ) / 3 if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Equitri|lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end -- ELLIPSE function p.ellipse(frame) local shape = "ellipse" local id = frame.args['id'] or "" local lat,long = "","" local x,y = 0,0 if id == nil or id == "" then if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end lat = frame.args['lat'] long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end x = string.format("%.6f",lat) y = string.format("%.6f",long) local group = frame.args['group'] or 'ellipse' local title = frame.args['title'] or 'An ellipse' local description = frame.args['desc'] or '' local r = frame.args['radius'] or ".5" r = tonumber(r) if r > 10 then error("10 for radius is MAX") end if r <= 0 then error("radius has to be greater than 0") end local fill = frame.args['fill'] or "#ccef64" local stroke = frame.args['stroke'] or "#0000ff" checkhex(fill,stroke) local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end -- FUTURE USE local style = frame.args['style'] or "h" if style == nil or style == "" then style = "h" end if style ~= "v" then style = "h" end -- if not v (ie. other garbage then force style to be h) local data = {} local coordinates = "" local ptx,pty,angle = 0,0,0 local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "poly" end local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) if tonumber(x) >= 10.5 then x = math.log(math.tan((90 + x) * math.pi/360)) / (math.pi/180) elseif tonumber(x) <= -10.5 then x = math.log(math.tan((90 + x) * math.pi/360)) / (math.pi/180) end for i = 1, 360 do angle = i * math.pi / 180 ptx = x + r * math.cos( angle ) if style == "v" then pty = y - 0.5 * r * math.sin( angle ) -- for ellipse vertical elseif style == "h" then pty = y + 2.0 * r * math.sin(angle) -- for ellipse horizontal end if tonumber(x) >= 10.5 then ptx = newlat(ptx) -- makes correction to make ellipse show up on map end if tonumber(x) <= -10.5 then ptx = newlat(ptx) -- makes correction to make ellipse show up on map end data[i] = '[' .. string.format("%.6f",pty) .. "," .. string.format("%.6f",ptx) .. ']' end for i = 5,359, 5 do data[i] = data[i] .. "@@@@@" end for i = 1,360, 1 do coordinates = coordinates .. data[i] end coordinates = coordinates.gsub(coordinates,'%]%[','],[') coordinates = coordinates.gsub(coordinates,'%]@@@@@%[','],\n[') coordinates = "[" .. coordinates .. ',' .. data[1] .. "]," if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = string.gsub(coordinates,'%]%,$',']]},') coordinates = part4a .. string.gsub(coordinates,'^%[','[[') .. part4b else coordinates = string.gsub(coordinates,'%]%,$',']},') coordinates = part3a .. coordinates .. part3b end else if type == "poly" then coordinates = string.gsub(coordinates,'%]%,$',']]},') coordinates = part2a .. string.gsub(coordinates,'^%[','[[') .. part2b else coordinates = string.gsub(coordinates,'%]%,$',']},') coordinates = part1a .. coordinates .. part1b end end if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Ellipse|lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end -- STAR -- to be reworked for vertical placement of top of star function p.star(frame) local shape = "star" local id = frame.args['id'] or "" local lat,long = "","" if id == nil or id == "" then if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end lat = frame.args['lat'] long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end local latitude = string.format("%.6f",lat) local longitude = string.format("%.6f",long) local group = frame.args['group'] or 'star' local title = frame.args['title'] or 'A star' local description = frame.args['desc'] or '' local radius = frame.args['radius'] or ".5" radius = tonumber(radius) if radius > 10 then error("10 for radius is MAX") end if radius <= 0 then error("radius has to be greater than 0") end local radius2 = radius * 3; local fill = frame.args['fill'] or "#ccef64" local stroke = frame.args['stroke'] or "#0000ff" checkhex(fill,stroke) local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end -- FUTURE USE latitude = math.log(math.tan((90 + latitude) * math.pi/360)) / (math.pi/180) local ra,angle = 0,0 local points = {} local coordinates = "" local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "poly" end local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) for i = 1,10, 1 do mod = math.mod(i,2) if mod == 1 then ra = radius else ra = radius2 end angle = ((2 * math.pi / 10)) * i points[i] = '[' .. string.format("%.6f",longitude + (ra * math.cos(angle))) .. "," points[i] = points[i] .. string.format("%.6f",newlat(latitude + (ra * math.sin(angle)))) .. "]," end for i = 1,10, 1 do coordinates = coordinates .. points[i] .. "\n" end coordinates = coordinates .. points[1] if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = string.gsub(coordinates,'%]%,$',']]]},') coordinates = part4a .. string.gsub(coordinates,'^%[','[[[') .. part4b else coordinates = string.gsub(coordinates,'%]%,$',']]},') coordinates = part3a .. string.gsub(coordinates,'^%[','[[') .. part3b end else if type == "poly" then coordinates = string.gsub(coordinates,'%]%,$',']]]},') coordinates = part2a .. string.gsub(coordinates,'^%[','[[[') .. part2b else coordinates = string.gsub(coordinates,'%]%,$',']]},') coordinates = part1a .. string.gsub(coordinates,'^%[','[[') .. part1b end end if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Star|lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end -- POINTER function p.pointer(frame) local shape = "pointer" local id = frame.args['id'] or "" local lat,long = "","" if id == nil or id == "" then if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end lat = frame.args['lat'] long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end local latitude = lat local longitude = long local group = frame.args['group'] or 'pointer' local title = frame.args['title'] or 'A pointer' local description = frame.args['desc'] or '' local r = frame.args['radius'] or ".5" r = tonumber(r) if r > 10 then error("10 for length is MAX") end if r <= 0 then error("r has to be greater than 0") end r = r * 2 local r2 = r/2 local r3 = r/3 local fill = frame.args['fill'] or "#ccef64" local stroke = frame.args['stroke'] or "#0000ff" checkhex(fill,stroke) local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end local coordinates = "" local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "poly" end local direction = frame.args['direction'] or "1" direction = string.gsub(direction,'%..*','') direction = tonumber(direction) if direction <= 0 or direction >= 9 then error("Direction should be a number from 1 to 8!") end local angle1,angle2,angle3,angle4 = 0,0,0,0 local ptx,ptx2,ptx3,ptx4 = 0,0,0,0 local pty,pty2,pty3,pty4 = 0,0,0,0 local factor = {'20,360,340','25,45,65','70,90,110','115,135,155','160,180,200','205,225,245','250,270,290','295,315,335'} local a = string.gsub(factor[direction],'%,.*$','') -- eat everything after a comma - hungry local b = string.gsub(factor[direction],'^.*%,','') -- eat everything up to a comma - hungry local c = string.gsub(factor[direction],'(%d+)(,)(%d+)(,)(%d+)','%3') local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) lat = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) angle1 = a * math.pi / 180 ptx = lat + r * math.cos( angle1 ) pty = long + r * math.sin( angle1 ) angle2 = b * math.pi /180 ptx2 = lat + r * math.cos( angle2 ) pty2 = long + r * math.sin( angle2 ) angle3 = c * math.pi /180 ptx3 = lat + r2 * math.cos( angle3 ) pty3 = long + r2 * math.sin( angle3 ) angle4 = c * math.pi /180 ptx4 = lat + r3 * math.cos( angle3 ) pty4 = long + r3 * math.sin( angle3 ) ptx,pty = string.format("%.6f",newlat(ptx)),string.format("%.6f",pty) ptx2,pty2 = string.format("%.6f",newlat(ptx2)),string.format("%.6f",pty2) ptx3,pty3 = string.format("%.6f",newlat(ptx3)),string.format("%.6f",pty3) ptx4,pty4 = string.format("%.6f",newlat(ptx4)),string.format("%.6f",pty4) lat,long = string.format("%.6f",newlat(lat)),string.format("%.6f",long) coordinates = "[" .. pty .. "," .. ptx .. "],[" .. pty3 .. "," .. ptx3 .. "],[" .. pty2 .. "," .. ptx2 .. "],[" .. long .. "," .. lat .. "],[" .. pty .. "," .. ptx .. "]" if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part4a .. coordinates .. part4b else coordinates = '[' .. coordinates .. ']},' coordinates = part3a .. coordinates .. part3b end else if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part2a .. coordinates .. part2b else coordinates = '[' .. coordinates .. ']},' coordinates = part1a .. coordinates .. part1b end end if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Pointer|lat=' .. ptx4 .. "|long=" .. pty4 .. '}}\n' coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Points to Position|lat=' .. latitude .. "|long=" .. longitude .. '}}\n' end return coordinates end -- PENTAGON function p.pentagon(frame) local shape = "pentagon" local id = frame.args['id'] or "" local lat,long = "","" if id == "" or id == nil then if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end lat = frame.args['lat'] long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end local group = frame.args['group'] or 'pentagon' local title = frame.args['title'] or 'A pentagon' local description = frame.args['desc'] or '' local r = frame.args['radius'] or ".5" r = tonumber(r) if r > 10 then error("10 for radius is MAX") end if r <= 0 then error("r has to be greater than 0") end r = r * 2 local r2 = r/2 local r3 = r/3 local fill = frame.args['fill'] or "#ccef64" local stroke = frame.args['stroke'] or "#0000ff" checkhex(fill,stroke) local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end local coordinates = "" local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "poly" end local a,b,c,d,e = 360,72,144,216,288 local angle1,angle2,angle3,angle4,angle5 = 0,0,0,0,0 local ptx,ptx2,ptx3,ptx4,ptx5 = 0,0,0,0,0 local pty,pty2,pty3,pty4,pty5 = 0,0,0,0,0 local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) lat = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) angle1 = a * math.pi / 180 ptx = lat + r * math.cos( angle1 ) pty = long + r * math.sin( angle1 ) angle2 = b * math.pi /180 ptx2 = lat + r * math.cos( angle2 ) pty2 = long + r * math.sin( angle2 ) angle3 = c * math.pi /180 ptx3 = lat + r * math.cos( angle3 ) pty3 = long + r * math.sin( angle3 ) angle4 = d * math.pi /180 ptx4 = lat + r * math.cos( angle4 ) pty4 = long + r * math.sin( angle4 ) angle5 = e * math.pi /180 ptx5 = lat + r * math.cos( angle5 ) pty5 = long + r * math.sin( angle5 ) ptx,pty = string.format("%.6f",newlat(ptx)),string.format("%.6f",pty) ptx2,pty2 = string.format("%.6f",newlat(ptx2)),string.format("%.6f",pty2) ptx3,pty3 = string.format("%.6f",newlat(ptx3)),string.format("%.6f",pty3) ptx4,pty4 = string.format("%.6f",newlat(ptx4)),string.format("%.6f",pty4) ptx5,pty5 = string.format("%.6f",newlat(ptx5)),string.format("%.6f",pty5) lat,long = string.format("%.6f",newlat(lat)),string.format("%.6f",long) coordinates = "[" .. pty .. "," .. ptx .. "],[" .. pty2 .. "," .. ptx2 .. "],[" .. pty3 .. "," .. ptx3 .. "],[" .. pty4 .. "," .. ptx4 .. "],[" .. pty5 .. "," .. ptx5 .. "],[" .. pty .. "," .. ptx .. "]" if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part4a .. coordinates .. part4b else coordinates = '[' .. coordinates .. ']},' coordinates = part3a .. coordinates .. part3b end else if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part2a .. coordinates .. part2b else coordinates = '[' .. coordinates .. ']},' coordinates = part1a .. coordinates .. part1b end end if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Pentagon|lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end -- HEXAGON function p.hexagon(frame) local shape = "hexagon" local id = frame.args['id'] or "" local lat,long = "","" if id == nil or id == "" then if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end lat = frame.args['lat'] long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end local group = frame.args['group'] or 'hexagon' local title = frame.args['title'] or 'A hexigon' local description = frame.args['desc'] or '' local r = frame.args['radius'] or ".5" r = tonumber(r) if r > 10 then error("10 for radius is MAX") end if r <= 0 then error("r has to be greater than 0") end r = r * 2 local r2 = r/2 local r3 = r/3 local fill = frame.args['fill'] or "#ccef64" local stroke = frame.args['stroke'] or "#0000ff" checkhex(fill,stroke) local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end local coordinates = "" local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "poly" end local a,b,c,d,e,f = 30,90,150,210,270,330 local angle1,angle2,angle3,angle4,angle5,angle6 = 0,0,0,0,0,0 local ptx,ptx2,ptx3,ptx4,ptx5,ptx6 = 0,0,0,0,0,0 local pty,pty2,pty3,pty4,pty5,pty6 = 0,0,0,0,0,0 local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) lat = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) angle1 = a * math.pi / 180 ptx = lat + r * math.cos( angle1 ) pty = long + r * math.sin( angle1 ) angle2 = b * math.pi /180 ptx2 = lat + r * math.cos( angle2 ) pty2 = long + r * math.sin( angle2 ) angle3 = c * math.pi /180 ptx3 = lat + r * math.cos( angle3 ) pty3 = long + r * math.sin( angle3 ) angle4 = d * math.pi /180 ptx4 = lat + r * math.cos( angle4 ) pty4 = long + r * math.sin( angle4 ) angle5 = e * math.pi /180 ptx5 = lat + r * math.cos( angle5 ) pty5 = long + r * math.sin( angle5 ) angle6 = f * math.pi /180 ptx6 = lat + r * math.cos( angle6 ) pty6 = long + r * math.sin( angle6 ) ptx,pty = string.format("%.6f",newlat(ptx)),string.format("%.6f",pty) ptx2,pty2 = string.format("%.6f",newlat(ptx2)),string.format("%.6f",pty2) ptx3,pty3 = string.format("%.6f",newlat(ptx3)),string.format("%.6f",pty3) ptx4,pty4 = string.format("%.6f",newlat(ptx4)),string.format("%.6f",pty4) ptx5,pty5 = string.format("%.6f",newlat(ptx5)),string.format("%.6f",pty5) ptx6,pty6 = string.format("%.6f",newlat(ptx6)),string.format("%.6f",pty6) lat,long = string.format("%.6f",newlat(lat)),string.format("%.6f",long) coordinates = "[" .. pty .. "," .. ptx .. "],[" .. pty2 .. "," .. ptx2 .. "],[" .. pty3 .. "," .. ptx3 .. "],[" .. pty4 .. "," .. ptx4 .. "],[" .. pty5 .. "," .. ptx5 .. "],[" .. pty6 .. "," .. ptx6 .. "],[" .. pty .. "," .. ptx .. "]" if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part4a .. coordinates .. part4b else coordinates = '[' .. coordinates .. ']},' coordinates = part3a .. coordinates .. part3b end else if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part2a .. coordinates .. part2b else coordinates = '[' .. coordinates .. ']},' coordinates = part1a .. coordinates .. part1b end end if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Hexagon|lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end -- LINE function p.line(frame) local shape = "line" local coord1 = frame.args['coord1'] or "" local coord2 = frame.args['coord2'] or "" local lat1,long1,lat2,long2 = "","","","" local ids = frame.args['ids'] or "" local type = "line" local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end -- FUTURE USE local fill = "#ccef64" -- not needed as this is a line but keeping text etc. consistent throughout local group = frame.args['group'] or 'line' local title = frame.args['title'] or 'A line' local description = frame.args['desc'] or '' local stroke = frame.args['stroke'] or "#0000ff" checkhex(fill,stroke) local data = {} local coordinates = "" -- if no ids then coord1 and coord2 is required for building coordinates if ids == nil or ids == "" then if coord1 == nil or coord1 == "" then error("Missing argument coord1!") end if coord2 == nil or coord2 == "" then error("Missing argument coord2!") end lat1 = string.gsub(coord1,"%,.*","") long1 = string.gsub(coord1,".*%,",'') lat2 = string.gsub(coord2,"%,.*","") long2 = string.gsub(coord2,".*%,",'') else ids = string.gsub(ids,"q","Q") -- do a lazy check for format of ids - "^[Q]%d+%,[Q]%d+$") local checker = string.gsub(ids,"^[Q]%d+%,[Q]%d+$","") if checker ~= "" then error("Bad format for parameter ids!") end lat1 = string.gsub(ids,"%,.*","") long1 = string.gsub(ids,"%,.*","") lat2 = string.gsub(ids,".*%,",'') long2 = string.gsub(ids,".*%,",'') lat1 = latitude(lat1) long1 = longitude(long1) lat2 = latitude(lat2) long2 = longitude(long2) if lat1 == "" or lat2 == "" then error("latitude not found in wikidata!") end if long1 == "" or long2 == "" then error("longitude not found in wikidata!") end end -- Need to CORRECT CENTER - OFF A BIT - FOR LATER WORK local latitude = string.format("%.6f",(lat1 + lat2) / 2) local longitude = string.format("%.6f",(long1 + long2) / 2) data[1] = "[" .. long1 .. "," .. lat1 .. "]" data[2] = "[" .. long2 .. "," .. lat2 .. "]" coordinates = "[" .. data[1] .. "," .. data[2] .. "]}," -- Text for building a maplink - added together with line coordinates in final output local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat1,long1,group,title,description,fill,stroke) if mapframe == "y" or mapframe == "yes" then coordinates = part3a .. coordinates .. part3b else coordinates = part1a .. coordinates .. part1b end if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Begin line|lat=' .. string.format("%.6f",lat1) .. "|long=" .. string.format("%.6f",long1) .. '}}\n' coordinates = coordinates .. '\n* {{marker|type=vicinity|name=End line|lat=' .. string.format("%.6f",lat2) .. "|long=" .. string.format("%.6f",long2) .. '}}\n' end return coordinates end -- DIAMOND function p.diamond(frame) local shape = "diamond" local id = frame.args['id'] or "" local lat,long = "","" if id == nil or id == "" then if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end lat = frame.args['lat'] long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end local group = frame.args['group'] or 'diamond' local title = frame.args['title'] or 'A diamond' local description = frame.args['desc'] or '' local r = frame.args['radius'] or ".5" r = tonumber(r) if r > 10 then error("10 for radius is MAX") end if r <= 0 then error("r has to be greater than 0") end local fill = frame.args['fill'] or "#ccef64" local stroke = frame.args['stroke'] or "#0000ff" checkhex(fill,stroke) local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end local coordinates = "" local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "poly" end local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) lat = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) local a = 360 local b = 90 local c = 180 local d = 270 angle1 = a * math.pi / 180 ptx = lat + r * math.cos( angle1 ) pty = long + r * math.sin( angle1 ) angle2 = b * math.pi /180 ptx2 = lat + r * math.cos( angle2 ) pty2 = long + r * math.sin( angle2 ) angle3 = c * math.pi /180 ptx3 = lat + r * math.cos( angle3 ) pty3 = long + r * math.sin( angle3 ) angle4 = d * math.pi /180 ptx4 = lat + r * math.cos( angle4 ) pty4 = long + r * math.sin( angle4 ) ptx,pty = string.format("%.6f",newlat(ptx)),string.format("%.6f",pty) ptx2,pty2 = string.format("%.6f",newlat(ptx2)),string.format("%.6f",pty2) ptx3,pty3 = string.format("%.6f",newlat(ptx3)),string.format("%.6f",pty3) ptx4,pty4 = string.format("%.6f",newlat(ptx4)),string.format("%.6f",pty4) lat,long = string.format("%.6f",newlat(lat)),string.format("%.6f",long) coordinates = "[" .. pty .. "," .. ptx .. "],[" .. pty2 .. "," .. ptx2 .. "],[" .. pty3 .. "," .. ptx3 .. "],[".. pty4 .. "," .. ptx4 .. "],[" .. pty .. "," .. ptx .. "]" if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part4a .. coordinates .. part4b else coordinates = '[' .. coordinates .. ']},' coordinates = part3a .. coordinates .. part3b end else if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part2a .. coordinates .. part2b else coordinates = '[' .. coordinates .. ']},' coordinates = part1a .. coordinates .. part1b end end if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Diamond|lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end -- KITE - Shield function p.kite(frame) local shape = "kite" local id = frame.args['id'] or "" local lat,long = "","" if id == nil or id == "" then if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end lat = frame.args['lat'] long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end local group = frame.args['group'] or 'kite' local title = frame.args['title'] or 'A kite' local description = frame.args['desc'] or '' local r = frame.args['radius'] or ".5" r = tonumber(r) if r > 10 then error("10 for radius is MAX") end if r <= 0 then error("r has to be greater than 0") end local fill = frame.args['fill'] or "#ccef64" local stroke = frame.args['stroke'] or "#0000ff" checkhex(fill,stroke) local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end local coordinates = "" local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "poly" end local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) lat = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) local a = 360 local b = 60 local c = 180 local d = 300 angle1 = a * math.pi / 180 ptx = lat + r * math.cos( angle1 ) pty = long + r * math.sin( angle1 ) angle2 = b * math.pi /180 ptx2 = lat + r * math.cos( angle2 ) pty2 = long + r * math.sin( angle2 ) angle3 = c * math.pi /180 ptx3 = lat + r * math.cos( angle3 ) pty3 = long + r * math.sin( angle3 ) angle4 = d * math.pi /180 ptx4 = lat + r * math.cos( angle4 ) pty4 = long + r * math.sin( angle4 ) ptx,pty = string.format("%.6f",newlat(ptx)),string.format("%.6f",pty) ptx2,pty2 = string.format("%.6f",newlat(ptx2)),string.format("%.6f",pty2) ptx3,pty3 = string.format("%.6f",newlat(ptx3)),string.format("%.6f",pty3) ptx4,pty4 = string.format("%.6f",newlat(ptx4)),string.format("%.6f",pty4) lat,long = string.format("%.6f",newlat(lat)),string.format("%.6f",long) coordinates = "[" .. pty .. "," .. ptx .. "],[" .. pty2 .. "," .. ptx2 .. "],[" .. pty3 .. "," .. ptx3 .. "],[".. pty4 .. "," .. ptx4 .. "],[" .. pty .. "," .. ptx .. "]" if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part4a .. coordinates .. part4b else coordinates = '[' .. coordinates .. ']},' coordinates = part3a .. coordinates .. part3b end else if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part2a .. coordinates .. part2b else coordinates = '[' .. coordinates .. ']},' coordinates = part1a .. coordinates .. part1b end end if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Kite|lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end -- CRESCENT function p.crescent(frame) local shape = "crescent" local id = frame.args['id'] or "" local lat,long = "","" local x,y,x2,y2 = 0,0,0,0 local newcenterx,newcentery = 0,0 if id == nil or id == "" then if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end lat = frame.args['lat'] long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end x = string.format("%.6f",lat) y = string.format("%.6f",long) local group = frame.args['group'] or 'crescent' local title = frame.args['title'] or 'A crescent' local description = frame.args['desc'] or '' local r = frame.args['radius'] or ".5" r = tonumber(r) if r > 10 then error("10 for radius is MAX") end if r <= 0 then error("radius has to be greater than 0") end local fill = frame.args['fill'] or "#ccef64" local stroke = frame.args['stroke'] or "#0000ff" checkhex(fill,stroke) local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end -- FUTURE USE local data = {} local data2 = {} local coordinates = "" local coordinates2 = "" local ptx,pty,angle,ptx2,pty2 = 0,0,0,0,0 local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "poly" end local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) x = math.log(math.tan((90 + x) * math.pi/360)) / (math.pi/180) x2 = x y2 = y for i = 1, 360 do angle = i * math.pi / 180 ptx = x + r * math.cos( angle ) pty = y + 1.5 * r * math.sin(angle) -- for ellipse horizontal ptx2 = x2 + r * math.cos (angle) pty2 = y2 + r * math.sin (angle) if i == 90 then newcenterx = x + r * math.cos( angle ) newcentery = y + 1.25 * r * math.sin (angle) newcenterx = newlat(newcenterx) newcenterx = string.format("%.6f",newcenterx) newcentery = string.format("%.6f",newcentery) end ptx = newlat(ptx) -- makes correction to make ellipse show up on map ptx2 = newlat(ptx2) data[i] = '[' .. string.format("%.6f",pty) .. "," .. string.format("%.6f",ptx) .. ']' data2[i] = '[' .. string.format("%.6f",pty2) .. "," .. string.format("%.6f",ptx2) .. ']' end for i = 5,360, 5 do data[i] = data[i] .. "@@@@@" data2[i] = data2[i] .. "@@@@@" end for i = 1,180, 1 do coordinates = coordinates .. data[i] end for i = 180,1, -1 do coordinates2 = coordinates2 .. data2[i] end coordinates = coordinates .. coordinates2 coordinates = coordinates.gsub(coordinates,'%]%[','],[') coordinates = coordinates.gsub(coordinates,'@@@@@$','') coordinates = coordinates.gsub(coordinates,'%]@@@@@%[','],\n[') coordinates = "[" .. coordinates .. ',' .. data[1] .. "]," if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = string.gsub(coordinates,'%]%,$',']]},') coordinates = part4a .. string.gsub(coordinates,'^%[','[[') .. part4b else coordinates = string.gsub(coordinates,'%]%,$',']},') coordinates = part3a .. coordinates .. part3b end else if type == "poly" then coordinates = string.gsub(coordinates,'%]%,$',']]},') coordinates = part2a .. string.gsub(coordinates,'^%[','[[') .. part2b else coordinates = string.gsub(coordinates,'%]%,$',']},') coordinates = part1a .. coordinates .. part1b end end if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Crescent|lat=' .. newcenterx .. "|long=" .. newcentery .. '}}\n' end return coordinates end -- STAR2 -- reworked star pointing North function p.star2(frame) local shape = "star2" local id = frame.args['id'] or "" local lat,long = "","" if id == nil or id == "" then if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end lat = frame.args['lat'] long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end local x = tonumber(lat) local y = tonumber(long) local latitude = string.format("%.6f",lat) local longitude = string.format("%.6f",long) local group = frame.args['group'] or 'star2' local title = frame.args['title'] or 'A star(2)' local description = frame.args['desc'] or '' local radius = frame.args['radius'] or ".5" radius = tonumber(radius) if radius > 10 then error("10 for radius is MAX") end if radius <= 0 then error("radius has to be greater than 0") end local radius2 = radius * 3; local fill = frame.args['fill'] or "#ccef64" local stroke = frame.args['stroke'] or "#0000ff" checkhex(fill,stroke) local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end -- FUTURE USE local ra,angle,ptx,pty = 0,0,0,0 local compass = {} local points = {} local coordinates = "" local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "poly" end local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) x = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) compass = positions(shape) for i = 1,table.getn(compass), 1 do mod = math.mod(i,2) if mod == 1 then r = radius else r = radius2 end angle = compass[i] * math.pi / 180 ptx = x + r * math.cos( angle ) pty = y + r * math.sin( angle ) ptx = newlat(ptx) points[i] = '[' .. string.format("%.6f",pty) .. pty .. "," .. string.format("%.6f",ptx) .. "]," end for i = 1,table.getn(points), 1 do coordinates = coordinates .. points[i] .. "\n" end coordinates = coordinates .. points[1] if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = string.gsub(coordinates,'%]%,$',']]]},') coordinates = part4a .. string.gsub(coordinates,'^%[','[[[') .. part4b else coordinates = string.gsub(coordinates,'%]%,$',']]},') coordinates = part3a .. string.gsub(coordinates,'^%[','[[') .. part3b end else if type == "poly" then coordinates = string.gsub(coordinates,'%]%,$',']]]},') coordinates = part2a .. string.gsub(coordinates,'^%[','[[[') .. part2b else coordinates = string.gsub(coordinates,'%]%,$',']]},') coordinates = part1a .. string.gsub(coordinates,'^%[','[[') .. part1b end end if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Star(2)|lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end -- HEXAGRAM -- 6 pointed star - six sided star function p.hexagram(frame) local shape = "hexagram" local id = frame.args['id'] or "" local lat,long = "","" if id == nil or id == "" then if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end lat = frame.args['lat'] long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end local x = tonumber(lat) local y = tonumber(long) local latitude = string.format("%.6f",lat) local longitude = string.format("%.6f",long) local group = frame.args['group'] or 'hexagram' local title = frame.args['title'] or 'A hexagram' local description = frame.args['desc'] or '' local radius = frame.args['radius'] or ".5" radius = tonumber(radius) if radius > 10 then error("10 for radius is MAX") end if radius <= 0 then error("radius has to be greater than 0") end local radius2 = radius * 3; local fill = frame.args['fill'] or "#ccef64" local stroke = frame.args['stroke'] or "#0000ff" checkhex(fill,stroke) local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end local ra,angle,ptx,pty = 0,0,0,0 local compass = {} local points = {} local coordinates = "" local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "poly" end local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) x = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) compass = positions(shape) for i = 1,table.getn(compass), 1 do mod = math.mod(i,2) if mod == 1 then r = radius else r = radius2 end angle = compass[i] * math.pi / 180 ptx = x + r * math.cos( angle ) pty = y + r * math.sin( angle ) ptx = newlat(ptx) points[i] = '[' .. string.format("%.6f",pty) .. pty .. "," .. string.format("%.6f",ptx) .. "]," end for i = 1,table.getn(points), 1 do coordinates = coordinates .. points[i] .. "\n" end coordinates = coordinates .. points[1] if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = string.gsub(coordinates,'%]%,$',']]]},') coordinates = part4a .. string.gsub(coordinates,'^%[','[[[') .. part4b else coordinates = string.gsub(coordinates,'%]%,$',']]},') coordinates = part3a .. string.gsub(coordinates,'^%[','[[') .. part3b end else if type == "poly" then coordinates = string.gsub(coordinates,'%]%,$',']]]},') coordinates = part2a .. string.gsub(coordinates,'^%[','[[[') .. part2b else coordinates = string.gsub(coordinates,'%]%,$',']]},') coordinates = part1a .. string.gsub(coordinates,'^%[','[[') .. part1b end end if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Hexagram|lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end -- Octagon -- 8 sided shape function p.octagon(frame) local shape = "octagon" local id = frame.args['id'] or "" local lat,long = "","" if id == nil or id == "" then if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end lat = frame.args['lat'] long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end local x = tonumber(lat) local y = tonumber(long) local latitude = string.format("%.6f",lat) local longitude = string.format("%.6f",long) local group = frame.args['group'] or 'octagon' local title = frame.args['title'] or 'An octagon' local description = frame.args['desc'] or '' local radius = frame.args['radius'] or ".5" radius = tonumber(radius) if radius > 10 then error("10 for radius is MAX") end if radius <= 0 then error("radius has to be greater than 0") end local fill = frame.args['fill'] or "#ccef64" local stroke = frame.args['stroke'] or "#0000ff" checkhex(fill,stroke) local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end local ra,angle,ptx,pty = 0,0,0,0 local compass = {} local points = {} local coordinates = "" local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "poly" end local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) x = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) compass = positions(shape) for i = 1,table.getn(compass), 1 do angle = compass[i] * math.pi / 180 ptx = x + radius * math.cos( angle ) pty = y + radius * math.sin( angle ) ptx = newlat(ptx) points[i] = '[' .. string.format("%.6f",pty) .. pty .. "," .. string.format("%.6f",ptx) .. "]," end for i = 1,table.getn(points), 1 do coordinates = coordinates .. points[i] .. "\n" end coordinates = coordinates .. points[1] if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = string.gsub(coordinates,'%]%,$',']]]},') coordinates = part4a .. string.gsub(coordinates,'^%[','[[[') .. part4b else coordinates = string.gsub(coordinates,'%]%,$',']]},') coordinates = part3a .. string.gsub(coordinates,'^%[','[[') .. part3b end else if type == "poly" then coordinates = string.gsub(coordinates,'%]%,$',']]]},') coordinates = part2a .. string.gsub(coordinates,'^%[','[[[') .. part2b else coordinates = string.gsub(coordinates,'%]%,$',']]},') coordinates = part1a .. string.gsub(coordinates,'^%[','[[') .. part1b end end if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Octagon|lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end -- Only for a single polygon or shape - not multiple polygons or shapes yet -- Enter mapmask template coordinates as argument ie. |123,78.9|123,89.9|123,78.9 -- Create a mapmask in a mapframe or maplink -- Create a geoshape in a mapframe or maplink function p.mapmark(frame) local data={} local markers = {} local counter = 0 local coordinates = "" local markerstext = "" local output = "" local latitude = "" local longitude = "" local mask = frame.args['mask'] or "y" if mask == nil then mask = "y" end local mapshape = frame.args['mapshape'] or "n" if mapshape == nil then mapshape = "n" end local maplink = frame.args['maplink'] or "n" if maplink == nil then maplink = "n" end local mapframe = frame.args['mapframe'] or "y" if maplink == nil then mapframe = "y" end local marker = frame.args['marker'] or "n" if marker == nil then marker = "n" end if mapframe == "n" then maplink = "y" end if maplink == "y" then mapframe = "n" end -- if maplink that overrides mapframe if mask == "n" then mapshape = "y" end if mapshape == "y" then mask = "n" end -- if mapshape that overrides mask local markerstype = "" local markercount = 0 for x in ipairs( frame.args ) do data[x] = frame.args[x] if data[x] ~= nil and data[x] ~= "" then if marker == "y" then markercount = markercount + 1 if markercount <= 90 then markerstype = "vicinity" end if markercount > 90 and markercount <= 180 then markerstype = "around" end if markercount > 180 and markercount <= 270 then markerstype = "view" end if markercount > 270 and markercount <= 360 then markerstype = "do" end if markercount > 360 and markercount <= 450 then markerstype = "lime" end if markercount > 450 and markercount <= 540 then markerstype = "listing" end if markercount > 540 and markercount <= 630 then markerstype = "gold" end if markercount > 630 and markercount <= 720 then markerstype = "see" end if markercount > 720 and markercount <= 810 then markerstype = "red" end if markercount > 810 and markercount <= 900 then markerstype = "silver" end if markercount > 900 and markercount <= 990 then markerstype = "go" end if markercount > 990 and markercount <= 1080 then markerstype = "other" end if markercount >1080 and markercount <= 1170 then markerstype = "sleep" end if markercount > 1170 and markercount <= 1260 then markerstype = "buy" end if markercount > 1260 and markercount <= 1350 then markerstype = "drink" end -- markers[x] = "\n* {{marker|type=vicinity|name=Location: " .. data[x] .. "|lat=" .. string.gsub(data[x],',.*','') markers[x] = "\n* {{marker|type=" .. markerstype .. "|name=Location: " .. data[x] .. "|lat=" .. string.gsub(data[x],',.*','') markers[x] = markers[x] .. "|long=" .. string.gsub(data[x],'^.*,','') .. "}}" end data[x] = "[" .. string.gsub(data[x],'^(.*)(%,)(.*)$','%3%2%1') .. "]" end end for i = 1,table.getn(data) do if string.find(data[i],'%a+') == nil and string.find(data[i],'%u+') == nil then if data[i] ~= nil and data[i] ~= "" then if latitude == "" then latitude = string.gsub(data[i],'(%[.*%,)(.*)(%])','%2') end if longitude == "" then longitude = string.gsub(data[i],'(%[)(.*)(%,.*)','%2') end -- for error checking -- if latitude ~= nil then return "lat: " .. latitude .. " long: " .. longitude end coordinates = coordinates .. "," .. data[i] end end end coordinates = string.gsub(coordinates,'^%,','') coordinates = '[' .. coordinates .. "]" if marker == "y" then for i =1,table.getn(markers) do if markers[i] ~= nil and markers[i] ~= "" then if string.find(markers[i],'lat=%a+') == nil and string.find(markers[i],'lat=%u+') == nil then markerstext = markerstext .. markers[i] end end end end if mapframe == "y" and mask == "y" then output = output .. '\n<mapframe text="" latitude="' output = output .. latitude .. '" longitude="' .. longitude .. '" zoom="8" width="900" height="400" group="mask" class="no-icon"' output = output .. 'align="center">\n\t{"type": "FeatureCollection",\n\t\t"features": [\n\t\t\t{"type": "Feature",\n\t\t\t\t"geometry":' output = output .. '{"coordinates":\n\t[\n\t\t\t[[-3600,90], [3600, 90], [3600,-90], [-3600,-90], [-3600,90]],\n\t\t\t' output = output .. coordinates output = output .. '\n\t],\n\t\t\t"type":"Polygon"},\n\t\t\t"properties":{\n\t\t\t"title": "A mapmask",\n\t\t\t"description": "",' output = output .. '\n\t\t\t"fill": "#808080",\n\t\t\t"fill-opacity": 0.4,\n\t\t\t"stroke":"#000000",\n\t\t\t"stroke-width":1\n}\n}]}' output = output .. '\n</mapframe>' end if mapframe == "y" and mapshape == "y" then output = output .. '\n<mapframe text="" latitude="' output = output .. latitude .. '" longitude="' .. longitude .. '" zoom="8" width="900" height="400" group="mapshape" class="no-icon"' output = output .. ' align="center">\n\t{"type": "FeatureCollection",\n\t\t"features": [\n\t\t\t{"type": "Feature",' output = output .. '\n\t\t\t\t"geometry": {"coordinates":\n\t[\n\t\t\t' output = output .. coordinates output = output .. '\n\t],\n\t\t\t"type":"Polygon"},\n\t\t\t"properties":{\n\t\t\t"title": "A mapshape",\n\t\t\t"description":' output = output .. ' "",\n\t\t\t"fill": "#ffffb2",\n\t\t\t"stroke":"#888888",\n\t\t\t"stroke-width":3\n}\n}]}' output = output .. '\n</mapframe>' end if maplink == "y" and mask == "y" then output = output .. '\n<maplink text="" latitude="' .. latitude .. '" longitude="' .. longitude ..'" zoom="8" group="mask"' output = output .. ' class="no-icon" align="center">\n\t{"type": "FeatureCollection",\n\t\t"features": [\n\t\t\t{"type": "Feature"' output = output .. ',\n\t\t\t\t"geometry": {"coordinates":\n\t[\n\t\t\t[[-3600,90], [3600, 90], [3600,-90], [-3600,-90], [-3600,90]],\n\t\t\t' output = output .. coordinates output = output .. '\n\t],\n\t\t\t"type":"Polygon"},\n\t\t\t"properties":{\n\t\t\t"title": "A mask",\n\t\t\t"description":' output = output .. ' "",\n\t\t\t"fill": "#808080",\n\t\t\t"fill-opacity": 0.4,\n\t\t\t"stroke":"#000000",\n\t\t\t"stroke-width":1\n}\n}]}' output = output .. '\n</maplink>' end if maplink == "y" and mapshape == "y" then output = output .. '\n<maplink text="" latitude="' .. latitude .. '" longitude="' .. longitude .. '" zoom="8" group="mapshape"' output = output .. ' class="no-icon" align="center">\n\t{"type": "FeatureCollection",\n\t\t"features": [\n\t\t\t{"type": "Feature"' output = output .. ',\n\t\t\t\t"geometry": {"coordinates":\n\t[\n\t\t\t' output = output .. coordinates output = output .. '\n\t],\n\t\t\t"type":"Polygon"},\n\t\t\t"properties":{\n\t\t\t"title": "A mapshape",\n\t\t\t"description":' output = output .. ' "",\n\t\t\t"fill": "#ffffb2",\n\t\t\t"stroke":"#888888",\n\t\t\t"stroke-width":2\n}\n}]}' output = output .. '\n</maplink>' end if marker == "y" then output = output .. markerstext end return output end -- BBOX - bounding box function p.bbox(frame) local shape = "bbox" local coord1 = frame.args['coord1'] or "" local coord2 = frame.args['coord2'] or "" local coord3 = frame.args['coord3'] or "" local coord4 = frame.args['coord4'] or "" local lat1,long1,lat2,long2,lat3,long3,lat4,long4 = "","","","","","","","" local ids = frame.args['ids'] or "" local type = frame.args['fill'] or "line" if type ~= "poly" then type = "line" end local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end -- FUTURE USE local group = frame.args['group'] or 'bbox' local title = frame.args['title'] or 'A bbox' local description = frame.args['desc'] or '' local fill = frame.args['fill'] or "#ccef64" local stroke = frame.args['stroke'] or "#0000ff" checkhex(fill,stroke) local data = {} local coordinates = "" if ids == nil or ids == "" then if coord1 == nil or coord1 == "" then error("Missing argument coord1!") end if coord2 == nil or coord2 == "" then error("Missing argument coord2!") end if coord3 == nil or coord3 == "" then error("Missing argument coord3!") end if coord4 == nil or coord4 == "" then coord4 = coord1 end lat1 = string.gsub(coord1,"%,.*","") long1 = string.gsub(coord1,".*%,",'') lat2 = string.gsub(coord2,"%,.*","") long2 = string.gsub(coord2,".*%,",'') lat3 = string.gsub(coord3,"%,.*","") long3 = string.gsub(coord3,".*%,",'') lat4 = string.gsub(coord4,"%,.*","") long4 = string.gsub(coord4,".*%,",'') else ids = string.gsub(ids,"q","Q") ids = string.gsub(ids,"%s+","") -- do a lazy check for format of ids - "^[Q]%d+%,[Q]%d+$") local checker = "" checker = string.gsub(ids,"^[Q]%d+%$","") if checker == "" then error("ids requires at least 3 wikidata IDs") end checker = string.gsub(ids,"^[Q]%d+%,[Q]%d+$","") if checker == "" then error("ids requires at least 3 wikidata IDs") end ids = ids .. "," .. ids ----- insure 4th to work with even though they overlap ids = string.gsub(ids,"%,","@@@@@") local separator = "@@@@@" local counter = 1 local idsarray = {} for str in string.gmatch(ids,"([^"..separator.."]+)") do idsarray[counter] = str counter = counter + 1 end lat1,long1 = latitude(idsarray[1]),longitude(idsarray[1]) lat2,long2 = latitude(idsarray[2]),longitude(idsarray[2]) lat3,long3 = latitude(idsarray[3]),longitude(idsarray[3]) lat4,long4 = latitude(idsarray[4]),longitude(idsarray[4]) -- could be a duplicate of 1 if we added it in program if lat1 == "" or lat2 == "" or lat3 == "" or lat4 == "" then error("latitude not found in wikidata!") end if long1 == "" or long2 == "" or long3 == "" or long4 == "" then error("longitude not found in wikidata!") end end local bboxlat = {} local bboxlong = {} local bboxcoords = "" bboxlat[1] = lat1 bboxlong[1] = long1 bboxlat[2] = lat2 bboxlong[2] = long2 bboxlat[3] = lat3 bboxlong[3] = long3 bboxlat[4] = lat4 bboxlong[4] = long4 table.sort(bboxlat) table.sort(bboxlong) bboxcoords = '"bbox": [' .. bboxlong[1] .. "," .. bboxlat[1] .. "," .. bboxlong[4] .. "," ..bboxlat[4] .. "],\n\t\t" local lat = (bboxlat[1] + bboxlat[4])/2 local long = (bboxlong[1] + bboxlong[4])/2 local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) part1a = string.gsub(part1a,'"Feature",','"Feature",' .. bboxcoords) part2a = string.gsub(part2a,'"Feature",','"Feature",' .. bboxcoords) part3a = string.gsub(part3a,'"Feature",','"Feature",' .. bboxcoords) part4a = string.gsub(part4a,'"Feature",','"Feature",' .. bboxcoords) coordinates = coordinates .. "[" .. bboxlong[1] .. "," .. bboxlat[1] .. "],[" coordinates = coordinates .. bboxlong[4] .. "," .. bboxlat[1] .. "],[" coordinates = coordinates .. bboxlong[4] .. "," .. bboxlat[4] .. "],[" coordinates = coordinates .. bboxlong[1] .. "," .. bboxlat[4] .. "],[" .. bboxlong[1] .. "," .. bboxlat[1] .. "]" -- close coordinates = string.gsub(coordinates,'stroke-width":1','stroke-width":2') if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part4a .. coordinates .. part4b else coordinates = '[' .. coordinates .. ']},' coordinates = part3a .. coordinates .. part3b end else if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part2a .. coordinates .. part2b else coordinates = '[' .. coordinates .. ']},' coordinates = part1a .. coordinates .. part1b end end if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center BBox|lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end -- HALFCIRCLE function p.halfcircle(frame) local shape = "halfcircle" local shade = frame.args['shade'] or "left" if shade ~= "right" then shade = "left" end local id = frame.args['id'] or "" local lat,long = "","" local x,y = 0,0 if id == nil or id == "" then if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end lat = frame.args['lat'] long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end x = tonumber(lat) y = tonumber(long) local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end -- FUTURE USE if tonumber(lat) > 85.35 or tonumber(lat) < -85.35 then error("Latitude must be between 85.35 and -85.35!") end if tonumber(long) > 180 or tonumber(long) < -180 then error("Longitude must be between 180 and -180!") end local group = frame.args['group'] or 'halfcircle' local title = frame.args['title'] or 'A halfcircle' local description = frame.args['desc'] or '' local r = frame.args['radius'] or ".5" r = tonumber(r) if r > 10 then error("10 for radius is MAX") end if r <= 0 then error("radius has to be greater than 0") end local fill = frame.args['fill'] or "#ccef64" local stroke = frame.args['stroke'] or "#0000ff" checkhex(fill,stroke) local data = {} for i=1, 360 do data[i] = "" end -- local data2 = {} local coordinates = "" local ptx,pty,angle = 0,0,0 local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "poly" end local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) x = math.log(math.tan((90 + x) * math.pi/360)) / (math.pi/180) for i = 1,360, 1 do angle = i * math.pi / 180 ptx = x + r * math.cos( angle ) pty = y + r * math.sin( angle ) if tonumber(x) >= 10.5 then ptx = newlat(ptx) -- makes correction to make circle show up on map - upper latitudes end if tonumber(x) <= -10.5 then ptx = newlat(ptx) -- makes correction to make circle show up on map - lower latitudes end data[i] = '[' .. string.format("%.6f",pty) .. "," .. string.format("%.6f",ptx) .. ']' end if shade == "right" then for i = 1,180, 1 do coordinates = coordinates .. data[i] end coordinates = coordinates .. data[360] else for i = 180,360, 1 do coordinates = coordinates .. data[i] end coordinates = coordinates .. data[180] end coordinates = coordinates.gsub(coordinates,'%]%[','],[') coordinates = coordinates.gsub(coordinates,'%]@@@@@%[','],\n[') coordinates = coordinates.gsub(coordinates,'@@@@@%,',',') coordinates = "[" .. coordinates .. "]," if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = string.gsub(coordinates,'%]%,$',']]},') coordinates = part4a .. string.gsub(coordinates,'^%[','[[') .. part4b else coordinates = string.gsub(coordinates,'%]%,$',']},') coordinates = part3a .. coordinates .. part3b end else if type == "poly" then coordinates = string.gsub(coordinates,'%]%,$',']]},') coordinates = part2a .. string.gsub(coordinates,'^%[','[[') .. part2b else coordinates = string.gsub(coordinates,'%]%,$',']},') coordinates = part1a .. coordinates .. part1b end end if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=HalfCircle|lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end -- Decagon -- 10 sided shape function p.decagon(frame) local shape = "decagon" local id = frame.args['id'] or "" local lat,long = "","" if id == nil or id == "" then if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end lat = frame.args['lat'] long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end local x = tonumber(lat) local y = tonumber(long) local latitude = string.format("%.6f",lat) local longitude = string.format("%.6f",long) local group = frame.args['group'] or 'decagon' local title = frame.args['title'] or 'A decagon' local description = frame.args['desc'] or '' local radius = frame.args['radius'] or ".5" radius = tonumber(radius) if radius > 10 then error("10 for radius is MAX") end if radius <= 0 then error("radius has to be greater than 0") end local fill = frame.args['fill'] or "#ccef64" local stroke = frame.args['stroke'] or "#0000ff" checkhex(fill,stroke) local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end local ra,angle,ptx,pty = 0,0,0,0 local compass = {} local points = {} local coordinates = "" local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "poly" end local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) x = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) compass = positions(shape) for i = 1,table.getn(compass), 1 do angle = compass[i] * math.pi / 180 ptx = x + radius * math.cos( angle ) pty = y + radius * math.sin( angle ) ptx = newlat(ptx) points[i] = '[' .. string.format("%.6f",pty) .. pty .. "," .. string.format("%.6f",ptx) .. "]," end for i = 1,table.getn(points), 1 do coordinates = coordinates .. points[i] .. "\n" end coordinates = coordinates .. points[1] if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = string.gsub(coordinates,'%]%,$',']]]},') coordinates = part4a .. string.gsub(coordinates,'^%[','[[[') .. part4b else coordinates = string.gsub(coordinates,'%]%,$',']]},') coordinates = part3a .. string.gsub(coordinates,'^%[','[[') .. part3b end else if type == "poly" then coordinates = string.gsub(coordinates,'%]%,$',']]]},') coordinates = part2a .. string.gsub(coordinates,'^%[','[[[') .. part2b else coordinates = string.gsub(coordinates,'%]%,$',']]},') coordinates = part1a .. string.gsub(coordinates,'^%[','[[') .. part1b end end if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Decagon|lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end -- Annulus -- ANNULUS - 2 circles forming a donut shape function p.annulus(frame) local shape = "annulus" local id = frame.args['id'] or "" local lat,long = "","" local x,y = 0,0 if id == nil or id == "" then if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end lat = frame.args['lat'] long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end x = string.format("%.6f",lat) y = string.format("%.6f",long) local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end -- FUTURE USE if tonumber(lat) > 85.35 or tonumber(lat) < -85.35 then error("Latitude must be between 85.35 and -85.35!") end if tonumber(long) > 180 or tonumber(long) < -180 then error("Longitude must be between 180 and -180!") end -- END if local group = frame.args['group'] or 'annulus' local title = frame.args['title'] or 'An annulus' local description = frame.args['desc'] or '' local r = frame.args['radius'] or ".5" r = tonumber(r) if r > 10 then error("10 for radius is MAX") end if r <= 0 then error("radius has to be greater than 0") end local r2 = r * .65 local fill = frame.args['fill'] or "#ccef64" local stroke = frame.args['stroke'] or "#0000ff" checkhex(fill,stroke) local data = {} local data2 = {} local coordinates = "" local coordinates2 = "" local ptx,pty,angle,ptx2,pty2 = 0,0,0,0,0 local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "poly" end local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) if tonumber(x) >= 10.5 then x = math.log(math.tan((90 + x) * math.pi/360)) / (math.pi/180) elseif tonumber(x) <= -10.5 then x = math.log(math.tan((90 + x) * math.pi/360)) / (math.pi/180) end for i = 1, 360 do angle = i * math.pi / 180 ptx = x + r * math.cos( angle ) pty = y + r * math.sin( angle ) ptx2 = x + r2 * math.cos( angle ) pty2 = y + r2 * math.sin( angle ) if tonumber(x) >= 10.5 then ptx = newlat(ptx) ptx2 = newlat(ptx2) end if tonumber(x) <= -10.5 then ptx = newlat(ptx) ptx2 = newlat(ptx2) end data[i] = '[' .. string.format("%.6f",pty) .. "," .. string.format("%.6f",ptx) .. ']' data2[i] = '[' .. string.format("%.6f",pty2) .. "," .. string.format("%.6f",ptx2) .. ']' end for i = 5,359, 5 do data[i] = data[i] .. "@@@@@" data2[i] = data2[i] .. "@@@@@" end -- cycle through array and build single string of all coordinates to be output for i = 1,360, 1 do coordinates = coordinates .. data[i] coordinates2 = coordinates2 .. data2[i] end coordinates = coordinates.gsub(coordinates,'%]%[','],[') coordinates2 = coordinates2.gsub(coordinates2,'%]%[','],[') coordinates = coordinates.gsub(coordinates,'%]@@@@@%[','],\n[') coordinates2 = coordinates2.gsub(coordinates2,'%]@@@@@%[','],\n[') coordinates = "[" .. coordinates .. ',' .. data[1] .. "]," coordinates2 = "[" .. coordinates2 .. ',' .. data2[1] .. "]],[" coordinates = coordinates2 .. coordinates coordinates = string.gsub(coordinates,'%]%]%],%[%[%[',']],[[') if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = string.gsub(coordinates,'%]%,$',']]},') coordinates = part4a .. string.gsub(coordinates,'^%[','[[') .. part4b else coordinates = string.gsub(coordinates,'%]%,$',']]},') coordinates = string.gsub(coordinates,'^%[','[[') coordinates = part3a .. coordinates .. part3b coordinates = string.gsub(coordinates,'LineString','MultiLineString') end else if type == "poly" then coordinates = string.gsub(coordinates,'%]%,$',']]},') coordinates = part2a .. string.gsub(coordinates,'^%[','[[') .. part2b else coordinates = string.gsub(coordinates,'%]%,$',']]},') coordinates = string.gsub(coordinates,'^%[','[[') coordinates = part1a .. coordinates .. part1b coordinates = string.gsub(coordinates,'LineString','MultiLineString') end end if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Annulus|lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end function p.rhombus(frame) local shape = "rhombus" local direction = frame.args['direction'] or "vertical" if direction ~= "horizontal" then direction = "vertical" end local id = frame.args['id'] or "" local lat,long = "","" if id == nil or id == "" then if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end lat = frame.args['lat'] long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end local group = frame.args['group'] or 'rhombus' local title = frame.args['title'] or 'A rhombus' local description = frame.args['desc'] or '' local r = frame.args['radius'] or ".5" r = tonumber(r) if r > 10 then error("10 for radius is MAX") end if r <= 0 then error("r has to be greater than 0") end local r2 = r * 2 local fill = frame.args['fill'] or "#ccef64" local stroke = frame.args['stroke'] or "#0000ff" checkhex(fill,stroke) local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end local coordinates = "" local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "poly" end local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) lat = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) local angle1,angle2,angle3,angle4 = 0,0,0,0 local ptx,ptx2,ptx3,ptx4 = 0,0,0,0 local pty,pty2,pty3,pty4 = 0,0,0,0 local a,b,c,d = 0,0,0,0 if direction == "horizontal" then a,b,c,d = 360,90,180,270 else a,b,c,d = 90,180,270,360 end angle1 = a * math.pi / 180 ptx = lat + r * math.cos( angle1 ) pty = long + r * math.sin( angle1 ) angle2 = b * math.pi /180 ptx2 = lat + r2 * math.cos( angle2 ) pty2 = long + r2 * math.sin( angle2 ) angle3 = c * math.pi /180 ptx3 = lat + r * math.cos( angle3 ) pty3 = long + r * math.sin( angle3 ) angle4 = d * math.pi /180 ptx4 = lat + r2 * math.cos( angle4 ) pty4 = long + r2 * math.sin( angle4 ) ptx,pty = string.format("%.6f",newlat(ptx)),string.format("%.6f",pty) ptx2,pty2 = string.format("%.6f",newlat(ptx2)),string.format("%.6f",pty2) ptx3,pty3 = string.format("%.6f",newlat(ptx3)),string.format("%.6f",pty3) ptx4,pty4 = string.format("%.6f",newlat(ptx4)),string.format("%.6f",pty4) lat,long = string.format("%.6f",newlat(lat)),string.format("%.6f",long) coordinates = "[" .. pty .. "," .. ptx .. "],[" .. pty2 .. "," .. ptx2 .. "],[" .. pty3 .. "," .. ptx3 .. "],[".. pty4 .. "," .. ptx4 .. "],[" .. pty .. "," .. ptx .. "]" if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part4a .. coordinates .. part4b else coordinates = '[' .. coordinates .. ']},' coordinates = part3a .. coordinates .. part3b end else if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part2a .. coordinates .. part2b else coordinates = '[' .. coordinates .. ']},' coordinates = part1a .. coordinates .. part1b end end if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Rhombus|lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end -- WEDGE function p.wedge(frame) local shape = "wedge" local id = frame.args['id'] or "" local lat,long = "","" if id == nil or id == "" then if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end lat = frame.args['lat'] long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end local latitude = lat local longitude = long local group = frame.args['group'] or 'wedge' local title = frame.args['title'] or 'A wedge' local description = frame.args['desc'] or '' local r = frame.args['radius'] or ".5" r = tonumber(r) if r > 10 then error("10 for length is MAX") end if r <= 0 then error("r has to be greater than 0") end local r2 = r * 2 local fill = frame.args['fill'] or "#ccef64" local stroke = frame.args['stroke'] or "#0000ff" checkhex(fill,stroke) local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end local coordinates = "" local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "poly" end local direction = frame.args['direction'] or "1" direction = string.gsub(direction,'%..*','') direction = tonumber(direction) if direction <= 0 or direction >= 9 then error("Direction should be a number from 1 to 8!") end local angle1,angle2,angle3 = 0,0,0 local ptx,ptx2,ptx3 = 0,0,0 local pty,pty2,pty3 = 0,0,0 local factor = {'340,360,20','25,45,65','70,90,110','115,135,155','160,180,200','205,225,245','250,270,290','295,315,335'} local a = string.gsub(factor[direction],'(%d+)(,)(%d+)(,)(%d+)','%1') local b = string.gsub(factor[direction],'(%d+)(,)(%d+)(,)(%d+)','%3') local c = string.gsub(factor[direction],'(%d+)(,)(%d+)(,)(%d+)','%5') local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) lat = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) angle = b * math.pi / 180 ptx = lat + (r*.02) * math.cos( angle ) pty = long + (r*.02) * math.sin( angle ) lat,long = string.format("%.6f",newlat(ptx)),string.format("%.6f",pty) lat = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) angle1 = a * math.pi / 180 ptx = lat + r2 * math.cos( angle1 ) pty = long + r2 * math.sin( angle1 ) angle2 = b * math.pi /180 -- used to compute center of wedge ptx2 = lat + r * math.cos( angle2 ) pty2 = long + r * math.sin( angle2 ) angle3 = c * math.pi /180 ptx3 = lat + r2 * math.cos( angle3 ) pty3 = long + r2 * math.sin( angle3 ) ptx,pty = string.format("%.6f",newlat(ptx)),string.format("%.6f",pty) ptx2,pty2 = string.format("%.6f",newlat(ptx2)),string.format("%.6f",pty2) ptx3,pty3 = string.format("%.6f",newlat(ptx3)),string.format("%.6f",pty3) lat,long = string.format("%.6f",newlat(lat)),string.format("%.6f",long) coordinates = "[" .. pty .. "," .. ptx .. "],[" .. pty3 .. "," .. ptx3 .. "],[" .. long .. "," .. lat .. "],[" .. pty .. "," .. ptx .. "]" if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part4a .. coordinates .. part4b else coordinates = '[' .. coordinates .. ']},' coordinates = part3a .. coordinates .. part3b end else if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part2a .. coordinates .. part2b else coordinates = '[' .. coordinates .. ']},' coordinates = part1a .. coordinates .. part1b end end if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Wedge|lat=' .. ptx2 .. "|long=" .. pty2 .. '}}\n' coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Wedge|lat=' .. latitude .. "|long=" .. longitude .. '}}\n' end return coordinates end -- CROSS function p.cross(frame) local shape = "cross" local id = frame.args['id'] or "" local lat,long = "","" if id == nil or id == "" then if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end lat = frame.args['lat'] long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end local group = frame.args['group'] or 'cross' local title = frame.args['title'] or 'A Cross' local description = frame.args['desc'] or '' local r = frame.args['radius'] or ".5" r = tonumber(r) if r > 10 then error("10 for length is MAX") end if r <= 0 then error("r has to be greater than 0") end local r2 = r * .25 local fill = frame.args['fill'] or "#ff0000" local stroke = frame.args['stroke'] or "#ffffff" checkhex(fill,stroke) local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end local coordinates = "" local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "poly" end local angle = 0 local compass = positions(shape) local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) lat = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) for i = 1,table.getn(compass), 1 do angle = compass[i] * math.pi / 180 if compass[i] == 45 or compass[i] == 135 or compass[i] == 225 or compass[i] == 315 then ptx = lat + r2 * math.cos( angle ) pty = long + r2 * math.sin( angle ) else ptx = lat + r * math.cos( angle ) pty = long + r * math.sin( angle ) end ptx,pty = string.format("%.6f",newlat(ptx)),string.format("%.6f",pty) coordinates = coordinates .. "[" .. pty .. "," .. ptx .. "]@@@@@" end coordinates = coordinates .. string.gsub(coordinates,'@@@@@.*','') coordinates = string.gsub(coordinates,'@@@@@',',') if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part4a .. coordinates .. part4b else coordinates = '[' .. coordinates .. ']},' coordinates = part3a .. coordinates .. part3b end else if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part2a .. coordinates .. part2b else coordinates = '[' .. coordinates .. ']},' coordinates = part1a .. coordinates .. part1b end end if marker == "yes" or marker == "y" then lat = string.format("%.6f",newlat(lat)) coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Cross|lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end -- X_SHAPE function p.x_shape(frame) local shape = "xshape" local id = frame.args['id'] or "" local lat,long = "","" if id == nil or id == "" then if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end lat = frame.args['lat'] long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end local group = frame.args['group'] or 'xshape' local title = frame.args['title'] or 'An X' local description = frame.args['desc'] or '' local r = frame.args['radius'] or ".5" r = tonumber(r) if r > 10 then error("10 for length is MAX") end if r <= 0 then error("r has to be greater than 0") end local r2 = r * .375 local fill = frame.args['fill'] or "#ccef64" local stroke = frame.args['stroke'] or "#0000ff" checkhex(fill,stroke) local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end local coordinates = "" local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "poly" end local angle = 0 local compass = positions(shape) local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) lat = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) for i = 1,table.getn(compass), 1 do angle = compass[i] * math.pi / 180 if compass[i] == 90 or compass[i] == 180 or compass[i] == 270 or compass[i] == 360 then ptx = lat + r2 * math.cos( angle ) pty = long + r2 * math.sin( angle ) else ptx = lat + r * math.cos( angle ) pty = long + r * math.sin( angle ) end ptx,pty = string.format("%.6f",newlat(ptx)),string.format("%.6f",pty) coordinates = coordinates .. "[" .. pty .. "," .. ptx .. "]@@@@@" end coordinates = coordinates .. string.gsub(coordinates,'@@@@@.*','') coordinates = string.gsub(coordinates,'@@@@@',',') if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part4a .. coordinates .. part4b else coordinates = '[' .. coordinates .. ']},' coordinates = part3a .. coordinates .. part3b end else if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part2a .. coordinates .. part2b else coordinates = '[' .. coordinates .. ']},' coordinates = part1a .. coordinates .. part1b end end if marker == "yes" or marker == "y" then lat = string.format("%.6f",newlat(lat)) coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center X|lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end -- BAR -- only creates a LineString with thickness of 4 function p.bar(frame) local shape = "bar" local id = frame.args['id'] or "" local lat,long = "","" if id == nil or id == "" then if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end lat = frame.args['lat'] long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end local direction = frame.args['direction'] or "horizontal" if direction ~= "horizontal" then direction = "vertical" end local group = frame.args['group'] or 'bar' local title = frame.args['title'] or 'A bar' local description = frame.args['desc'] or '' local r = frame.args['radius'] or ".5" r = tonumber(r) if r > 40 then error("40 for length is MAX") end -- 40 for bar shape only if r <= 0 then error("r has to be greater than 0") end -- local fill = frame.args['fill'] or "#000000" -- fill not used - keep anyhow for time being local fill = "#000000" local stroke = frame.args['stroke'] or "#000000" -- change color with stroke checkhex(fill,stroke) local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end local coordinates = "" local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "line" end local angle = 0 local compass = positions(shape) local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) lat = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) for i = 1,table.getn(compass), 1 do if direction == "vertical" then compass[i] = compass[i] + 90 end angle = compass[i] * math.pi / 180 ptx = lat + r * math.cos( angle ) pty = long + r * math.sin( angle ) ptx,pty = string.format("%.6f",newlat(ptx)),string.format("%.6f",pty) coordinates = coordinates .. "[" .. pty .. "," .. ptx .. "]@@@@@" end coordinates = string.gsub(coordinates,'@@@@@',',') if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part4a .. coordinates .. part4b else coordinates = '[' .. coordinates .. ']},' coordinates = part3a .. coordinates .. part3b end else if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part2a .. coordinates .. part2b else coordinates = '[' .. coordinates .. ']},' coordinates = part1a .. coordinates .. part1b end end coordinates = string.gsub(coordinates,'stroke%-width%":1','stroke-width":3') if marker == "yes" or marker == "y" then lat = string.format("%.6f",newlat(lat)) coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Bar | lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end -- DOT -- creates a grayish dot function p.dot(frame) local shape = "dot" local id = frame.args['id'] or "" local lat,long = "","" if id == nil or id == "" then if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end lat = frame.args['lat'] long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end local group = frame.args['group'] or 'dot' local title = frame.args['title'] or 'A dot' local description = frame.args['desc'] or '' local size = "30" -- fixed size no longer a parameter -- frame.args['size'] or "10" -- default of 1 -- if size == nil or size == "" then size = "10" end -- just a check -- size = string.gsub(size,'%..*','') -- if size == "" then error("size should currently be a whole number!") end -- size = tonumber(size) -- if size < 10 or size > 30 then error("The Dot size is currently limited from 10 to 30 for use!") end local fill = frame.args['fill'] or "#000000" -- no longer a parameter but keeping rest of code consistent local stroke = frame.args['stroke'] or "#000000" -- can change the color using stroke checkhex(fill,stroke) local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end local coordinates = "" local type = frame.args['type'] or "line" -- force default line for LineString if type ~= "line" then type = "line" end lat = string.format("%.6f",lat) long = string.format("%.6f",long) local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) coordinates = coordinates .. "[" .. long .. "," .. lat .. "],[" .. long .. "," .. lat .. "]" if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part4a .. coordinates .. part4b else coordinates = '[' .. coordinates .. ']},' coordinates = part3a .. coordinates .. part3b end else if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part2a .. coordinates .. part2b else coordinates = '[' .. coordinates .. ']},' coordinates = part1a .. coordinates .. part1b end end -- Make thickness of size and add opacity fixed at 30 and 0.4 respectively coordinates = string.gsub(coordinates,'stroke%-width%":1','stroke-width":' .. size .. ',\n\t\t"stroke-opacity": 0.4') if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Dot | lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end -- KEYSTONE function p.keystone(frame) local shape = "keystone" local id = frame.args['id'] or "" local lat,long = "","" if id == nil or id == "" then if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end lat = frame.args['lat'] long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end local group = frame.args['group'] or 'keystone' local title = frame.args['title'] or 'A keystone' local description = frame.args['desc'] or '' local r = frame.args['radius'] or ".5" r = tonumber(r) if r > 10 then error("10 for length is MAX") end if r <= 0 then error("r has to be greater than 0") end local r2 = r * .65 local fill = frame.args['fill'] or "#ccef64" local stroke = frame.args['stroke'] or "#0000ff" checkhex(fill,stroke) local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end local coordinates = "" local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "poly" end local angle = 0 local compass = positions(shape) local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) lat = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) for i = 1,table.getn(compass), 1 do angle = compass[i] * math.pi / 180 if compass[i] == 26 or compass[i] == 334 then ptx = lat + r2 * math.cos( angle ) pty = long + r2 * math.sin( angle ) else ptx = lat + r * math.cos( angle ) pty = long + r * math.sin( angle ) end ptx,pty = string.format("%.6f",newlat(ptx)),string.format("%.6f",pty) coordinates = coordinates .. "[" .. pty .. "," .. ptx .. "]@@@@@" end coordinates = coordinates .. string.gsub(coordinates,'@@@@@.*','') coordinates = string.gsub(coordinates,'@@@@@',',') if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part4a .. coordinates .. part4b else coordinates = '[' .. coordinates .. ']},' coordinates = part3a .. coordinates .. part3b end else if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part2a .. coordinates .. part2b else coordinates = '[' .. coordinates .. ']},' coordinates = part1a .. coordinates .. part1b end end if marker == "yes" or marker == "y" then lat = string.format("%.6f",newlat(lat)) coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Keystone | lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end -- COG -- gear shape function p.cog(frame) local shape = "cog" local id = frame.args['id'] or "" local lat,long = "","" if id == nil or id == "" then if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end lat = frame.args['lat'] long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end local group = frame.args['group'] or 'cog' local title = frame.args['title'] or 'A cog' local description = frame.args['desc'] or '' local r = frame.args['radius'] or ".5" r = tonumber(r) if r > 10 then error("10 for length is MAX") end if r <= 0 then error("r has to be greater than 0") end local r2 = r * .85 local r3 = r * .30 local fill = frame.args['fill'] or "#ccef64" local stroke = frame.args['stroke'] or "#0000ff" checkhex(fill,stroke) local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end local coordinates = "" local coordinates2 = "" local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "poly" end local angle = 0 local compass = positions(shape) local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) lat = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) for i = 1,table.getn(compass), 1 do angle = (compass[i] - 33.5) * math.pi / 180 ptx = lat + r2 * math.cos( angle ) pty = long + r2 * math.sin( angle ) ptx,pty = string.format("%.6f",newlat(ptx)),string.format("%.6f",pty) coordinates = coordinates .. "[" .. pty .. "," .. ptx .. "]@@@@@" angle = (compass[i] - 11) * math.pi / 180 ptx = lat + r2 * math.cos( angle ) pty = long + r2 * math.sin( angle ) ptx,pty = string.format("%.6f",newlat(ptx)),string.format("%.6f",pty) coordinates = coordinates .. "[" .. pty .. "," .. ptx .. "]@@@@@" angle = (compass[i] -11.25) * math.pi / 180 ptx = lat + r * math.cos( angle ) pty = long + r * math.sin( angle ) ptx,pty = string.format("%.6f",newlat(ptx)),string.format("%.6f",pty) coordinates = coordinates .. "[" .. pty .. "," .. ptx .. "]@@@@@" angle = (compass[i] + 11.25) * math.pi / 180 ptx = lat + r * math.cos( angle ) pty = long + r * math.sin( angle ) ptx,pty = string.format("%.6f",newlat(ptx)),string.format("%.6f",pty) coordinates = coordinates .. "[" .. pty .. "," .. ptx .. "]@@@@@" end coordinates = coordinates .. string.gsub(coordinates,'@@@@@.*','') coordinates = string.gsub(coordinates,'@@@@@',',') compass = positions('quad') for i = 1,table.getn(compass), 1 do angle = compass[i] * math.pi / 180 ptx = lat + r3 * math.cos( angle ) pty = long + r3 * math.sin( angle ) ptx,pty = string.format("%.6f",newlat(ptx)),string.format("%.6f",pty) coordinates2 = coordinates2 .. "[" .. pty .. "," .. ptx .. "]@@@@@" end coordinates2 = coordinates2 .. string.gsub(coordinates2,'@@@@@.*','') coordinates2 = string.gsub(coordinates2,'@@@@@',',') coordinates = coordinates .. "],[" .. coordinates2 if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part4a .. coordinates .. part4b else coordinates = '[[' .. coordinates .. ']]},' coordinates = part3a .. coordinates .. part3b coordinates = string.gsub(coordinates,'LineString','MultiLineString') end else if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part2a .. coordinates .. part2b else coordinates = '[[' .. coordinates .. ']]},' coordinates = part1a .. coordinates .. part1b coordinates = string.gsub(coordinates,'LineString','MultiLineString') end end if marker == "yes" or marker == "y" then lat = string.format("%.6f",newlat(lat)) coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Cog | lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end -- MULTIPOINT function p.multipoint(frame) local shape = "multipoint" local ids = frame.args['ids'] or "" ids = string.gsub(ids,"%,+","@") ids = string.gsub(ids,"%s+",'') ids = string.gsub(ids,"%@+",'@') local coords = frame.args['coords'] or "" coords = string.gsub(coords,"%@+","@") -- multiple @'s to a @ local separator = "@" local coordsx = {} local coordinates = "" local count = 1 local lat = "" local long = "" if ids == nil or ids == "" then if coords == "" or coords == nil then error("Missing argument coords!") end count = 1 for str in string.gmatch(coords,"([^"..separator.."]+)") do if str ~= nil and str ~= "" then lat = string.gsub(str,",.*",'') long = string.gsub(str,"^.*,",'') if tonumber( lat ) > 90 or tonumber( lat ) < -90 then error("Latitudes must be between 90 and -90!") end if tonumber(long) > 180 or tonumber(long) < -180 then error("Longitudes must be between 180 and -180!") end coordsx[count] = string.format("%.6f",long) .. "," .. string.format("%.6f",lat) count = count + 1 end end else count = 1 for str in string.gmatch(ids,"([^"..separator.."]+)") do if str ~= nil and str ~= "" then str = checkid(str) lat = latitude(str) long = longitude(str) coordsx[count] = string.format("%.6f",long) .. "," .. string.format("%.6f",lat) count = count + 1 end end end local group = frame.args['group'] or 'multipoint' local title = frame.args['title'] or 'A multipoint' local description = frame.args['desc'] or "" local color = frame.args['color'] or "#ffccaa" if string.len(color) ~= 7 then error("Incorrect length for argument color!") end if string.gsub(color,"#[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]","") ~= "" then error("Incorrect hexidecimal format for argument color!") end local symbol = frame.args['symbol'] or "star" local mapframe = frame.args['mapframe'] or "no" if mapframe == nil or mapframe == "" then mapframe = "no" end local maplink = frame.args['maplink'] or "yes" local part1a = '<maplink text="" zoom="5" latitude="' .. lat .. '" longitude="' .. long .. '" group="cities" class=no-icon>\n' part1a = part1a .. '\t{\n\t"type": "Feature",\n\t\t"geometry": { "type":"MultiPoint", "coordinates":\n\t\t\t' local part1b = '\n\t"properties": {\n\t\t"title": "' .. title .. '",\n\t\t' part1b = part1b .. '"description": "' .. description .. '",\n\t\t"marker-color": "' .. color .. '",\n\t\t' part1b = part1b .. '"marker-size": "medium",\n\t\t"marker-symbol": "' .. symbol .. '",\n\t\t\t' part1b = part1b .. '}\n}</maplink>\n' local part2a = '<mapframe text="" latitude="' .. lat .. '" longitude="' .. long .. '" ' part2a = part2a .. 'zoom="5" group="' .. group .. '" width="600" height="400" >\n{"type": "FeatureCollection",\n\t"features":' part2a = part2a .. '[\n\t\t{\n\t\t"type": "Feature",\n\t\t"geometry": {"coordinates":\n\t\t' local part2b = '\n\t\t"type":"MultiPoint"},\n\t"properties":{\n\t\t"title": "' .. title .. '",\n' part2b = part2b .. '\t\t"description": "' .. description .. '",\n\t\t"marker-color": "' .. color .. '",\n\t\t' part2b = part2b .. '"marker-size": "medium",\n\t\t"marker-symbol": "' .. symbol .. '",\n\t\t\t' part2b = part2b .. '\n}\n}]}\n</mapframe>\n' for i = 1,table.getn(coordsx), 1 do coordinates = coordinates .. "[" .. coordsx[i] .. "]@@@@@" end coordinates = string.gsub(coordinates,"@@@@@",",") coordinates = string.gsub(coordinates, '%,$','') if mapframe == "y" or mapframe == "yes" then coordinates = '[' .. coordinates .. '],' coordinates = part2a .. coordinates .. part2b else coordinates = '[' .. coordinates .. ']},' coordinates = part1a .. coordinates .. part1b end return coordinates end -- ARROW -- only creates a Polygon with a stroke thickness of 3 and fill-opacity of 1.0 function p.arrow(frame) local shape = "arrow" local id = frame.args['id'] or "" local lat,long = "","" if id == nil or id == "" then if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end lat = frame.args['lat'] long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end local latitude = lat -- for marker points to local longitude = long -- for marker points to local direction = frame.args['direction'] or 1 if direction == nil or direction == "" then direction = "1" end if string.gsub(direction,"[1-8]","") ~= "" then error("Numbers 1-8 only in direction!") end if tonumber(direction) < 1 or tonumber(direction) > 8 then direction = "1" end direction = tonumber(direction) local group = frame.args['group'] or 'arrow' local title = frame.args['title'] or 'An arrow' local description = frame.args['desc'] or '' local r = frame.args['radius'] or ".5" r = tonumber(r) if r > 10 then error("10 for length is MAX") end -- exception for bar only if r <= 0 then error("r has to be greater than 0") end local r2 = r * .50 local r3 = r * .475 local fill = frame.args['fill'] or "#000000" -- fill arg - default is black if fill == nil or fill == "" then fill = "#000000" end local stroke = frame.args['stroke'] or "#000000" -- stroke arg - default is black if stroke == nil or stroke == "" then stroke = fill end checkhex(fill,stroke) local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end local coordinates = "" local type = frame.args['type'] or "poly" -- default is polygon if type ~= "poly" then type = "line" end local angle,ptx,pty = 0,0,0 local compass = positions(shape) local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) lat = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) angle = (compass[direction]) * math.pi / 180 ptx = lat - (r*1.05) * math.cos( angle ) pty = long - (r*1.05) * math.sin( angle ) lat,long = string.format("%.6f",newlat(ptx)),string.format("%.6f",pty) lat = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) local matrix = {} -- 1 angle = (compass[direction] - 18) * math.pi / 180 ptx = lat + r2 * math.cos( angle ) pty = long + r2 * math.sin( angle ) ptx,pty = string.format("%.6f",newlat(ptx)),string.format("%.6f",pty) matrix[1] = "[" .. pty .. "," .. ptx .. "]@@@@@" -- 2 angle = compass[direction] * math.pi / 180 ptx = lat + r * math.cos( angle ) pty = long + r * math.sin( angle ) ptx,pty = string.format("%.6f",newlat(ptx)),string.format("%.6f",pty) matrix[2] = "[" .. pty .. "," .. ptx .. "]@@@@@" --3 angle = (compass[direction] + 18) * math.pi / 180 ptx = lat + r2 * math.cos( angle ) pty = long + r2 * math.sin( angle ) ptx,pty = string.format("%.6f",newlat(ptx)),string.format("%.6f",pty) matrix[3] = "[" .. pty .. "," .. ptx .. "]@@@@@" -- 4 angle = (compass[direction] - 2) * math.pi / 180 ptx = lat + r3 * math.cos( angle ) pty = long + r3 * math.sin( angle ) ptx,pty = string.format("%.6f",newlat(ptx)),string.format("%.6f",pty) matrix[4] = "[" .. pty .. "," .. ptx .. "]@@@@@" -- 5 angle = (compass[direction] + 181) * math.pi / 180 ptx = lat + r * math.cos( angle ) pty = long + r * math.sin( angle ) ptx,pty = string.format("%.6f",newlat(ptx)),string.format("%.6f",pty) matrix[5] = "[" .. pty .. "," .. ptx .. "]@@@@@" -- 6 angle = (compass[direction] + 179) * math.pi / 180 ptx = lat + r * math.cos( angle ) pty = long + r * math.sin( angle ) ptx,pty = string.format("%.6f",newlat(ptx)),string.format("%.6f",pty) matrix[6] = "[" .. pty .. "," .. ptx .. "]@@@@@" -- 7 angle = (compass[direction] + 2) * math.pi / 180 ptx = lat + r3 * math.cos( angle ) pty = long + r3 * math.sin( angle ) ptx,pty = string.format("%.6f",newlat(ptx)),string.format("%.6f",pty) matrix[7] = "[" .. pty .. "," .. ptx .. "]@@@@@" for i=1,table.getn(matrix),1 do coordinates = coordinates .. matrix[i] end coordinates = coordinates .. matrix[1] coordinates = string.gsub(coordinates,'@@@@@$','') coordinates = string.gsub(coordinates,'@@@@@',',') lat = string.format("%.6f",newlat(lat)) if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part4a .. coordinates .. part4b else coordinates = '[' .. coordinates .. ']},' coordinates = part3a .. coordinates .. part3b end else if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part2a .. coordinates .. part2b else coordinates = '[' .. coordinates .. ']},' coordinates = part1a .. coordinates .. part1b end end -- Make thickness of 3 coordinates = string.gsub(coordinates,'stroke%-width%":1','fill-opacity": 1.0,\n\t\t"stroke-width":4') if marker == "yes" or marker == "y" then lat = string.format("%.6f",lat) coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Arrow | lat=' .. lat .. "|long=" .. long .. '}}\n' .. '\n* {{marker|type=vicinity|name=Points To | lat=' .. latitude .. "|long=" .. longitude .. '}}\n' end return coordinates end -- PENTAGRAM - Line String only -- Poly fills in the tips - lines still there function p.pentagram(frame) local shape = "pentagram" local id = frame.args['id'] or "" local lat,long = "","" if id == nil or id == "" then if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end lat = frame.args['lat'] long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end local x = tonumber(lat) local y = tonumber(long) local latitude = string.format("%.6f",lat) local longitude = string.format("%.6f",long) local group = frame.args['group'] or 'pentagram' local title = frame.args['title'] or 'A pentagram' local description = frame.args['desc'] or '' local r = frame.args['radius'] or ".5" if r == nil or r == "" then r = "0.5" end r = tonumber(r) if r > 10 then error("10 for radius is MAX") end if r <= 0 then error("radius has to be greater than 0") end local fill = frame.args['fill'] or "#000000" local stroke = frame.args['stroke'] or "#0000ff" checkhex(fill,stroke) local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end -- FUTURE USE local angle,ptx,pty = 0,0,0 local compass = {} local points = {} local coordinates = "" local type = frame.args['type'] or "line" -- default line for LineString if type ~= "poly" then type = "line" end local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) x = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) compass = positions(shape) for i = 1,table.getn(compass), 1 do angle = compass[i] * math.pi / 180 ptx = x + r * math.cos( angle ) pty = y + r * math.sin( angle ) ptx = newlat(ptx) points[i] = '[' .. string.format("%.6f",pty) .. "," .. string.format("%.6f",ptx) .. "]," end for i = 1,table.getn(points), 1 do coordinates = coordinates .. points[i] .. "\n" end coordinates = coordinates .. points[1] if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = string.gsub(coordinates,'%]%,$',']]]},') coordinates = part4a .. string.gsub(coordinates,'^%[','[[[') .. part4b else coordinates = string.gsub(coordinates,'%]%,$',']]},') coordinates = part3a .. string.gsub(coordinates,'^%[','[[') .. part3b end else if type == "poly" then coordinates = string.gsub(coordinates,'%]%,$',']]]},') coordinates = part2a .. string.gsub(coordinates,'^%[','[[[') .. part2b else coordinates = string.gsub(coordinates,'%]%,$',']]},') coordinates = part1a .. string.gsub(coordinates,'^%[','[[') .. part1b end end if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Pentagram|lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end -- MULTILINE - draw lines from pairs of coordinates function p.multiline(frame) local shape = "multiline" local ids = frame.args['ids'] or "" ids = string.gsub(ids,"%,+","@") ids = string.gsub(ids,"%s+",'') ids = string.gsub(ids,"%@+",'@') local coords = frame.args['coords'] or "" coords = string.gsub(coords,"%s+",'') coords = string.gsub(coords,"%@+","@") -- multiple @'s to a @ local separator = "@" local coordsx = {} local coordinates = "" local count = 1 local lat = "" local long = "" local type = "line" if ids == nil or ids == "" then if coords == "" or coords == nil then error("Missing argument coordinates!") end count = 1 for str in string.gmatch(coords,"([^"..separator.."]+)") do if str ~= nil and str ~= "" then lat = string.gsub(str,",.*",'') long = string.gsub(str,"^.*,",'') if tonumber( lat ) > 90 or tonumber( lat ) < -90 then error("Latitudes must be between 90 and -90!") end if tonumber(long) > 180 or tonumber(long) < -180 then error("Longitudes must be between 180 and -180!") end coordsx[count] = string.format("%.6f",long) .. "," .. string.format("%.6f",lat) count = count + 1 end end else count = 1 for str in string.gmatch(ids,"([^"..separator.."]+)") do if str ~= nil and str ~= "" then str = checkid(str) lat = latitude(str) long = longitude(str) coordsx[count] = string.format("%.6f",long) .. "," .. string.format("%.6f",lat) count = count + 1 end end end local group = frame.args['group'] or 'multiline' local title = frame.args['title'] or 'A multiline' local description = frame.args['desc'] or "" if description == nil then description = "" end local fill = "#000000" local stroke = frame.args['stroke'] or "#ffccaa" if string.len(stroke) ~= 7 then error("Incorrect length for argument color!") end if string.gsub(stroke,"#[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]","") ~= "" then error("Incorrect hexidecimal format for argument color!") end local mapframe = frame.args['mapframe'] or "no" if mapframe == nil or mapframe == "" then mapframe = "no" end local mod = math.mod(table.getn(coordsx),2) if mod == 1 then error("Need even number of matching coordinates!") end local i = 0 for i = 1,table.getn(coordsx), 1 do coordinates = coordinates .. "[" .. coordsx[i] .. "]@@@@@" i = i + 1 coordinates = coordinates .. "[" .. coordsx[i] .. "]]@@@@@[" if i == table.getn(coordsx) then break end end coordinates = string.gsub(coordinates,"@@@@@",",") coordinates = string.gsub(coordinates,"%],%[$",'') coordinates = string.gsub(coordinates, '%,$','') local part1a = '<maplink class="no-icon" text="" latitude="' .. lat .. '" longitude="' .. long .. '" ' local part1a = part1a .. 'zoom="5" group="' .. group .. '">\n{"type": "Feature","geometry":' local part1a = part1a .. '{ \n\t"type":"MultiLineString",\n\t"coordinates":\n' local part1b = '\n\t"properties":{\n\t\t"title": "' .. title .. '",\n' local part1b = part1b .. '\t\t"description": "' .. description .. '",\n' local part1b = part1b .. '\t\t"stroke":"' .. stroke .. '",\n\t\t"stroke-width":1\n}}\n</maplink>\n' local part2a = '<mapframe text="" latitude="' .. lat .. '" longitude="' .. long .. '" ' part2a = part2a .. 'zoom="5" group="' .. group .. '" width="600" height="400" >\n{"type": "FeatureCollection",\n\t"features":' part2a = part2a .. '[\n\t\t{\n\t\t"type": "Feature",\n\t\t"geometry": { \n\t"type":"MultiLineString",\n\t"coordinates":\n\t\t' local part2b = '\n\t"properties":{\n\t\t"title": "' .. title .. '",\n' part2b = part2b .. '\t\t"description": "' .. description .. '",\n\t\t' part2b = part2b .. '\t\t"stroke":"' .. stroke .. '",\n\t\t"stroke-width":1,\n\t\t\t' part2b = part2b .. '}\n}]}\n</mapframe>\n' -- No Polygons just MultiLineString if mapframe == "y" or mapframe == "yes" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part2a .. coordinates .. part2b else coordinates = '[[' .. coordinates .. ']]},' coordinates = part1a .. coordinates .. part1b end -- No Markers unless wanted can code - could end up with a few or large amount of markers return coordinates end -- SUN - draw circle with spikes as rays from sun function p.sun(frame) local shape = "sun" local sunburst = frame.args['sunburst'] or "10" if sunburst == nil or sunburst == "" then sunburst = "10" end sunburst = tonumber(sunburst) if sunburst < 10 or sunburst > 30 then sunburst = 10 end local increment = 360/sunburst local inbetween = increment/2 local id = frame.args['id'] or "" id = string.gsub(id,"%,+","@") id = string.gsub(id,"%s+",'') id = string.gsub(id,"%@+",'@') local lat = frame.args['lat'] or "" local long = frame.args['long'] local matrix = {} local coordinates = "" local count = 1 local type = frame.args['type'] or "line" if type ~= "poly" then type = "line" end if id == nil or id == "" then if lat == "" or lat == nil then error("Missing argument lat!") end if long == "" or long == nil then error("Missing argument long!") end if tonumber( lat ) > 90 or tonumber( lat ) < -90 then error("Latitudes must be between 90 and -90!") end if tonumber(long) > 180 or tonumber(long) < -180 then error("Longitudes must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end local r = frame.args['radius'] or ".5" r = tonumber(r) if r > 10 then error("10 for radius is MAX") end if r <= 0 then error("r has to be greater than 0") end local r2 = r * .45 local group = frame.args['group'] or 'sun' local title = frame.args['title'] or 'A sun' local description = frame.args['desc'] or "" if description == nil then description = "" end local fill = frame.args['fill'] or "#ffff00" local stroke = frame.args['stroke'] or "#000000" checkhex(fill,stroke) local mapframe = frame.args['mapframe'] or "no" if mapframe == nil or mapframe == "" then mapframe = "no" end local marker = frame.args['marker'] or "no" local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) local angle,ptx,pty = 0,0,0 local latitude = lat lat = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) local count = 0 for i = increment,360, increment do angle = i * math.pi / 180 ptx = lat - r2 * math.cos( angle ) pty = long - r2 * math.sin( angle ) ptx,pty = string.format("%.6f",newlat(ptx)),string.format("%.6f",pty) count = count + 1 matrix[count] = "[" .. pty .. "," .. ptx .. "]@@@@@" angle = (i + inbetween) * math.pi / 180 ptx = lat - r * math.cos( angle ) pty = long - r * math.sin( angle ) ptx,pty = string.format("%.6f",newlat(ptx)),string.format("%.6f",pty) count = count + 1 matrix[count] = "[" .. pty .. "," .. ptx .. "]@@@@@" end for i = 1,table.getn(matrix), 1 do coordinates = coordinates .. matrix[i] end coordinates = coordinates .. matrix[1] coordinates = string.gsub(coordinates,"@@@@@",",") coordinates = string.gsub(coordinates,",$",'') if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part4a .. coordinates .. part4b else coordinates = '[' .. coordinates .. ']},' coordinates = part3a .. coordinates .. part3b end else if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part2a .. coordinates .. part2b else coordinates = '[' .. coordinates .. ']},' coordinates = part1a .. coordinates .. part1b end end if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Sun|lat=' .. latitude .. "|long=" .. long .. '}}\n' end return coordinates end -- STADIUM or pill capsule shape -- reduced number of coordinates for circular shape function p.stadium(frame) local shape = "stadium" local id = frame.args['id'] or "" local lat,long = "","" local x,y,x2,y2 = 0,0,0,0 if id == nil or id == "" then if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end lat = frame.args['lat'] long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end lat = string.format("%.6f",lat) long = string.format("%.6f",long) local group = frame.args['group'] or 'stadium' local title = frame.args['title'] or 'A Stadium' local description = frame.args['desc'] or '' local r = frame.args['radius'] or ".5" r = tonumber(r) if r > 10 then error("10 for radius is MAX") end if r <= 0 then error("radius has to be greater than 0") end local fill = frame.args['fill'] or "#ccef64" local stroke = frame.args['stroke'] or "#0000ff" checkhex(fill,stroke) local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end local data = {} local data2 = {} local coordinates = "" local coordinates2 = "" local ptx,pty,angle,ptx2,pty2 = 0,0,0,0,0 local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "poly" end local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) x = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) angle = 90 * math.pi / 180 x = x + (r*1.5) * math.cos( angle ) y = long + (r*1.5) * math.sin (angle) x = newlat(x) x2 = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) angle = 270 * math.pi / 180 x = x + (r*1.5) * math.cos( angle ) y2 = long + (r*1.5) * math.sin (angle ) x2 = newlat(x2) x = math.log(math.tan((90 + x) * math.pi/360)) / (math.pi/180) x2 =math.log(math.tan((90 + x2) * math.pi/360)) / (math.pi/180) local count = 1 for i = -2, 180, 2 do angle = i * math.pi / 180 ptx = x + r * math.cos( angle ) pty = y + r * math.sin(angle) ptx = newlat(ptx) data[count] = '[' .. string.format("%.6f",pty) .. "," .. string.format("%.6f",ptx) .. ']' count = count + 1 end count = 1 for i = 178,360, 2 do angle = i * math.pi / 180 ptx = x2 + r * math.cos( angle ) pty = y2 + r * math.sin(angle) ptx = newlat(ptx) data2[count] = '[' .. string.format("%.6f",pty) .. "," .. string.format("%.6f",ptx) .. ']' count = count + 1 end for i = 1,table.getn(data), 1 do coordinates = coordinates .. data[i] end for i = 1,table.getn(data2), 1 do coordinates2 = coordinates2 .. data2[i] end coordinates = coordinates .. coordinates2 coordinates = coordinates.gsub(coordinates,'%]%[','],[') coordinates = coordinates.gsub(coordinates,'@@@@@$','') coordinates = coordinates.gsub(coordinates,'%]@@@@@%[','],\n[') coordinates = "[" .. coordinates .. ',' .. data[1] .. "]," if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = string.gsub(coordinates,'%]%,$',']]},') coordinates = part4a .. string.gsub(coordinates,'^%[','[[') .. part4b else coordinates = string.gsub(coordinates,'%]%,$',']},') coordinates = part3a .. coordinates .. part3b end else if type == "poly" then coordinates = string.gsub(coordinates,'%]%,$',']]},') coordinates = part2a .. string.gsub(coordinates,'^%[','[[') .. part2b else coordinates = string.gsub(coordinates,'%]%,$',']},') coordinates = part1a .. coordinates .. part1b end end if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Stadium|lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end -- Draw a route -- BETA - TEST -- Currently draws a maplink with 1 route - can edit to input/output multiple routes in 1 maplink but this will suffice -- for now -- A mapframw can also be created for 1 route - multiple routes can be added later function p.drawroute(frame) local route = "" local newcoordinates = "" local group = frame.args['group'] or 'route' local show = frame.args['show'] or group local title = frame.args['title'] or '' local description = frame.args['description'] or '' local coordinates = frame.args['coordinates'] or '' local flip = frame.args['flip'] or 'no' -- flip the lat,long input in coordinates parameter local separator = "@" local type = frame.args['type'] or 'maplink' local lat=frame.args['lat'] or "34" local long=frame.args['long'] or "-40" local zoom = "5" local width="400" local height="350" local text = frame.args['text'] or "" if type ~= "maplink" then type = "mapframe" end if coordinates == "" or coordinates == nil then return "" end coordinates = string.gsub(coordinates,'\n',' ') coordinates = string.gsub(coordinates,'%s+','') coordinates = string.gsub(coordinates,'@+','@') if flip == 'no' or flip == "n" then coordinates = string.gsub(coordinates,'@','],[') else for str in string.gmatch(coordinates,"([^"..separator.."]+)") do str = string.gsub(str,'(.*),(.*)','%2,%1') newcoordinates = newcoordinates .. str .. "],[" end coordinates = string.gsub(newcoordinates,'%],%[$','') end if type == 'maplink' then route = route .. '\n<maplink text="" group="' .. group .. '" class=no-icon>' route = route .. '\n{' route = route .. '\n\t"type": "Feature",' route = route .. '\n\t"geometry":' route = route .. '\n\t{"coordinates":' route = route .. '\n\t[[' .. coordinates .. ']],' -- route = route .. '\n\t' .. coordinates -- route = route ..'\n]],' route= route .. '\n\t"type":"LineString"},' route = route .. '\n\t"properties":{' route = route .. '\n\t\t"title": "' .. title .. '",' route = route .. '\n\t\t"description": "' .. description .. '",' route = route .. '\n\t\t"stroke":"#0000ff",' route = route .. '\n\t\t"stroke-width":2' route = route .. '\n}}</maplink>\n' else route = route .. '\n<mapframe text="' .. text .. '" latitude=' .. lat .. ' longitude=' .. long route = route .. ' zoom=' .. zoom .. ' width=' .. width .. ' height=' .. height .. ' group=' .. group .. ' show=' .. show .. ">" route = route .. '\n{"type":"Feature", "properties":{' route = route .. '\n\t\t"title": "' .. title .. '",' route = route .. '\n\t\t"description": "' .. description .. '",' route = route .. '\n\t\t"stroke":"#0000ff",' route = route .. '\n\t\t"stroke-width":2},' route = route .. '\n\t"geometry":' route= route .. '\n\t{"type":"LineString",' route = route .. '\n\t"coordinates":' route = route .. '\n\t[[' .. coordinates .. ']]' route = route .. '\n}}}</mapframe>\n' end return route end -- Function to draw a maplink for producing a mapshape -- Only need the Wikidata ID and color for fill as parameters (id=Q8888 - fill=#ffcc00 -- Optional parameter(s): description -- rest filled in which you can edit -- added type -- this fetches info based on wikidata and contents of OpenStreetMap function p.drawmapshape(frame) local id = frame.args['id'] or "" local fill = frame.args['fill'] or "#ffcc00" checkhex(fill,"#4d4d4d") local output = "" local type = frame.args['type'] or "mapshape" if type == "geoshape" or type == "geoline" or type == "geomask" then type = type else type = "geoshape" end if id == nil or id == "" then return end id = checkid(id) local description = frame.args['description'] or "" local lat = latitude(id) local long = longitude(id) lat = string.format("%.6f",lat) long = string.format("%.6f",long) local language = frame.args['lang'] or mw.language.getContentLanguage(id).code local title = "" local wiki = language .. "wikivoyage" local titlex = mw.wikibase.label(id) local entity = mw.wikibase.getEntityObject(id) if entity == nil then return end title = entity:getSitelink(wiki) if title == nil or title == "" then title = titlex end output = output .. '<maplink text="" latitude="' .. lat .. '" longitude="' .. long .. '" zoom="5" width="600" height="500" group="mask" class="no-icon">\n' output = output .. '\t{\n' output = output .. '\t"type": "ExternalData",\n' output = output .. '\t"properties": {\n' output = output .. '\t"title": "' .. title .. '",\n' output = output .. '"description": "' .. description .. '",\n' output = output .. '\t"fill": "' .. fill .. '",\n' output = output .. '\t"fill-opacity": 0.2,\n' output = output .. '\t"stroke": "#4d4d4d",\n' output = output .. '\t"stroke-width": 1\n' output = output .. '\t},\n' output = output .. '\t"service": "' .. type .. '",\n' output = output .. '\t"ids": "' .. id .. '"\n' output = output .. '}\n' output = output .. '</maplink>' return output end -- RIGHT triangle - using a box as reference instead of a circle - slightly different than an equilateral triangle -- does not point to anything just a triangular shape - have to adjust manually for the moment function p.righttriangle(frame) local shape = "letters" local id = frame.args['id'] or "" local lat,long = "","" if id == nil or id == "" then if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end lat = frame.args['lat'] long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end local side = frame.args['side'] or 1 side = tonumber(side) if side < 1 or side > 4 then side = 1 end local group = frame.args['group'] or 'letters' local title = frame.args['title'] or 'Text line' local description = frame.args['desc'] or '' local r = frame.args['radius'] or ".5" if r == nil or r == "" then r = .5 end r = tonumber(r) if r > 10 then error("10 for radius is MAX") end if r <= 0 then error("r has to be greater than 0") end local fill = frame.args['fill'] or "#ccef64" local stroke = frame.args['stroke'] or "#0000ff" checkhex(fill,stroke) local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end local coordinates = "" local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "poly" end local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) lat = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) local angle1,angle2,angle3,angle4 = 0,0,0,0 local ptx,ptx2,ptx3,ptx4 = 0,0,0,0 local pty,pty2,pty3,pty4 = 0,0,0,0 local a = 45 local b = 135 local c = 225 local d = 315 if side == 1 then d = 225 end if side == 2 then c = 135 end if side == 3 then b = 45 end if side == 4 then a = 315 end local rx = r * 2 -- For something else angle1 = a * math.pi / 180 ptx = lat + r * math.cos( angle1 ) pty = long + r * math.sin( angle1 ) angle2 = b * math.pi /180 ptx2 = lat + r * math.cos( angle2 ) pty2 = long + r * math.sin( angle2 ) angle3 = c * math.pi /180 ptx3 = lat + r * math.cos( angle3 ) pty3 = long + r * math.sin( angle3 ) angle4 = d * math.pi /180 ptx4 = lat + r * math.cos( angle4 ) pty4 = long + r * math.sin( angle4 ) ptx,pty = string.format("%.6f",newlat(ptx)),string.format("%.6f",pty) ptx2,pty2 = string.format("%.6f",newlat(ptx2)),string.format("%.6f",pty2) ptx3,pty3 = string.format("%.6f",newlat(ptx3)),string.format("%.6f",pty3) ptx4,pty4 = string.format("%.6f",newlat(ptx4)),string.format("%.6f",pty4) lat,long = string.format("%.6f",newlat(lat)),string.format("%.6f",long) coordinates = "[" .. pty .. "," .. ptx .. "],[" .. pty2 .. "," .. ptx2 .. "],[" .. pty3 .. "," .. ptx3 .. "],[".. pty4 .. "," .. ptx4 .. "],[" .. pty .. "," .. ptx .. "]" if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part4a .. coordinates .. part4b else coordinates = '[' .. coordinates .. ']},' coordinates = part3a .. coordinates .. part3b end else if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part2a .. coordinates .. part2b else coordinates = '[' .. coordinates .. ']},' coordinates = part1a .. coordinates .. part1b end end if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Triangle X|lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end -- THIS FUNCTION IS BEING DEVELOPED THROUGH ITERATION -- DESIGNING AS YOU GO SO TO SPEAK AND PUTTING IDEAS IN AS TO PROCESS -- BEAR WITH IT -- Need to draw one more set of points function p.textline(frame) local shape = "letters" local line = frame.args['line'] or "" if line == nil or line == "" then return "" end -- LOWERCASE IS CHANGED TO UPPERCASE LATER if string.gsub(line,"^[% A-Z0-9a-z%[%]%(%)%-%-_%<%>%/:]+$","") ~= "" then error("only A-Z a-z [ ] ( ) < > - _ / are alowed!") end if string.len(line) > 1 then -- funky add extraspace at beginning and end line = "@" .. line .. "@" end local lat,long = "","" if id == nil or id == "" then if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end lat = frame.args['lat'] long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end local group = frame.args['group'] or 'letters' local title = frame.args['title'] or 'Text line' local description = frame.args['desc'] or '' local radius = frame.args['radius'] or .5 if radius == nil or radius == "" then radius = .5 end radius = tonumber(radius) if radius > 10 then error("10 for radius is MAX") end if radius <= 0 then error("r has to be greater than 0") end radius1 = radius * .75 radius2 = radius local fill = frame.args['fill'] or "#ccef64" if fill == nil or fill == "" then fill = "#ccef64" end local stroke = frame.args['stroke'] or "#0000ff" if stroke == nil or stroke == "" then stroke = "#0000ff" end checkhex(fill,stroke) local coordinates = "" local boxcoordinates = "" local combinedcoords = "" local type = "line" local letter = "" local factor = 2 local stringlength = 0 stringlength = string.len(line) local lower = 0 _,lower = string.gsub(line,'%l','') stringlength = stringlength - lower stringlength = stringlength + (lower * .75) local calc = 0 local adjust = frame.args['adjust'] or "none" -- TO MAKE ROUGH ADJUSTMENT OF STARTING POSITION if adjust == nil or adjust == "" then adjust = "none" end if adjust ~= "right" and adjust ~= "center" and adjust ~= "left" then adjust = "none" end local boxit = frame.args['boxit'] or "n" if boxit == "" or boxit == nil then boxit = "n" end if boxit ~= "n" then boxit = "y" end local frameit = {} -- CHANGE TO LineString with stroke-width of local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) local angle = 0 local recx1,recx2,recx3,recx4 = 0,0,0,0 local recy1,recy2,recy3,recy4 = 0,0,0,0 local ptxnew,latx,latxx,latxxx,latcc,ptx1,ptx2,ptx3,ptx4,ptx5,ptx6,ptx7,ptx8,ptx9 = 0,0,0,0,0,0,0,0,0,0,0,0,0,0 local ptx10,ptx11,ptx12,ptx13,ptx14,ptx15,ptx16,ptx17,ptx18,ptx19,ptx20 = 0,0,0,0,0,0,0,0,0,0,0 local ptynew,longx,longxx,longxxx,longcc,pty1,pty2,pty3,pty4,pty5,pty6,pty7,pty8,pty9 = 0,0,0,0,0,0,0,0,0,0,0,0,0,0 local pty10,pty11,pty12,pty13,pty14,pty15,pty16,pty17,pty18,pty19,pty20 = 0,0,0,0,0,0,0,0,0,0,0 -- Build a rectangular shape to get the 4 corners -- Below is a square so have to extend it upward using a different center point -- top corners local a = 45 -- right upper corner - pty1 local b = 135 -- right lower corner - pty2 local c = 225 -- left lower corner -- pty3 local d = 315 -- left upper corner -- pty4 local e = 180 -- bottom center rectangle -- longxx,pty5 local f = 360 -- upper center rectangle -- longx,longxxx,longcc,pty6 local g = 270 -- upper center left side rectangle -- pty7,pty11,pty13,pty15,pty17,pty19,pty21 local h = 90 -- upper center right side rectangle -- pty8,pty12,pty14,pty16,pty18,pty20,pty22 local i = 140 -- add to letter Q -- pty9 local j = 160 -- add for letter Q -- pty10 -- move line over to right or left to approximate center of line if stringlength > 1 then if adjust == "center" then lat = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) angle = 270 * math.pi /180 lat = lat + (radius * (stringlength * 1)) * math.cos( angle ) long = long + (radius * (stringlength * 1)) * math.sin( angle ) lat,long = string.format("%.6f",newlat(lat)),string.format("%.6f",long) angle = 0 end if adjust == "left" then lat = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) angle = 270 * math.pi /180 lat = lat + (radius * (stringlength * 2)) * math.cos( angle ) long = long + (radius * (stringlength * 2)) * math.sin( angle ) lat,long = string.format("%.6f",newlat(lat)),string.format("%.6f",long) angle = 0 end if adjust == "right" then lat = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) angle = 90 * math.pi /180 if boxit == "y" then lat = lat + (radius * 4) * math.cos(angle) long = long + (radius * 4) * math.sin( angle) else lat = lat + (radius * 2) * math.cos(angle) long = long + (radius * 2) * math.sin( angle) end lat,long = string.format("%.6f",newlat(lat)),string.format("%.6f",long) angle = 0 end end -- Maybe WORK MOVING LETTERS AROUND ie lc letter followed by uppercase letter local letterbefore = "" local letterafter = "" local letternow = "" for zz = 1,string.len(line) do letter = string.sub(line,zz,zz) letterafter = string.sub(line,zz + 1, zz + 1) letternow = letter letterbefore = string.sub(line,zz - 1, zz - 1) if string.find(letter,'%l') == 1 then radius = radius1 letter = string.upper(letter) else radius = radius2 end lat = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) angle = f * math.pi / 180 latx = lat + (radius*.5) * math.cos(angle) longx = long + (radius*.5) * math.sin(angle) angle = f * math.pi / 180 latcc = lat + (radius*.25) * math.cos(angle) longcc = long + (radius*.25) * math.sin(angle) angle = e * math.pi / 180 latxx = lat + (radius * .4) * math.cos(angle) longxx = long + (radius * .4) * math.sin(angle) angle = f * math.pi / 180 latxxx = lat + (radius) * math.cos(angle) longxxx = long + (radius) * math.sin(angle) angle = a * math.pi / 180 ptx1 = latx + radius * math.cos( angle ) pty1 = longx + radius * math.sin( angle ) recx1 = latx + (radius * 1.5) * math.cos( angle ) recy1 = longx + (radius * 1.5) * math.sin( angle ) angle = b * math.pi /180 ptx2 = lat + radius * math.cos( angle ) pty2 = long + radius * math.sin( angle ) recx2 = lat + (radius * 1.5) * math.cos( angle ) recy2 = long + (radius * 1.5) * math.sin( angle ) angle = c * math.pi /180 ptx3 = lat + radius * math.cos( angle ) pty3 = long + radius * math.sin( angle ) recx3 = lat + (radius * 1.5) * math.cos( angle ) recy3 = long + (radius * 1.5) * math.sin( angle ) angle = d * math.pi /180 ptx4 = latx + radius * math.cos( angle ) pty4 = longx + radius * math.sin( angle ) recx4 = latx + (radius * 1.5) * math.cos( angle ) recy4 = longx + (radius * 1.5) * math.sin( angle ) angle = e * math.pi /180 ptx5 = lat + (radius * .7) * math.cos( angle ) pty5 = long + (radius * .7) * math.sin( angle ) angle = f * math.pi /180 ptx6 = lat + (radius + (radius * .2)) * math.cos( angle ) pty6 = long + (radius + (radius * .2)) * math.sin( angle ) angle = g * math.pi /180 ptx7 = latx + (radius * .7) * math.cos( angle ) pty7 = longx + (radius * .7) * math.sin( angle ) angle = h * math.pi /180 ptx8 = latx + (radius * .7) * math.cos( angle ) pty8 = longx + (radius * .7) * math.sin( angle ) angle = i * math.pi /180 ptx9 = lat + (radius * 1.2) * math.cos( angle ) pty9 = long + (radius * 1.2) * math.sin( angle ) angle = j * math.pi /180 ptx10 = latx + (radius * .8) * math.cos( angle ) pty10 = longx + (radius * .8) * math.sin( angle ) angle = g * math.pi /180 ptx11 = lat + (radius * .5) * math.cos( angle ) pty11 = long + (radius * .5) * math.sin( angle ) angle = h * math.pi /180 ptx12 = lat + (radius * .5) * math.cos( angle ) pty12 = long + (radius * .5) * math.sin( angle ) angle = g * math.pi /180 ptx13 = lat + (radius * .7) * math.cos( angle ) pty13 = long + (radius * .7) * math.sin( angle ) angle = h * math.pi /180 ptx14 = lat + (radius * .7) * math.cos( angle) pty14 = long + (radius * .7) * math.sin( angle ) angle = g * math.pi /180 -- left right ptx15 = latxx + (radius * .7) * math.cos( angle ) pty15 = longxx + (radius * .7) * math.sin( angle ) angle = h * math.pi /180 ptx16 = latxx + (radius * .7) * math.cos( angle ) pty16 = longxx + (radius * .7) * math.sin( angle ) angle = g * math.pi /180 -- left right of center bottom top ptx17 = ptx5 + (radius * .5) * math.cos( angle ) pty17 = pty5 + (radius * .5) * math.sin( angle ) angle = h * math.pi /180 ptx18 = ptx5 + (radius * .5) * math.cos( angle ) pty18 = pty5 + (radius * .5) * math.sin( angle ) angle = g * math.pi /180 -- left right of center bottom top ptx19 = ptx6 + (radius * .5) * math.cos( angle ) pty19 = pty6 + (radius * .5) * math.sin( angle ) angle = h * math.pi /180 ptx20 = ptx6 + (radius * .5) * math.cos( angle ) pty20 = pty6 + (radius * .5) * math.sin( angle ) angle = g * math.pi /180 -- left right ptx21 = latxxx + (radius * .7) * math.cos( angle ) pty21 = longxxx + (radius * .7) * math.sin( angle ) angle = h * math.pi /180 ptx22 = latxxx + (radius * .7) * math.cos( angle ) pty22 = longxxx + (radius * .7) * math.sin( angle ) recx1,recy1 = string.format("%.6f",newlat(recx1)),string.format("%.6f",recy1) recx2,recy2 = string.format("%.6f",newlat(recx2)),string.format("%.6f",recy2) recx3,recy3 = string.format("%.6f",newlat(recx3)),string.format("%.6f",recy3) recx4,recy4 = string.format("%.6f",newlat(recx4)),string.format("%.6f",recy4) ptx1,pty1 = string.format("%.6f",newlat(ptx1)),string.format("%.6f",pty1) ptx2,pty2 = string.format("%.6f",newlat(ptx2)),string.format("%.6f",pty2) ptx3,pty3 = string.format("%.6f",newlat(ptx3)),string.format("%.6f",pty3) ptx4,pty4 = string.format("%.6f",newlat(ptx4)),string.format("%.6f",pty4) ptx5,pty5 = string.format("%.6f",newlat(ptx5)),string.format("%.6f",pty5) ptx6,pty6 = string.format("%.6f",newlat(ptx6)),string.format("%.6f",pty6) ptx7,pty7 = string.format("%.6f",newlat(ptx7)),string.format("%.6f",pty7) ptx8,pty8 = string.format("%.6f",newlat(ptx8)),string.format("%.6f",pty8) ptx9,pty9 = string.format("%.6f",newlat(ptx9)),string.format("%.6f",pty9) ptx10,pty10 = string.format("%.6f",newlat(ptx10)),string.format("%.6f",pty10) ptx11,pty11 = string.format("%.6f",newlat(ptx11)),string.format("%.6f",pty11) ptx12,pty12 = string.format("%.6f",newlat(ptx12)),string.format("%.6f",pty12) ptx13,pty13 = string.format("%.6f",newlat(ptx13)),string.format("%.6f",pty13) ptx14,pty14 = string.format("%.6f",newlat(ptx14)),string.format("%.6f",pty14) ptx15,pty15 = string.format("%.6f",newlat(ptx15)),string.format("%.6f",pty15) ptx16,pty16 = string.format("%.6f",newlat(ptx16)),string.format("%.6f",pty16) ptx17,pty17 = string.format("%.6f",newlat(ptx17)),string.format("%.6f",pty17) ptx18,pty18 = string.format("%.6f",newlat(ptx18)),string.format("%.6f",pty18) ptx19,pty19 = string.format("%.6f",newlat(ptx19)),string.format("%.6f",pty19) ptx20,pty20 = string.format("%.6f",newlat(ptx20)),string.format("%.6f",pty20) ptx21,pty21 = string.format("%.6f",newlat(ptx21)),string.format("%.6f",pty21) ptx22,pty22 = string.format("%.6f",newlat(ptx22)),string.format("%.6f",pty22) lat,long = string.format("%.6f",newlat(lat)),string.format("%.6f",long) latx,longx = string.format("%.6f",newlat(latx)),string.format("%.6f",longx) latxx,longxx = string.format("%.6f",newlat(latxx)),string.format("%.6f",longxx) latxxx,longxxx = string.format("%.6f",newlat(latxxx)),string.format("%.6f",longxxx) latcc,longcc = string.format("%.6f",newlat(latcc)),string.format("%.6f",longcc) -- 1st basic test of initial points are set for some letters -- trying letter N TEST ok -- routine to break up letters into pieces then put them together building tables of some kind -- for each character -- letter 1 (no matter what letter it is) -- build coordinates for that letter no matter what it is ie. letter N do instructons xyz then put coordinates in array of letters -- long road to haul -- SMALLER LETTERS WOULD BE A DIFFERENT RADIUS - perhaps r*.75 - COME TO THAT AFTER WE BUILD THE CAPS - FIGURE OUT HOW TO KEEP A -- SINGLE CENTER POINT but adjusting for size looks like it might be difficult -- SINCE THERE IS NOT EXEC in SCRIBUNTO another issue arises as well - be nice to put command in array - CHECK coordinates = "" if boxit == "y" then if frameit[1] == nil then frameit[1] = "[[" ..recy4 .. "," .. recx4 .. "],[" .. recy3 .. "," .. recx3 .. "]" frameit[2] = ",[" .. recy4 .. "," .. recx4 .. "]]" frameit[3] = ",[" .. recy2 .. "," .. recx2 .. "],[" .. recy1 .. "," .. recx1 .. "]" --for single letter else frameit[3] = ",[" .. recy2 .. "," .. recx2 .. "],[" .. recy1 .. "," .. recx1 .. "]" end end if letter == "A" then coordinates = "[[" .. pty3 .. "," .. ptx3 .. "],[" .. pty6 .. "," .. ptx6 .. "],[" .. pty2 .. "," .. ptx2 .. "]],[[" .. pty11 .. "," .. ptx11 .. "],[" .. pty12 .. "," .. ptx12 .. "]]" elseif letter == "B" then -- KEEP OLD FOR NOW coordinates = "[" .. pty3 .. "," .. ptx3 .. "],[" .. pty4 .. "," .. ptx4 .. "],[" .. pty6 .. "," .. ptx6 .. "],[" .. pty8 .. "," .. ptx8 .. "],[" ..long .. "," .. lat .. "],[" .. pty2 .. "," .. ptx2 .. "],[" .. pty3 .. "," .. ptx3 .. "]" coordinates = "[" .. pty3 .. "," .. ptx3 .. "],[" .. pty4 .. "," .. ptx4 .. "],[" .. pty20 .. "," .. ptx20 .. "],[" .. pty22 .. "," .. ptx22 .. "],[" .. pty8 .. "," .. ptx8 .. "],[" ..longcc .. "," .. latcc .. "],[" .. pty14 .. "," .. ptx14 .. "],[" .. pty16 .. "," .. ptx16 .. "],[" .. pty18 .. "," .. ptx18 .. "],[" .. pty3 .. "," .. ptx3 .. "]" elseif letter == "C" then -- KEEP FOR TIME BEING coordinates = "[" .. pty2 .. "," .. ptx2 .. "],[" .. pty3 .. "," .. ptx3 .. "],[" .. pty4 .. "," .. ptx4 .. "],[" .. pty1 .. "," .. ptx1 .. "]" coordinates = "[" .. pty16 .. "," .. ptx16 .. "],[" .. pty18 .. "," .. ptx18 .. "],[" .. pty17 .. "," .. ptx17 .. "],[" .. pty15 .. "," .. ptx15 .. "],[" .. pty21 .. "," .. ptx21 .. "],[" .. pty19 .. "," .. ptx19 .. "],[" .. pty20 .. "," .. ptx20 .. "],[" .. pty22 .. "," .. ptx22 .. "]" elseif letter == "D" then -- KEEP FOR TIME BEING coordinates = "[" .. pty3 .. "," .. ptx3 .. "],[" .. pty4 .. "," .. ptx4 .. "],[" .. pty6 .. "," .. ptx6 .. "],[" .. pty8 .. "," .. ptx8 .. "],[" .. pty5 .. "," .. ptx5 .. "],[" .. pty3 .. "," .. ptx3 .. "]" coordinates = "[" .. pty3 .. "," .. ptx3 .. "],[" .. pty4 .. "," .. ptx4 .. "],[" .. pty20 .. "," .. ptx20 .. "],[" .. pty22 .. "," .. ptx22 .. "],[" .. pty16 .. "," .. ptx16 .. "],[" .. pty18 .. "," .. ptx18 .. "],[" .. pty3 .. "," .. ptx3 .. "]" elseif letter == "E" then coordinates = "[" .. pty1 .. "," .. ptx1 .. "],[" .. pty4 .. "," .. ptx4 .. "],[" .. pty7 .. "," .. ptx7 .. "],[" .. longx .. "," .. latx .. "],[" .. pty7 .. "," .. ptx7 .. "],[" .. pty3 .. "," .. ptx3 .. "],[" .. pty2 .. "," .. ptx2 .. "]" elseif letter == "F" then coordinates = "[" .. pty1 .. "," .. ptx1 .. "],[" .. pty4 .. "," .. ptx4 .. "],[" .. pty7 .. "," .. ptx7 .. "],[" .. longx .. "," .. latx .. "],[" .. pty7 .. "," .. ptx7 .. "],[" .. pty3 .. "," .. ptx3 .. "]" elseif letter == "G" then -- KEEP FOR TIME BEING coordinates = "[" .. pty1 .. "," .. ptx1 .. "],[" .. pty4 .. "," .. ptx4 .. "],[" .. pty3 .. "," .. ptx3 .. "],[" .. pty2 .. "," .. ptx2 .. "],[" .. pty8 .. "," .. ptx8 .. "],[" .. long .. "," .. lat .. "]" coordinates = "[" .. pty22 .. "," .. ptx22 .. "],[" .. pty20 .. "," .. ptx20 .. "],[" .. pty19 .. "," .. ptx19 .. "],[" .. pty21 .. "," .. ptx21 .. "],[" .. pty15 .. "," .. ptx15 .. "],[" .. pty17 .. "," .. ptx17 .. "],[" .. pty2 .. "," .. ptx2 .. "],[" .. pty8 .. "," .. ptx8 .. "],[" .. long .. "," .. lat .. "]" elseif letter == "H" then coordinates = "[" .. pty4 .. "," .. ptx4 .. "],[" .. pty3 .. "," .. ptx3 .. "],[" .. pty7 .. "," .. ptx7 .. "],[" .. pty8 .. "," .. ptx8 .. "],[" .. pty1 .. "," .. ptx1 .. "],[" .. pty2 .. "," .. ptx2 .. "]" elseif letter == "I" then -- KEEP OLD FOR TIME BEING coordinates = "[" .. pty3 .. "," .. ptx3 .. "],[" .. pty2 .. "," .. ptx2 .. "],[" .. pty5 .. "," .. ptx5 .. "],[" .. pty6 .. "," .. ptx6 .. "],[" .. pty1 .. "," .. ptx1 .. "],[" .. pty4 .. "," .. ptx4 .. "]" coordinates = "[" .. pty19 .. "," .. ptx19 .. "],[" .. pty20 .. "," .. ptx20 .. "],[" .. pty6 .. "," .. ptx6 .. "],[" .. pty5 .. "," .. ptx5 .. "],[" .. pty17 .. "," .. ptx17 .. "],[" .. pty18 .. "," .. ptx18 .. "]" elseif letter == "J" then -- KEEP OLD FOR TIME BEING coordinates = "[" .. pty1 .. "," .. ptx1 .. "],[" .. pty4 .. "," .. ptx4 .. "],[" .. pty6 .. "," .. ptx6 .. "],[" .. pty5 .. "," .. ptx5 .. "],[" .. pty3 .. "," .. ptx3 .. "]" coordinates = "[" .. pty20 .. "," .. ptx20 .. "],[" .. pty19 .. "," .. ptx19 .. "],[" .. pty6 .. "," .. ptx6 .. "],[" .. pty5 .. "," .. ptx5 .. "],[" .. pty17 .. "," .. ptx17 .. "],[" .. pty15 .. "," .. ptx15 .. "]" elseif letter == "K" then coordinates = "[" .. pty4 .. "," .. ptx4 .. "],[" .. pty3 .. "," .. ptx3 .. "],[" .. pty7 .. "," .. ptx7 .. "],[" .. longx .. "," .. latx .. "],[" .. pty1 .. "," .. ptx1 .. "],[" .. longx .. "," .. latx .. "],[" .. pty2 .. "," .. ptx2 .. "]" elseif letter == "L" then coordinates = "[" .. pty2 .. "," .. ptx2 .. "],[" .. pty3 .. "," .. ptx3 .. "],[" .. pty4 .. "," .. ptx4 .. "]" elseif letter == "M" then coordinates = "[" .. pty3 .. "," .. ptx3 .. "],[" .. pty4 .. "," .. ptx4 .. "],[" .. longx .. "," .. latx .. "],[" .. pty1 .. "," .. ptx1 .. "],[".. pty2 .. "," .. ptx2 .. "]" elseif letter == "N" then coordinates = "[" .. pty3 .. "," .. ptx3 .. "],[" .. pty4 .. "," .. ptx4 .. "],[" .. pty2 .. "," .. ptx2 .. "],[".. pty1 .. "," .. ptx1 .. "],[" .. pty1 .. "," .. ptx1 .. "]" elseif letter == "O" then -- KEEP OLD FOR TIME BEING coordinates = "[" .. pty1 .. "," .. ptx1 .. "],[" .. pty2 .. "," .. ptx2 .. "],[" .. pty3 .. "," .. ptx3 .. "],[" .. pty4 .. "," .. ptx4 .. "],[" .. pty1 .. "," .. ptx1 .. "]" coordinates = "[" .. pty22 .. "," .. ptx22 .. "],[" .. pty20 .. "," .. ptx20 .. "],[" .. pty19 .. "," .. ptx19 .. "],[" .. pty21 .. "," .. ptx21 .. "],[" .. pty15 .. "," .. ptx15 .. "],[" .. pty17 .. "," .. ptx17 .. "],[" .. pty18 .. "," .. ptx18 .. "],[" .. pty16 .. "," .. ptx16 .. "],[" .. pty22 .. "," .. ptx22 .. "]" elseif letter == "P" then -- KEEP OLD FOR TIME BEING coordinates = "[" .. pty3 .. "," .. ptx3 .. "],[" .. pty4 .. "," .. ptx4 .. "],[" .. pty1 .. "," .. ptx1 .. "],[" .. pty8 .. "," .. ptx8 .. "],[" .. pty7 .. "," .. ptx7 .. "]" coordinates = "[" .. pty3 .. "," .. ptx3 .. "],[" .. pty4 .. "," .. ptx4 .. "],[" .. pty20 .. "," .. ptx20 .. "],[" .. pty22 .. "," .. ptx22 .. "],[" .. pty8 .. "," .. ptx8 .. "],[" .. pty7 .. "," .. ptx7 .. "]" elseif letter == "Q" then -- KEEP OLD FOR TIME BEING coordinates = "[[" .. pty1 .. "," .. ptx1 .. "],[" .. pty2 .. "," .. ptx2 .. "],[" .. pty3 .. "," .. ptx3 .. "],[" .. pty4 .. "," .. ptx4 .. "],[" .. pty1 .. "," .. ptx1 .. "]],[[" .. pty9 .. "," .. ptx9 .. "],[" .. pty10 .. "," .. ptx10 .. "]]" coordinates = "[[" .. pty22 .. "," .. ptx22 .. "],[" .. pty20 .. "," .. ptx20 .. "],[" .. pty19 .. "," .. ptx19 .. "],[" .. pty21 .. "," .. ptx21 .. "],[" .. pty15 .. "," .. ptx15 .. "],[" .. pty17 .. "," .. ptx17 .. "],[" .. pty18 .. "," .. ptx18 .. "],[" .. pty16 .. "," .. ptx16 .. "],[" .. pty22 .. "," .. ptx22 .. "]],[[" .. pty9 .. "," .. ptx9 .. "],[" .. pty10 .. "," .. ptx10 .. "]]" elseif letter == "R" then -- KEEP OLD FOR TIME BEING coordinates = "[" .. pty3 .. "," .. ptx3 .. "],[" .. pty4 .. "," .. ptx4 .. "],[" .. pty1 .. "," .. ptx1 .. "],[" .. pty8 .. "," .. ptx8 .. "],[" .. pty7 .. "," .. ptx7 .. "],[" .. longx .. "," .. latx .. "],[" .. pty2 .. "," .. ptx2 .. "]" coordinates = "[" .. pty3 .. "," .. ptx3 .. "],[" .. pty4 .. "," .. ptx4 .. "],[" .. pty20 .. "," .. ptx20 .. "],[" .. pty22 .. "," .. ptx22 .. "],[" .. pty8 .. "," .. ptx8 .. "],[" .. pty7 .. "," .. ptx7 .. "],[" .. longx .. "," .. latx .. "],[" .. pty2 .. "," .. ptx2 .. "]" elseif letter == "S" then -- KEEP FOR TIME BEING coordinates = "[" .. pty1 .. "," .. ptx1 .. "],[" .. pty4 .. "," .. ptx4 .. "],[" .. pty7 .. "," .. ptx7 .. "],[" .. long .. "," .. lat .. "],[" .. pty2 .. "," .. ptx2 .. "],[" .. pty3 .. "," .. ptx3 .. "]" coordinates = "[" .. pty22 .. "," .. ptx22 .. "],[" .. pty1 .. "," .. ptx1 .. "],[" .. pty19 .. "," .. ptx19 .. "],[" .. pty21 .. "," .. ptx21 .. "],[" .. pty7 .. "," .. ptx7 .. "],[" .. pty14 .. "," .. ptx14 .. "],[" .. pty2 .. "," .. ptx2 .. "],[" .. pty17 .. "," .. ptx17 .. "],[" .. pty15 .. "," .. ptx15 .. "]" elseif letter == "T" then coordinates = "[" .. pty1 .. "," .. ptx1 .. "],[" .. pty4 .. "," .. ptx4 .. "],[" .. pty6 .. "," .. ptx6 .. "],[" .. pty5 .. "," .. ptx5 .. "]" elseif letter == "U" then coordinates = "[" .. pty1 .. "," .. ptx1 .. "],[" .. pty2 .. "," .. ptx2 .. "],[" .. pty3 .. "," .. ptx3 .. "],[" .. pty4.. "," .. ptx4 .. "]" elseif letter == "V" then coordinates = "[" .. pty1 .. "," .. ptx1 .. "],[" .. pty5 .. "," .. ptx5 .. "],[" .. pty4 .. "," .. ptx4 .. "],[" .. pty4 .. "," .. ptx4 .. "]" elseif letter == "W" then coordinates = "[" .. pty1 .. "," .. ptx1 .. "],[" .. pty2 .. "," .. ptx2 .. "],[" .. longx .. "," .. latx .. "],[" .. pty3 .. "," .. ptx3 .. "],[" .. pty4 .. "," .. ptx4 .. "]" elseif letter == "X" then coordinates = "[[" .. pty1 .. "," .. ptx1 .. "],[" .. pty3 .. "," .. ptx3 .. "]],[[" .. pty4 .. "," .. ptx4 .. "],[" .. pty2 .. "," .. ptx2 .. "]]" elseif letter == "Y" then coordinates = "[" .. pty1 .. "," .. ptx1 .. "],[" .. longx .. "," .. latx .. "],[" .. pty5 .. "," .. ptx5 .. "],[" .. longx .. "," .. latx .. "],[" .. pty4 .. "," .. ptx4 .. "]" elseif letter == "Z" then coordinates = "[" .. pty4 .. "," .. ptx4 .. "],[" .. pty1 .. "," .. ptx1 .. "],[" .. pty3 .. "," .. ptx3 .. "],[" .. pty2 .. "," .. ptx2 .. "]" elseif letter == "_" then coordinates = "[" .. pty2 .. "," .. ptx2 .. "],[" .. pty3 .. "," .. ptx3 .. "]" elseif letter == "-" then coordinates = "[" .. pty12 .. "," .. ptx12 .. "],[" .. pty11 .. "," .. ptx11 .. "]" elseif letter == "0" then -- KEEP FOR TIME BEING coordinates = "[".. pty1 .. "," .. ptx1 .. "],[" .. pty2 .. "," .. ptx2 .. "],[" .. pty3 .. "," .. ptx3 .. "],[" .. pty4 .. "," .. ptx4 .. "],[" .. pty1 .. "," .. ptx1 .. "],[" .. pty3 .. "," .. ptx3 .. "]" coordinates = "[[" .. pty22 .. "," .. ptx22 .. "],[" .. pty20 .. "," .. ptx20 .. "],[" .. pty19 .. "," .. ptx19 .. "],[" .. pty21 .. "," .. ptx21 .. "],[" .. pty15 .. "," .. ptx15 .. "],[" .. pty17 .. "," .. ptx17 .. "],[" .. pty18 .. "," .. ptx18 .. "],[" .. pty16 .. "," .. ptx16 .. "],[" .. pty22 .. "," .. ptx22 .. "]],[[" .. pty1 .. "," .. ptx1 .. "],[" .. pty3 .. "," .. ptx3 .. "]]" elseif letter == "1" then coordinates = "[" .. pty7 .. "," .. ptx7 .. "],[" .. pty6 .. "," .. ptx6 .. "],[" .. pty5 .. "," .. ptx5 .. "],[" .. pty3 .. "," .. ptx3 .. "],[" .. pty2 .. "," .. ptx2 .. "]" elseif letter == "2" then -- KEEP OLD FOR TIME BEING coordinates = "[" .. pty4 .. "," .. ptx4 .. "],[" .. pty6 .. "," .. ptx6 .. "],[" .. pty8 .. "," .. ptx8 .. "],[" .. pty3 .. "," .. ptx3 .. "],[" .. pty2 .. "," .. ptx2 .."]" coordinates = "[" .. pty4 .. "," .. ptx4 .. "],[" .. pty20 .. "," .. ptx20 .. "],[" .. pty22 .. "," .. ptx22 .. "],[" .. pty8 .. "," .. ptx8 .. "],[" .. pty13 .. "," .. ptx13 .. "],[" .. pty15 .. "," .. ptx15 .. "],[" .. pty3 .. "," .. ptx3 .. "],[" .. pty2 .. "," .. ptx2 .."]" elseif letter == "3" then -- KEEP OLD FOR NOW coordinates = "[" .. pty4 .. "," .. ptx4 .. "],[" .. pty1 .. "," .. ptx1 .. "],[" .. longx .. "," .. latx .. "],[" .. pty8 .. "," .. ptx8 .. "],[" .. pty2 .. "," .. ptx2 .. "],[" .. pty3 .. "," .. ptx3 .. "]" coordinates = "[" .. pty4 .. "," .. ptx4 .. "],[" .. pty1 .. "," .. ptx1 .. "],[" .. longx .. "," .. latx .. "],[" .. pty14 .. "," .. ptx14 .. "],[" .. pty2 .. "," .. ptx2 .. "],[" .. pty3 .. "," .. ptx3 .. "]" elseif letter == "4" then coordinates = "[" .. pty2 .. "," .. ptx2 .. "],[" .. pty1 .. "," .. ptx1 .. "],[" .. pty13 .. "," .. ptx13 .. "],[" .. pty14 .. "," .. ptx14 .. "]" elseif letter == "5" then coordinates = "[" .. pty1 .. "," .. ptx1 .. "],[" .. pty4 .. "," .. ptx4 .. "],[" .. pty7 .. "," .. ptx7 .. "],[" .. pty8 .. "," .. ptx8 .. "],[" .. pty2 .. "," .. ptx2 .. "],[" .. pty3 .. "," .. ptx3 .. "]" elseif letter == "6" then -- KEEP FOR TIME BEING coordinates = "[" .. pty7 .. "," .. ptx7 .. "],[" .. pty8 .. "," .. ptx8 .. "],[" .. pty2 .. "," .. ptx2 .. "],[" .. pty3 .. "," .. ptx3 .. "],[" .. pty4 .. "," .. ptx4 .. "]" coordinates = "[" .. pty13 .. "," .. ptx13 .. "],[" .. pty14 .. "," .. ptx14 .. "],[" .. pty2 .. "," .. ptx2 .. "],[" .. pty3 .. "," .. ptx3 .. "],[" .. pty21 .. "," .. ptx21 .. "],[" .. pty19 .. "," .. ptx19 .. "],[" .. pty6 .. "," .. ptx6 .. "]" elseif letter == "7" then -- KEEP OLD FOR TIME BEING coordinates = "[" .. pty4 .. "," .. ptx4 .. "],[" .. pty1 .. "," .. ptx1 .. "],[" .. long .. "," .. lat .. "],[" .. pty5 .. "," .. ptx5 .. "]" coordinates = "[[" .. pty4 .. "," .. ptx4 .. "],[" .. pty1 .. "," .. ptx1 .. "],[" .. long .. "," .. lat .. "],[" .. pty5 .. "," .. ptx5 .. "]],[[" .. pty11 .. "," .. ptx11 .. "],[" .. pty12 .. "," .. ptx12 .. "]]" elseif letter == "8" then -- KEEP OLD FOR TIME BEING coordinates = "[" .. pty4 .. "," .. ptx4 .. "],[" .. pty1 .. "," .. ptx1 .. "],[" .. longx .. "," .. latx .. "],[" .. pty2 .. "," .. ptx2 .. "],[" .. pty3 .. "," .. ptx3 .. "],[" .. longx .. "," .. latx .. "],[" .. pty4 .. "," .. ptx4 .. "]" coordinates = "[" .. pty19 .. "," .. ptx19 .. "],[" .. pty20 .. "," .. ptx20 .. "],[" .. pty22 .. "," .. ptx22 .. "],[" .. pty8 .. "," .. ptx8 .. "],[" .. longcc .. "," .. latcc .. "],[" .. pty14 .. "," .. ptx14 .. "],[" .. pty16 .. "," .. ptx16 .. "],[" .. pty18 .. "," .. ptx18 .. "],[" .. pty17 .. "," .. ptx17 .. "],[" .. pty15 .. "," .. ptx15 .. "],[" .. pty13 .. "," .. ptx13 .. "],[" .. longcc .. "," .. latcc .. "],[" .. pty7 .. "," .. ptx7 .. "],[" .. pty21 .. "," .. ptx21 .. "],[" .. pty19 .. "," .. ptx19 .. "]" elseif letter == "9" then coordinates = "[" .. pty8 .. "," .. ptx8 .. "],[" .. pty7 .. "," .. ptx7 .. "],[" .. pty4 .. "," .. ptx4 .. "],[" .. pty1 .. "," .. ptx1 .. "],[" .. pty8 .. "," .. ptx8 .. "],[" .. pty5 .. "," .. ptx5 .. "]" elseif letter == "(" then -- KEEP OLD FOR TIME BEING coordinates = "[" .. pty1 .. "," .. ptx1 .. "],[" .. longx .. "," .. latx .. "],[" .. long .. "," .. lat .. "],[" .. pty2 .. "," .. ptx2 .. "]" coordinates = "[" .. pty1 .. "," .. ptx1 .. "],[" .. longx .. "," .. latx .. "],[" .. long .. "," .. lat .. "],[" .. pty2 .. "," .. ptx2 .. "]" elseif letter == ")" then -- KEEP OLD FOR TIME BEING coordinates = "[" .. pty4 .. "," .. ptx4 .. "],[" .. longx .. "," .. latx .. "],[" .. long .. "," .. lat .. "],[" .. pty3 .. "," .. ptx3 .. "]" coordinates = "[" .. pty4 .. "," .. ptx4 .. "],[" .. longx .. "," .. latx .. "],[" .. long .. "," .. lat .. "],[" .. pty3 .. "," .. ptx3 .. "]" factor = 1 elseif letter == "[" then coordinates = "[" .. pty1 .. "," .. ptx1 .. "],[" .. pty6 .. "," .. ptx6 .. "],[" .. pty5 .. "," .. ptx5 .. "],[" .. pty2 .. "," .. ptx2 .. "]" elseif letter == "]" then coordinates = "[" .. pty4 .. "," .. ptx4 .. "],[" .. pty6 .. "," .. ptx6 .. "],[" .. pty5 .. "," .. ptx5 .. "],[" .. pty3 .. "," .. ptx3 .. "]" factor = 1 elseif letter == "<" then -- KEEP FOR TIME BEING coordinates = "[" .. pty1 .. "," .. ptx1 .. "],[" .. long .. "," .. lat .. "],[" .. pty2 .. "," .. ptx2 .. "]" coordinates = "[" .. pty22 .. "," .. ptx22 .. "],[" .. pty13 .. "," .. ptx13 .. "],[" .. pty18 .. "," .. ptx18 .. "]" elseif letter == ">" then -- KEEP FOR TIME BEING coordinates = "[" .. pty4 .. "," .. ptx4 .. "],[" .. long .. "," .. lat .. "],[" .. pty3 .. "," .. ptx3 .. "]" coordinates = "[" .. pty21 .. "," .. ptx21 .. "],[" .. pty14 .. "," .. ptx14 .. "],[" .. pty17 .. "," .. ptx17 .. "]" factor = 1 elseif letter == "/" then coordinates = "[" .. pty1 .. "," .. ptx1 .. "],[" .. pty3 .. "," .. ptx3 .. "]" elseif letter == "." then -- BUILD LATER coordinates = "[" .. pty17 .. ",".. ptx17 .. "],[" .. pty17 .. "," .. ptx17 .. "]" elseif letter == "@" then coordinates = coordinates elseif letter == " " then coordinates = coordinates factor = 1.75 elseif letter == ":" then coordinates = "[[" .. longx .. "," .. latx .. "],[" .. longx .. "," .. latx .. "]],[[" .. long .. "," .. lat .. "],[" .. long .. "," .. lat .. "]]" end if combinedcoords == "" then combinedcoords = coordinates elseif coordinates ~= "" then combinedcoords = combinedcoords .. "],[" .. coordinates end if string.find(letternow,'%l') == 1 and (string.find(letterafter,'%u') == 1 or string.find(letterafter,'%d') == 1) then radius = radius2 factor = 2 end lat = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) angle = 90 * math.pi /180 ptxnew = lat + (radius * factor) * math.cos( angle ) ptynew = long + (radius * factor) * math.sin( angle ) lat,long = string.format("%.6f",newlat(ptxnew)),string.format("%.6f",ptynew) factor = 2 end coordinates = combinedcoords if boxit == "y" then boxcoordinates = '{ "type": "FeatureCollection", "features": [ {"type": "Feature","geometry": {"type":"LineString", "coordinates":' .. frameit[1] .. frameit[3] .. frameit[2] .. '},"properties":{ "title": "", "description": "", "stroke":"#000000", "stroke-width":1 }},' end if string.match(coordinates,'%]%]%,%[%[') then part1a = string.gsub(part1a,'LineString','MultiLineString') coordinates = "[" .. coordinates .. "]" end part1b = string.gsub(part1b,'%"stroke%-width%"%:1','"stroke-width":3') coordinates = '[' .. coordinates .. ']},' coordinates = string.gsub(coordinates,'%[%[%[%[','[[[') coordinates = string.gsub(coordinates,'%]%]%]%]',']]]') coordinates = string.gsub(coordinates,',%[%[%[',',[[') -- TROUBLE SHOOT LATER coordinates = string.gsub(coordinates,'%]%]%],',']],') if boxit == "y" then part1a = string.gsub(part1a,'{"type": "Feature"',boxcoordinates .. '{"type": "Feature"') part1b = string.gsub(part1b,'</maplink>',']}</maplink>') end coordinates = part1a .. coordinates .. part1b return coordinates end -- House function p.house(frame) local shape = "house" local id = frame.args['id'] or "" local lat,long = "","" if id == nil or id == "" then if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end lat = frame.args['lat'] long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end local group = frame.args['group'] or 'house' local title = frame.args['title'] or 'A house' local description = frame.args['desc'] or '' local r = frame.args['radius'] or ".5" r = tonumber(r) if r > 10 then error("10 for radius is MAX") end if r <= 0 then error("r has to be greater than 0") end local fill = frame.args['fill'] or "#ccef64" local stroke = frame.args['stroke'] or "#0000ff" checkhex(fill,stroke) local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local mapframe = frame.args['mapframe'] or "no" if mapframe == nill or mapframe == "" then mapframe = "no" end local coordinates = "" local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "poly" end local part1a,part1b,part2a,part2b,part3a,part3b,part4a,part4b = parts(lat,long,group,title,description,fill,stroke) lat = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) local angle1,angle2,angle3,angle4 = 0,0,0,0 local angle5,angle6,angle7,angle8 = 0,0,0,0 local ptx,ptx2,ptx3,ptx4 = 0,0,0,0 local ptx5,ptx6,ptx7,ptx8 = 0,0,0,0 local pty,pty2,pty3,pty4 = 0,0,0,0 local pty5,pty6,pty7,pty8 = 0,0,0,0 local a = 360 local b = 270 local c = 270 local d = 240 local e = 120 local f = 90 local g = 90 local h = 360 angle1 = a * math.pi / 180 ptx = lat + r * math.cos( angle1 ) pty = long + r * math.sin( angle1 ) angle2 = b * math.pi /180 ptx2 = lat + (r+r/3) * math.cos( angle2 ) pty2 = long + (r+r/3) * math.sin( angle2 ) angle3 = c * math.pi /180 ptx3 = lat + r * math.cos( angle3 ) pty3 = long + r * math.sin( angle3 ) angle4 = d * math.pi /180 ptx4 = lat + (r*1.20) * math.cos( angle4 ) pty4 = long + (r*1.20) * math.sin( angle4 ) angle5 = e * math.pi /180 ptx5 = lat + (r*1.20) * math.cos( angle5 ) pty5 = long + (r*1.20) * math.sin( angle5 ) angle6 = f * math.pi /180 ptx6 = lat + r * math.cos( angle6 ) pty6 = long + r * math.sin( angle6 ) angle7 = g * math.pi /180 ptx7 = lat + (r+r/3) * math.cos( angle7 ) pty7 = long + (r+r/3) * math.sin( angle7 ) angle8 = h * math.pi /180 ptx8 = lat + r * math.cos( angle8 ) pty8 = long + r * math.sin( angle8 ) ptx,pty = string.format("%.6f",newlat(ptx)),string.format("%.6f",pty) ptx2,pty2 = string.format("%.6f",newlat(ptx2)),string.format("%.6f",pty2) ptx3,pty3 = string.format("%.6f",newlat(ptx3)),string.format("%.6f",pty3) ptx4,pty4 = string.format("%.6f",newlat(ptx4)),string.format("%.6f",pty4) ptx5,pty5 = string.format("%.6f",newlat(ptx5)),string.format("%.6f",pty5) ptx6,pty6 = string.format("%.6f",newlat(ptx6)),string.format("%.6f",pty6) ptx7,pty7 = string.format("%.6f",newlat(ptx7)),string.format("%.6f",pty7) ptx8,pty8 = string.format("%.6f",newlat(ptx8)),string.format("%.6f",pty8) lat,long = string.format("%.6f",newlat(lat)),string.format("%.6f",long) coordinates = "[" .. pty .. "," .. ptx .. "],[" .. pty2 .. "," .. ptx2 .. "],[" coordinates = coordinates .. pty3 .. "," .. ptx3 .. "],[".. pty4 .. "," .. ptx4 .. "],[" coordinates = coordinates .. pty5 .. "," .. ptx5 .. "],[".. pty6 .. "," .. ptx6 .. "],[" coordinates = coordinates .. pty7 .. "," .. ptx7 .. "],[".. pty8 .. "," .. ptx8 .. "],[" coordinates = coordinates .. pty .. "," .. ptx .. "]" if mapframe == "y" or mapframe == "yes" then if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part4a .. coordinates .. part4b else coordinates = '[' .. coordinates .. ']},' coordinates = part3a .. coordinates .. part3b end else if type == "poly" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part2a .. coordinates .. part2b else coordinates = '[' .. coordinates .. ']},' coordinates = part1a .. coordinates .. part1b end end if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center House|lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end -- x - draw 2 lines to make an X function p.x(frame) local shape = "x" local id = frame.args['id'] or "" local lat = frame.args['lat'] or "" local long = frame.args['long'] or "" local r = frame.args['radius'] or 2 if id == "" or id == nil then if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end lat = frame.args['lat'] long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end else id = checkid(id) lat = latitude(id) long = longitude(id) end local group = frame.args['group'] or 'other' local title = frame.args['title'] or 'X' local description = frame.args['desc'] or "" if description == nil then description = "" end local fill = "#000000" local stroke = frame.args['stroke'] or "#ffccaa" if string.len(stroke) ~= 7 then error("Incorrect length for argument color!") end if string.gsub(stroke,"#[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]","") ~= "" then error("Incorrect hexidecimal format for argument color!") end local strokewidth = frame.args['strokewidth'] or "3" local mapframe = frame.args['mapframe'] or "no" if mapframe == nil or mapframe == "" then mapframe = "no" end local a,b,c,d = 315,135,45,225 local angle1,angle2,angle3,angle4 = 0,0,0,0 local ptx,ptx2,ptx3,ptx4 = 0,0,0,0 local pty,pty2,pty3,pty4 = 0,0,0,0 lat = math.log(math.tan((90 + lat) * math.pi/360)) / (math.pi/180) angle1 = a * math.pi / 180 ptx = lat + r * math.cos( angle1 ) pty = long + r * math.sin( angle1 ) angle2 = b * math.pi /180 ptx2 = lat + r * math.cos( angle2 ) pty2 = long + r * math.sin( angle2 ) angle3 = c * math.pi /180 ptx3 = lat + r * math.cos( angle3 ) pty3 = long + r * math.sin( angle3 ) angle4 = d * math.pi /180 ptx4 = lat + r * math.cos( angle4 ) pty4 = long + r * math.sin( angle4 ) ptx,pty = string.format("%.6f",newlat(ptx)),string.format("%.6f",pty) ptx2,pty2 = string.format("%.6f",newlat(ptx2)),string.format("%.6f",pty2) ptx3,pty3 = string.format("%.6f",newlat(ptx3)),string.format("%.6f",pty3) ptx4,pty4 = string.format("%.6f",newlat(ptx4)),string.format("%.6f",pty4) local coords = "" coords = ptx .. "," .. pty .. "@" .. ptx2 .. "," .. pty2 .. "@" .. ptx3 .. "," .. pty3 .. "@" .. ptx4 .. "," .. pty4 -- if coords ~= "" then return coords end local separator = "@" local coordsx = {} local coordinates = "" local count = 1 local type = "line" for str in string.gmatch(coords,"([^"..separator.."]+)") do if str ~= nil and str ~= "" then lat = string.gsub(str,",.*",'') long = string.gsub(str,"^.*,",'') if tonumber( lat ) > 90 or tonumber( lat ) < -90 then error("Latitudes must be between 90 and -90!") end if tonumber(long) > 180 or tonumber(long) < -180 then error("Longitudes must be between 180 and -180!") end coordsx[count] = string.format("%.6f",long) .. "," .. string.format("%.6f",lat) count = count + 1 end end local mod = math.mod(table.getn(coordsx),2) if mod == 1 then error("Need even number of matching coordinates!") end -- local i = 1 -- for i = 1,table.getn(coordsx),1 do -- coordinates = coordinates .. "[" .. coordsx[i] .. "]@@@@@" -- i = i + 1 -- coordinates = coordinates .. "[" .. coordsx[i] .. "]]@@@@@[" -- -- if i == table.getn(coordsx) then break end -- end for k,v in ipairs(coordsx) do if math.mod(k,2) == 1 then coordinates = coordinates .. "[" .. v .. "]@@@@@" else coordinates = coordinates .. "[" .. v .. "]]@@@@@[" end end coordinates = string.gsub(coordinates,"@@@@@",",") coordinates = string.gsub(coordinates,"%],%[$",'') coordinates = string.gsub(coordinates, '%,$','') -- if coordinates ~= "" then return coordinates end local part1a = '<maplink class="no-icon" text="" latitude="' .. lat .. '" longitude="' .. long .. '" ' local part1a = part1a .. 'zoom="5" group="' .. group .. '">\n{"type": "Feature","geometry":' local part1a = part1a .. '{ \n\t"type":"MultiLineString",\n\t"coordinates":\n' local part1b = '\n\t"properties":{\n\t\t"title": "' .. title .. '",\n' local part1b = part1b .. '\t\t"description": "' .. description .. '",\n' local part1b = part1b .. '\t\t"stroke":"' .. stroke .. '",\n\t\t"stroke-width":' .. strokewidth .. '\n}}\n</maplink>\n' local part2a = '<mapframe text="" latitude="' .. lat .. '" longitude="' .. long .. '" ' part2a = part2a .. 'zoom="5" group="' .. group .. '" width="600" height="400" >\n{"type": "FeatureCollection",\n\t"features":' part2a = part2a .. '[\n\t\t{\n\t\t"type": "Feature",\n\t\t"geometry": { \n\t"type":"MultiLineString",\n\t"coordinates":\n\t\t' local part2b = '\n\t"properties":{\n\t\t"title": "' .. title .. '",\n' part2b = part2b .. '\t\t"description": "' .. description .. '",\n\t\t' part2b = part2b .. '\t\t"stroke":"' .. stroke .. '",\n\t\t"stroke-width":' .. strokewidth .. ',\n\t\t\t' part2b = part2b .. '}\n}]}\n</mapframe>\n' -- No Polygons just MultiLineString if mapframe == "y" or mapframe == "yes" then coordinates = '[[' .. coordinates .. ']]},' coordinates = part2a .. coordinates .. part2b else coordinates = '[[' .. coordinates .. ']]},' coordinates = part1a .. coordinates .. part1b end -- No Markers unless wanted can code - could end up with a few or large amount of markers return coordinates end -- END MODULE return p