Hi Gurus I am trying to make something similar to http://mapwow.com/ I already have a very large image divisible by 256x squares. I am using this tile cutter script which produced tiles that start from 3_120024_18968.jpg to 2_60000_9472.jpg
/* Tile Carver for Photoshop (modified by Nate, only tested in CS3) Created by Will James http://onNYTurf.com Transparency option added by Curtis Wyatt http://gocalipso.com/ Hacked apart and updated to add support for creating multiple zoom levels at once Automatically adds extra tiles/pixels where needed Can save as PNG, JPEG, and/or GIF Now operates much faster with multiple layers/transparencies Nate Bundy http://www.lemonrage.com/ */ //**** YOU SHOULD CUSTOMIZE THE FOLLOWING VARIABLE DEPENDING ON YOUR NEED **** var HighestZoomLevel = 3; // Enter the highest zoom level we are creating tiles for (should be less than OrgZoom; technically the script should be able to handle values larger as well, but your image quality will suffer) var LowestZoomLevel = 2; // Enter the last zoom level we want to create tiles for (must be <= HighestZoomLevel for the script to do anything) var FolderPath = "/Users/christophe/Desktop/test/"; //<-- path to where we will save our tiles // We start with the coordinates, zoom, and width of an upper left corner tile and generate everything from there // We can calculate new tile values from these values for any zoom level without having to look up these details for each. var OrgX = 30000; // the Google Maps X value of the tile at the top left corner of your Photoshop document var OrgY = 4736; // the Google Maps Y value of the tile at the top left corner of your Photoshop document var OrgZoomLevel = 1; // the Google Maps zoom level of your Photoshop document (for best results, you will need to resize your Photoshop document to match a zoom level as closely as possible before running this script) var PixelWidth = 256; // Your width and height should be 256 unless you override Google's default in a custom map type var PixelHeight = 256; // set each file type to true that you wish the script to save out. you may save out all three at the same time if you wish var saveJPEG = true; var savePNG = false; var saveGIF = false; // Note (by Nate): I've dramatically increased the speed of the transparent path. It's even faster than the old transparency=false path now. Taking unnecessary snapshots was slowing the transparent path down quite a bit. Now the main speed limiter is saving each tile out to disk, and I doubt there's a way to speed that up. //**** EVERYTHING BEYOND HERE SHOULD NOT BE TOUCHED UNLESS YOU KNOW WHAT YOU ARE DOING!!! // Exponent Function // we will need these later /*function PowMe(a, b){ var o = a; for (n = 1; n < b; n++){ o *= a; } if (b==0){ o = 1; } return o; };*/ // why the custom power function? switched to built in Math.pow() var currentDocument = app.activeDocument; // Run the script on the active document // via http://www.ps-scripts.com/bb/viewtopic.php?p=343 function takeSnapshot () { var id686 = charIDToTypeID( "Mk " ); var desc153 = new ActionDescriptor(); var id687 = charIDToTypeID( "null" ); var ref119 = new ActionReference(); var id688 = charIDToTypeID( "SnpS" ); ref119.putClass( id688 ); desc153.putReference( id687, ref119 ); var id689 = charIDToTypeID( "From" ); var ref120 = new ActionReference(); var id690 = charIDToTypeID( "HstS" ); var id691 = charIDToTypeID( "CrnH" ); ref120.putProperty( id690, id691 ); desc153.putReference( id689, ref120 ); executeAction( id686, desc153, DialogModes.NO ); } function revertToLastSnapshot() { var docRef = app.activeDocument; var hsObj = docRef.historyStates; var hsLength = hsObj.length; for (var i = hsLength-1; i > -1; i--) { if(hsObj[i].snapshot) { docRef.activeHistoryState = hsObj.getByName('Snapshot ' + i); break; } } } function revertToSnapshot(snapshotID) { currentDocument.activeHistoryState = currentDocument.historyStates[snapshotID]; } function getLastSnapshotID() { var docRef = app.activeDocument; var hsObj = docRef.historyStates; var hsLength = hsObj.length; for (var i = hsLength-1; i > -1; i--) { if(hsObj[i].snapshot) { return i; break; } } } function getVisibleLayers(doc) { var tempArray = new Array(); for (var i = 0; i < doc.layers.length; i++) { if (doc.layers[i].visible) tempArray.push(i); } return tempArray; } function isLayerEmpty(doc, layer) { if (!doc) { doc = app.activeDocument; } if (!layer) { layer = doc.activeLayer; } return parseInt(layer.bounds.toString().replace(/\D/g,"")) == 0; } function visibleLayersEmpty(doc) { var bool = true; if (!doc) { doc = app.activeDocument; } for (var i = 0; i < visibleLayers.length; i++) { bool = isLayerEmpty(doc, doc.layers[visibleLayers[i]]); if (!bool) return bool; } return bool; } var startRulerUnits = app.preferences.rulerUnits; // Save the current preferences app.preferences.rulerUnits = Units.PIXELS; // Set Photoshop to use pixels // Find the visible layers var visibleLayers = getVisibleLayers(currentDocument); var ZoomLevel = HighestZoomLevel; var LastZoomLevel = OrgZoomLevel; var CurrentX = OrgX; var CurrentY = OrgY; // Take initial snapshot. We'll go back to this once we're finished to leave the document in the state we started // TODO: I'm not sure how to delete snapshots, but I'd like to do that in the future as well to leave the document EXACTLY as we opened it takeSnapshot(); var InitialSnapshotID = getLastSnapshotID(); // Do the following for each zoom level the user wants while (ZoomLevel >= LowestZoomLevel) { // add padding to make starting X and Y tile values divisible by 2^(LastZoomLevel - DesiredZoom) // first, get X and Y values needed for previous zoom level to resize properly to next zoom level we're outputting var ExpectedX = Math.floor(CurrentX / Math.pow(2, LastZoomLevel - ZoomLevel)); var NewX = ExpectedX * Math.pow(2, LastZoomLevel - ZoomLevel); var ExpectedY = Math.floor(CurrentY / Math.pow(2, LastZoomLevel - ZoomLevel)); var NewY = ExpectedY * Math.pow(2, LastZoomLevel - ZoomLevel); var XTilesNeeded = CurrentX - NewX; var YTilesNeeded = CurrentY - NewY; // Now add padding for the extra tiles needed currentDocument.resizeCanvas(currentDocument.width.value + (XTilesNeeded * PixelWidth), currentDocument.height.value + (YTilesNeeded * PixelHeight), AnchorPosition.BOTTOMRIGHT); CurrentX = ExpectedX; CurrentY = ExpectedY; // Ensure total width and height of canvas is a multiple of PixelWidth and PixelHeight respectively var BottomPaddingNeeded = (Math.ceil(currentDocument.height.value / PixelHeight) * PixelHeight) - currentDocument.height.value; var RightPaddingNeeded = (Math.ceil(currentDocument.width.value / PixelWidth) * PixelWidth) - currentDocument.width.value; currentDocument.resizeCanvas(currentDocument.width.value + RightPaddingNeeded, currentDocument.height.value + BottomPaddingNeeded, AnchorPosition.TOPLEFT); // Add padding to make number of tiles divisible by 2^(LastZoomLevel - DesiredZoom) var NumXTiles = currentDocument.width.value / PixelWidth; var NumYTiles = currentDocument.height.value / PixelHeight; var NumXTilesNeeded = Math.ceil(NumXTiles / Math.pow(2, LastZoomLevel - ZoomLevel)) * Math.pow(2, LastZoomLevel - ZoomLevel); var NumYTilesNeeded = Math.ceil(NumYTiles / Math.pow(2, LastZoomLevel - ZoomLevel)) * Math.pow(2, LastZoomLevel - ZoomLevel); NumXTilesNeeded = NumXTilesNeeded - NumXTiles; NumYTilesNeeded = NumYTilesNeeded - NumYTiles; currentDocument.resizeCanvas(currentDocument.width.value + (NumXTilesNeeded * PixelWidth), currentDocument.height.value + (NumYTilesNeeded * PixelHeight), AnchorPosition.TOPLEFT); NumXTiles = NumXTiles + NumXTilesNeeded; NumYTiles = NumYTiles + NumYTilesNeeded; // Now resize the canvas and image by .5^(LastZoomLevel - ZoomLevel) (Decrease size by 50% for each zoom level) if (ZoomLevel < LastZoomLevel) { var ResizeFactor = Math.pow(0.5, (LastZoomLevel - ZoomLevel)); currentDocument.resizeImage(currentDocument.width.value * ResizeFactor, currentDocument.height.value * ResizeFactor); } // Now that we're done resizing the image and canvas, take a snapshot for this zoom level takeSnapshot(); var ZoomLevelSnapshotID = getLastSnapshotID(); var StartX = CurrentX; var StartY = CurrentY; var xTiles = parseInt(currentDocument.width.value, 10) / PixelWidth; var yTiles = parseInt(currentDocument.height.value, 10) / PixelHeight; var TotalTiles = xTiles * yTiles; //<-- calculate the total number of tiles // Counters to track which x value and which y value we are on in our image tile grid var xm = 0; var ym = 0; var TileX = StartX; //<-- Set out first Google X value - later used in file name var TileY = StartY; //<-- Set out first Google Y value - later used in file name // Cut 'em up // For each tile we need to make, we repeat each step in this loop for (n=1; n<TotalTiles+1; n++) { // We cut up tiles column by column // I.E. we cut up all the tiles for a given x value before moving on to the next x value. // We do this by checking if the y value we are on is the last tile in a column // We compare our y counter to our total y number of Tiles, if they are the same is we do the following if (parseInt(ym, 10) == parseInt(yTiles, 10)) { xm += 1; //<-- Up the x value by 1, i.e. we move over to the next column ym = 0; //<-- Reset the y value to 0 so we start back at the top of our new column TileX += 1; //<-- Increase our Google X value for our file name TileY = StartY; //We reset our Google Y value for out file name everytime we change columns } // Based on our our TileWidth and TileHeight and the column we are on we determine our selection origin and area values MyXO = xm*(PixelWidth); MyXL = xm*(PixelWidth)+(PixelWidth); MyYO = ym*(PixelHeight); MyYL = ym*(PixelHeight)+(PixelHeight); //try { currentDocument.crop(Array(MyXO, MyYO, MyXL, MyYL)); /*} catch (e) { alert("xm: " + xm + ", ym: " + ym + ", MyXO: " + MyXO + ", MyYO: " + MyYO + ", MyXL: " + MyXL + ", MyYL: " + MyYL + ", XTiles: " + xTiles + ", YTiles: " + yTiles + "ym == yTiles?: " + (ym == yTiles)); }*/ if (!visibleLayersEmpty(currentDocument)) { //Save New Doc var saveMe = currentDocument; //Save the file if (saveGIF) { //Set path to file and file name saveFile = new File(FolderPath + ZoomLevel + "_" + TileX + "_" + TileY + ".gif"); //Set save options gifSaveOptions = new GIFSaveOptions(); gifSaveOptions.colors = 64; gifSaveOptions.dither = Dither.NONE; gifSaveOptions.matte = MatteType.NONE; gifSaveOptions.preserveExactColors = 0; gifSaveOptions.transparency = 1; gifSaveOptions.interlaced = 0; saveMe.saveAs(saveFile, gifSaveOptions, true, Extension.LOWERCASE); } if (savePNG) { //Set path to file and file name saveFile = new File(FolderPath + ZoomLevel + "_" + TileX + "_" + TileY + ".png"); pngSaveOptions = new PNGSaveOptions(); pngSaveOptions.interlaced = 0; saveMe.saveAs(saveFile, pngSaveOptions, true, Extension.LOWERCASE); } if (saveJPEG) { //Set path to file and file name saveFile = new File(FolderPath + ZoomLevel + "_" + TileX + "_" + TileY + ".jpg"); jpegSaveOptions = new JPEGSaveOptions(); jpegSaveOptions.formatOpsions = FormatOptions.STANDARDBASELINE; jpegSaveOptions.matte = MatteType.NONE; jpegSaveOptions.quality = 5; saveMe.saveAs(saveFile, jpegSaveOptions, true, Extension.LOWERCASE); } } revertToSnapshot(ZoomLevelSnapshotID); //saveMe.close(SaveOptions.DONOTSAVECHANGES); //Advance Y counter for next image ym += 1; //Advance Google Y value for next image name TileY += 1; } //revertToLastSnapshot(); LastZoomLevel = ZoomLevel; ZoomLevel--; } // Leave the document as we opened it revertToSnapshot(InitialSnapshotID); // Restore application preferences app.preferences.rulerUnits = startRulerUnits; Now I don t understand how to set var OrgX = 30000; // the Google Maps X value of the tile at the top left corner of your Photoshop document var OrgY = 4736; // the Google Maps Y value of the tile at the top left corner of your Photoshop document var OrgZoomLevel = 1; and I have no idea how to make the custom map work. I tried reproducing the map from the url above and failed. I tried some of the pages linked in other forums without success. I need help figuring our what settings to use in the javascript and also the cutter settings. How do I make images with names like 1_000_000.jpg to 15_000_000 for example My final image is 13056pix by 13056pix, I need to find/understand - script code to use within the page to build map - settings for the cutter - naming of image folders and paths/locations Thanks in advance. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Google Maps API" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/Google-Maps-API?hl=en -~----------~----~----~----~------~----~------~--~---
