The NASA Blue Marble is reprojected using d3.geo.kavrayskiy7’s invert function. Jason Davies has since done some amazing work on reprojecting raster tiles.
| <!DOCTYPE html> | |
| <meta charset="utf-8"> | |
| <style> | |
| body { | |
| background: #222; | |
| } | |
| </style> | |
| <body> | |
| <script src="//d3js.org/d3.v3.min.js"></script> | |
| <script src="//d3js.org/d3.geo.projection.v0.min.js"></script> | |
| <script> | |
| var width = 960, | |
| height = 500; | |
| var projection = d3.geo.kavrayskiy7(); | |
| var path = d3.geo.path() | |
| .projection(projection); | |
| var canvas = d3.select("body").append("canvas") | |
| .attr("width", width) | |
| .attr("height", height); | |
| var context = canvas.node().getContext("2d"); | |
| var image = new Image; | |
| image.onload = onload; | |
| image.src = "readme-blue-marble.jpg"; | |
| function onload() { | |
| var dx = image.width, | |
| dy = image.height; | |
| context.drawImage(image, 0, 0, dx, dy); | |
| var sourceData = context.getImageData(0, 0, dx, dy).data, | |
| target = context.createImageData(width, height), | |
| targetData = target.data; | |
| for (var y = 0, i = -1; y < height; ++y) { | |
| for (var x = 0; x < width; ++x) { | |
| var p = projection.invert([x, y]), λ = p[0], φ = p[1]; | |
| if (λ > 180 || λ < -180 || φ > 90 || φ < -90) { i += 4; continue; } | |
| var q = ((90 - φ) / 180 * dy | 0) * dx + ((180 + λ) / 360 * dx | 0) << 2; | |
| targetData[++i] = sourceData[q]; | |
| targetData[++i] = sourceData[++q]; | |
| targetData[++i] = sourceData[++q]; | |
| targetData[++i] = 255; | |
| } | |
| } | |
| context.clearRect(0, 0, width, height); | |
| context.putImageData(target, 0, 0); | |
| } | |
| </script> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
