The solution, Mercator projection:
local function mercatorY(lat)
local radLat = math.rad(lat)
return math.deg(math.log (math.tan(radLat) + 1/math.cos(radLat)))
end
And it will be called as
local x = tonumber(nodeStr:match('lon="(.-)"')) -- X
local y = mercatorY(tonumber(nodeStr:match('lat="(.-)"'))) -- new code
and
local minY = mercatorY(tonumber(minLat))
local maxY = mercatorY(tonumber(maxLat))