gramps/src/images/mk_blue_marble.py

106 lines
3.6 KiB
Python

#!/usr/bin/python
# Script to create smaller map tiles for use in the GRAMPS MapView.
# (c) Martin Hawlisch, martin.hawlisch@gmx.de, 2006.
# I hereby put this script into the public domain.
# Images are generated by using the NASA Blue Marble next generation images.
# http://visibleearth.nasa.gov/view_set.php?categoryID=2355
# July, Blue Marble Next Generation w/ Topography and Bathymetry:
# http://visibleearth.nasa.gov/view_rec.php?id=7106
# 5400 pixel jpeg file:
# http://veimages.gsfc.nasa.gov/7106/world.topo.bathy.200407.3x5400x2700.jpg
# This images are public domain.
import os
import sys
tile_defines = []
def process_file( imagefile, image_width, image_height, map_x, map_y, map_width, outfilepattern, tile_size):
y = 0
while (y*tile_size) < image_height:
x = 0
while (x*tile_size) < image_width:
outfile = outfilepattern % (y,x)
if not os.path.isfile( outfile):
cmd = "jpegtran -optimize -crop %dx%d+%d+%d -outfile %s %s" %\
(tile_size,tile_size,x*tile_size,y*tile_size,outfile,imagefile)
print cmd
if os.system( cmd):
print("WARNING: lossless crop using jpegtran (part of libjpeg-progs) failed. Trying lossy fallback")
cmd = "convert %s -crop %dx%d+%d+%d %s" %\
(imagefile,tile_size,tile_size,x*tile_size,y*tile_size,outfile)
print cmd
if os.system( cmd):
sys.exit("ERROR, image crop using jpegtran (part of libjpeg-progs) and imagemagick failed.")
else:
print "tile %s already exists" % outfile
tile_width = map_width/(image_width/tile_size)
tile_x = map_x + tile_width * x
tile_y = map_y - tile_width * y
print "location: %dx%d" % (tile_x,tile_y)
tile_defines.append("self.zoom_map.add_map_source('%s', %d,%d, %d,%d, %d,%d)" %\
(outfile,tile_x,tile_y,tile_width,tile_width,tile_size,tile_size))
x = x + 1
y = y + 1
pass
def scale_down( infile, outfile, new_width):
if not os.path.isfile( outfile):
cmd = "convert %s -resize %d %s" % (infile,new_width,outfile)
print cmd
if os.system( cmd):
sys.exit("ERROR. Scaling down using imagemagick failed.")
else:
print "scaled down image %s already exists" % outfile
def fetch_image( server, filename):
if not os.path.isfile( sourcemap_midres):
print "downloading map file %s" % filename
cmd = "wget -v %s/%s" % (server, sourcemap_midres)
print cmd
if os.system( cmd):
sys.exit("ERROR, image download using wget failed.")
else:
print "mapfile %s already downloaded" % filename
server = "http://veimages.gsfc.nasa.gov/7130"
# Step 1: Fetch mid-res image
sourcemap_midres = "world.topo.200407.3x5400x2700.jpg"
fetch_image( server, sourcemap_midres)
# Step 2: Scale that down a bit (to a multiple of 16 pixels)
sourcemap_lowres = "world.topo.200407.3x3200x1600.jpg"
scale_down(sourcemap_midres,sourcemap_lowres,3200)
# Step 3: Create tiles
process_file( sourcemap_lowres, 3200, 1600, -180, 90, 360, "world.topo.200407.3x3200x1600_tile_%d_%d.jpg",400)
# Step 4: Scale down mid-res image to 2048x1024
sourcemap_lowres = "world.topo.200407.3x1600x800.jpg"
scale_down(sourcemap_midres,sourcemap_lowres,1600)
# Step 4: Tile low-res image
process_file( sourcemap_lowres, 1600, 800, -180, 90, 360, "world.topo.200407.3x1600x800_tile_%d_%d.jpg",400)
# Step 5: Scale down once more
sourcemap_thumb = "world.topo.200407.3x800x400.jpg"
scale_down(sourcemap_lowres,sourcemap_thumb,800)
# Step 5: Scale down thumb-scale image
sourcemap_thumb = "world.topo.200407.3x400x200.jpg"
scale_down(sourcemap_lowres,sourcemap_thumb,400)
# Step 5: Scale down thumb-scale image
sourcemap_thumb = "world.topo.200407.3x128x60.jpg"
scale_down(sourcemap_lowres,sourcemap_thumb,128)
for d in tile_defines:
print d