{"version":3,"file":"reproj.js","sources":["../../src/ol/reproj.js"],"sourcesContent":["/**\n * @module ol/reproj\n */\nimport {createCanvasContext2D} from './dom.js';\nimport {containsCoordinate, createEmpty, extend, getHeight, getTopLeft, getWidth} from './extent.js';\nimport {solveLinearSystem} from './math.js';\nimport {getPointResolution, transform} from './proj.js';\n\n\n/**\n * Calculates ideal resolution to use from the source in order to achieve\n * pixel mapping as close as possible to 1:1 during reprojection.\n * The resolution is calculated regardless of what resolutions\n * are actually available in the dataset (TileGrid, Image, ...).\n *\n * @param {module:ol/proj/Projection} sourceProj Source projection.\n * @param {module:ol/proj/Projection} targetProj Target projection.\n * @param {module:ol/coordinate~Coordinate} targetCenter Target center.\n * @param {number} targetResolution Target resolution.\n * @return {number} The best resolution to use. Can be +-Infinity, NaN or 0.\n */\nexport function calculateSourceResolution(sourceProj, targetProj,\n targetCenter, targetResolution) {\n\n const sourceCenter = transform(targetCenter, targetProj, sourceProj);\n\n // calculate the ideal resolution of the source data\n let sourceResolution = getPointResolution(targetProj, targetResolution, targetCenter);\n\n const targetMetersPerUnit = targetProj.getMetersPerUnit();\n if (targetMetersPerUnit !== undefined) {\n sourceResolution *= targetMetersPerUnit;\n }\n const sourceMetersPerUnit = sourceProj.getMetersPerUnit();\n if (sourceMetersPerUnit !== undefined) {\n sourceResolution /= sourceMetersPerUnit;\n }\n\n // Based on the projection properties, the point resolution at the specified\n // coordinates may be slightly different. We need to reverse-compensate this\n // in order to achieve optimal results.\n\n const sourceExtent = sourceProj.getExtent();\n if (!sourceExtent || containsCoordinate(sourceExtent, sourceCenter)) {\n const compensationFactor = getPointResolution(sourceProj, sourceResolution, sourceCenter) /\n sourceResolution;\n if (isFinite(compensationFactor) && compensationFactor > 0) {\n sourceResolution /= compensationFactor;\n }\n }\n\n return sourceResolution;\n}\n\n\n/**\n * Enlarge the clipping triangle point by 1 pixel to ensure the edges overlap\n * in order to mask gaps caused by antialiasing.\n *\n * @param {number} centroidX Centroid of the triangle (x coordinate in pixels).\n * @param {number} centroidY Centroid of the triangle (y coordinate in pixels).\n * @param {number} x X coordinate of the point (in pixels).\n * @param {number} y Y coordinate of the point (in pixels).\n * @return {module:ol/coordinate~Coordinate} New point 1 px farther from the centroid.\n */\nfunction enlargeClipPoint(centroidX, centroidY, x, y) {\n const dX = x - centroidX;\n const dY = y - centroidY;\n const distance = Math.sqrt(dX * dX + dY * dY);\n return [Math.round(x + dX / distance), Math.round(y + dY / distance)];\n}\n\n\n/**\n * Renders the source data into new canvas based on the triangulation.\n *\n * @param {number} width Width of the canvas.\n * @param {number} height Height of the canvas.\n * @param {number} pixelRatio Pixel ratio.\n * @param {number} sourceResolution Source resolution.\n * @param {module:ol/extent~Extent} sourceExtent Extent of the data source.\n * @param {number} targetResolution Target resolution.\n * @param {module:ol/extent~Extent} targetExtent Target extent.\n * @param {module:ol/reproj/Triangulation} triangulation\n * Calculated triangulation.\n * @param {Array.<{extent: module:ol/extent~Extent,\n * image: (HTMLCanvasElement|HTMLImageElement|HTMLVideoElement)}>} sources\n * Array of sources.\n * @param {number} gutter Gutter of the sources.\n * @param {boolean=} opt_renderEdges Render reprojection edges.\n * @return {HTMLCanvasElement} Canvas with reprojected data.\n */\nexport function render(width, height, pixelRatio,\n sourceResolution, sourceExtent, targetResolution, targetExtent,\n triangulation, sources, gutter, opt_renderEdges) {\n\n const context = createCanvasContext2D(Math.round(pixelRatio * width),\n Math.round(pixelRatio * height));\n\n if (sources.length === 0) {\n return context.canvas;\n }\n\n context.scale(pixelRatio, pixelRatio);\n\n const sourceDataExtent = createEmpty();\n sources.forEach(function(src, i, arr) {\n extend(sourceDataExtent, src.extent);\n });\n\n const canvasWidthInUnits = getWidth(sourceDataExtent);\n const canvasHeightInUnits = getHeight(sourceDataExtent);\n const stitchContext = createCanvasContext2D(\n Math.round(pixelRatio * canvasWidthInUnits / sourceResolution),\n Math.round(pixelRatio * canvasHeightInUnits / sourceResolution));\n\n const stitchScale = pixelRatio / sourceResolution;\n\n sources.forEach(function(src, i, arr) {\n const xPos = src.extent[0] - sourceDataExtent[0];\n const yPos = -(src.extent[3] - sourceDataExtent[3]);\n const srcWidth = getWidth(src.extent);\n const srcHeight = getHeight(src.extent);\n\n stitchContext.drawImage(\n src.image,\n gutter, gutter,\n src.image.width - 2 * gutter, src.image.height - 2 * gutter,\n xPos * stitchScale, yPos * stitchScale,\n srcWidth * stitchScale, srcHeight * stitchScale);\n });\n\n const targetTopLeft = getTopLeft(targetExtent);\n\n triangulation.getTriangles().forEach(function(triangle, i, arr) {\n /* Calculate affine transform (src -> dst)\n * Resulting matrix can be used to transform coordinate\n * from `sourceProjection` to destination pixels.\n *\n * To optimize number of context calls and increase numerical stability,\n * we also do the following operations:\n * trans(-topLeftExtentCorner), scale(1 / targetResolution), scale(1, -1)\n * here before solving the linear system so [ui, vi] are pixel coordinates.\n *\n * Src points: xi, yi\n * Dst points: ui, vi\n * Affine coefficients: aij\n *\n * | x0 y0 1 0 0 0 | |a00| |u0|\n * | x1 y1 1 0 0 0 | |a01| |u1|\n * | x2 y2 1 0 0 0 | x |a02| = |u2|\n * | 0 0 0 x0 y0 1 | |a10| |v0|\n * | 0 0 0 x1 y1 1 | |a11| |v1|\n * | 0 0 0 x2 y2 1 | |a12| |v2|\n */\n const source = triangle.source;\n const target = triangle.target;\n let x0 = source[0][0], y0 = source[0][1];\n let x1 = source[1][0], y1 = source[1][1];\n let x2 = source[2][0], y2 = source[2][1];\n const u0 = (target[0][0] - targetTopLeft[0]) / targetResolution;\n const v0 = -(target[0][1] - targetTopLeft[1]) / targetResolution;\n const u1 = (target[1][0] - targetTopLeft[0]) / targetResolution;\n const v1 = -(target[1][1] - targetTopLeft[1]) / targetResolution;\n const u2 = (target[2][0] - targetTopLeft[0]) / targetResolution;\n const v2 = -(target[2][1] - targetTopLeft[1]) / targetResolution;\n\n // Shift all the source points to improve numerical stability\n // of all the subsequent calculations. The [x0, y0] is used here.\n // This is also used to simplify the linear system.\n const sourceNumericalShiftX = x0;\n const sourceNumericalShiftY = y0;\n x0 = 0;\n y0 = 0;\n x1 -= sourceNumericalShiftX;\n y1 -= sourceNumericalShiftY;\n x2 -= sourceNumericalShiftX;\n y2 -= sourceNumericalShiftY;\n\n const augmentedMatrix = [\n [x1, y1, 0, 0, u1 - u0],\n [x2, y2, 0, 0, u2 - u0],\n [0, 0, x1, y1, v1 - v0],\n [0, 0, x2, y2, v2 - v0]\n ];\n const affineCoefs = solveLinearSystem(augmentedMatrix);\n if (!affineCoefs) {\n return;\n }\n\n context.save();\n context.beginPath();\n const centroidX = (u0 + u1 + u2) / 3;\n const centroidY = (v0 + v1 + v2) / 3;\n const p0 = enlargeClipPoint(centroidX, centroidY, u0, v0);\n const p1 = enlargeClipPoint(centroidX, centroidY, u1, v1);\n const p2 = enlargeClipPoint(centroidX, centroidY, u2, v2);\n\n context.moveTo(p1[0], p1[1]);\n context.lineTo(p0[0], p0[1]);\n context.lineTo(p2[0], p2[1]);\n context.clip();\n\n context.transform(\n affineCoefs[0], affineCoefs[2], affineCoefs[1], affineCoefs[3], u0, v0);\n\n context.translate(sourceDataExtent[0] - sourceNumericalShiftX,\n sourceDataExtent[3] - sourceNumericalShiftY);\n\n context.scale(sourceResolution / pixelRatio,\n -sourceResolution / pixelRatio);\n\n context.drawImage(stitchContext.canvas, 0, 0);\n context.restore();\n });\n\n if (opt_renderEdges) {\n context.save();\n\n context.strokeStyle = 'black';\n context.lineWidth = 1;\n\n triangulation.getTriangles().forEach(function(triangle, i, arr) {\n const target = triangle.target;\n const u0 = (target[0][0] - targetTopLeft[0]) / targetResolution;\n const v0 = -(target[0][1] - targetTopLeft[1]) / targetResolution;\n const u1 = (target[1][0] - targetTopLeft[0]) / targetResolution;\n const v1 = -(target[1][1] - targetTopLeft[1]) / targetResolution;\n const u2 = (target[2][0] - targetTopLeft[0]) / targetResolution;\n const v2 = -(target[2][1] - targetTopLeft[1]) / targetResolution;\n\n context.beginPath();\n context.moveTo(u1, v1);\n context.lineTo(u0, v0);\n context.lineTo(u2, v2);\n context.closePath();\n context.stroke();\n });\n\n context.restore();\n }\n return context.canvas;\n}\n"],"names":["const","let"],"mappings":"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"}