var selectedTiles = []; var z = 8; var maxTiles = Math.pow(2, z); var map = new OpenLayers.Map("Map", { maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34), numZoomLevels:18, maxResolution:156543.0339, units:'m', projection: "EPSG:900913", displayProjection: new OpenLayers.Projection("EPSG:4326") }); var layer = new OpenLayers.Layer.TMS("Archive.org Tiles", ["http://www.archive.org/download/SharedMapTiles"], { type: 'png', getURL: getArchiveTileURL, displayOutsideMaxExtent: true, attribution: '(C) CC-by-SA FOSM.org', transitionEffect: 'resize'}); map.addLayer(layer); var control = new OpenLayers.Control(); OpenLayers.Util.extend(control, { draw: function () { // this Handler.Box will intercept the shift-mousedown // before Control.MouseDefault gets to see it this.box = new OpenLayers.Handler.Box( control, {"done": this.notice}, {keyMask: OpenLayers.Handler.MOD_SHIFT}); this.box.activate(); }, notice: function (bounds) { var ul = map.getLonLatFromPixel(new OpenLayers.Pixel(bounds.left, bounds.top)); var br = map.getLonLatFromPixel(new OpenLayers.Pixel(bounds.right, bounds.bottom)); ul.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326")); br.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326")); var x1 = lonToX(ul.lon, z); var y1 = latToY(ul.lat, z); var x2 = lonToX(br.lon, z); var y2 = latToY(br.lat, z); var tileReq = (x2 - x1) * (y2 - y1); if(tileReq <= 500) { for(i = x1; i <= x2; i++) for(j = y1; j <= y2; j++) invertTileAtLL(i, j); } else alert("You tried to invert too many tiles at once, the limit is 100, you attempted "+tileReq); } }); map.addControl(control); map.setCenter(lonLatToMercator(new OpenLayers.LonLat(lng, lat)), zoom); OpenLayers.IMAGE_RELOAD_ATTEMPTS = 3; OpenLayers.Util.onImageLoadError = function() { this.src = "404.png"; } var vectorLayer = new OpenLayers.Layer.Vector("Vector Layer"); map.addLayer(vectorLayer); var style_green = { strokeColor: "#000000", strokeOpacity: 0.2, strokeWidth: 1, fillColor: "#00FF00", fillOpacity: 0.1 }; map.events.register('click', map, handleMapClick); map.addControl(new OpenLayers.Control.Attribution()); function handleMapClick(evt) { var ll = map.getLonLatFromPixel(evt.xy); ll.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326")); var x = lonToX(ll.lon, z); var y = latToY(ll.lat, z); invertTileAtLL(x, y); } function invertTileAtLL(x, y) { var tileID = x * maxTiles + y; if(selectedTiles.length > tileID && selectedTiles[tileID] != undefined) { var thisTile = selectedTiles[tileID]; vectorLayer.removeFeatures([thisTile]); selectedTiles[tileID] = undefined; return; } var lat1 = tileToLat(y, z); var lon1 = tileToLon(x, z); var lat2 = tileToLat(y + 1, z); var lon2 = tileToLon(x + 1, z); // alert("Z: " + z + ", Lat1: " + lat1 + ", Lon1: " + lon1 + ", Lat2: " + lat2 + ", Lon2: " + lon2); var p1 = llToPoint(new OpenLayers.Geometry.Point(lon1, lat1)); var p2 = llToPoint(new OpenLayers.Geometry.Point(lon2, lat1)); var p3 = llToPoint(new OpenLayers.Geometry.Point(lon2, lat2)); var p4 = llToPoint(new OpenLayers.Geometry.Point(lon1, lat2)); var points = new Array(p1, p2, p3, p4, p1); var linearRing = new OpenLayers.Geometry.LinearRing(points); var thisTile = new OpenLayers.Feature.Vector(linearRing, null, style_green); vectorLayer.addFeatures([thisTile]); selectedTiles[tileID] = thisTile; } function llToPoint(p) { return p.transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject()); }