1 | '''
|
---|
2 | First step in generating a terrain script of the entire world
|
---|
3 | Assumes you have the SRTM tiles of the entire world
|
---|
4 |
|
---|
5 | Instead of loading all tiles and making a map,
|
---|
6 | writes a geo-referenced image per slice.
|
---|
7 |
|
---|
8 | Use gen_tiles_from_images.py to convert these images to web tiles.
|
---|
9 | Use convert_georef.py to convert Maperitive's georef format to GDAL's
|
---|
10 |
|
---|
11 | '''
|
---|
12 | import os
|
---|
13 | import argparse
|
---|
14 |
|
---|
15 | #defaults which can be modified via command-line params
|
---|
16 | images_dir = "G:\\Images"
|
---|
17 | maperitive_path = "G:\\Maperitive\\"
|
---|
18 | script_file = "gen_images.mscript"
|
---|
19 |
|
---|
20 | #These are the full bounds of the SRTM data
|
---|
21 | map_bounds = {
|
---|
22 | 'W':-180,
|
---|
23 | 'E':180,
|
---|
24 | 'S':-56,
|
---|
25 | 'N':59,
|
---|
26 | }
|
---|
27 |
|
---|
28 | script_head = '''
|
---|
29 | // SCRIPT TO GENERATE WORLD TERRAIN SHADING GEOREFERENCED IMAGES
|
---|
30 | // Expects {src} data in Maperitive/Cache/Rasters/{src}
|
---|
31 | // Will output images to {idir}
|
---|
32 |
|
---|
33 | set-dem-source name={src}
|
---|
34 | '''
|
---|
35 |
|
---|
36 | #To create tiles from these images, uncomment these lines and comment
|
---|
37 | #the clear-map call in script_gen.
|
---|
38 | #NOTE: This will only work if the images are small enough to not fill up
|
---|
39 | # your RAM! Try a large sample rate, such as 4 or 6.
|
---|
40 | script_foot = '''
|
---|
41 | //set-geo-bounds -180,-56,179.999999,60
|
---|
42 | //generate-tiles exclude-partial=true minzoom=1 maxzoom=7 tilesdir=g:\lowtiles
|
---|
43 | '''
|
---|
44 |
|
---|
45 | script_gen = '''
|
---|
46 | //Tile {tnum} of {ttot}
|
---|
47 | clear-map
|
---|
48 | set-geo-bounds {W},{S},{E},{N}
|
---|
49 | generate-relief-igor color="black" intensity=3 sample-rate={rate}
|
---|
50 | //generate-contours interval=10
|
---|
51 | save-source index=1 file={fname}
|
---|
52 | '''
|
---|
53 |
|
---|
54 | def gen_bounds(args):
|
---|
55 | #generate the maperitive script metadata
|
---|
56 | print "Generating script starting at slice", args.index
|
---|
57 |
|
---|
58 | #Break the map into chunks, stepping an input number of degrees
|
---|
59 | EW_step = args.step #longitude
|
---|
60 | NS_step = args.step #latitude
|
---|
61 |
|
---|
62 | EW_range = range(map_bounds['W'], map_bounds['E'], EW_step)
|
---|
63 | NS_range = range(map_bounds['S'], map_bounds['N'], NS_step)
|
---|
64 |
|
---|
65 | if args.srtm3:
|
---|
66 | mem = EW_step * NS_step * (1201*1201*2)
|
---|
67 | else:
|
---|
68 | mem = EW_step * NS_step * (3601*3601*2)
|
---|
69 | total = len(EW_range) * len(NS_range)
|
---|
70 | print "Divided world into {} slices ({:,} bytes each)".format(total,mem)
|
---|
71 |
|
---|
72 | metadata = []
|
---|
73 | num = 1
|
---|
74 | for EW in EW_range:
|
---|
75 | for NS in NS_range:
|
---|
76 | bounds = {
|
---|
77 | 'tnum': num,
|
---|
78 | 'ttot': total,
|
---|
79 | 'W':max(map_bounds['W'], EW),
|
---|
80 | 'E':min(map_bounds['E'], EW + EW_step),
|
---|
81 | 'S':max(map_bounds['S'], NS),
|
---|
82 | 'N':min(map_bounds['N'], NS + NS_step),
|
---|
83 | }
|
---|
84 |
|
---|
85 | if num == args.index:
|
---|
86 | print "Start tile #{tnum}: {W},{S},{E},{N}".format(**bounds)
|
---|
87 | if num >= args.index:
|
---|
88 | metadata.append(bounds)
|
---|
89 |
|
---|
90 | num += 1
|
---|
91 | return metadata
|
---|
92 |
|
---|
93 | def gen_script(data, args):
|
---|
94 | # Generate the maperitive script
|
---|
95 | source = "SRTM3" if args.srtm3 else "SRTM1"
|
---|
96 | with open(os.path.join(args.mdir, "Scripts", args.script), "w") as F:
|
---|
97 | F.write(script_head.format(src=source, idir=args.idir))
|
---|
98 |
|
---|
99 | for elem in data:
|
---|
100 | Fname = "tile_%05d.%s"%(elem['tnum'], args.format)
|
---|
101 | F.write(script_gen.format(fname=os.path.join(args.idir, Fname), rate=args.rate, **elem))
|
---|
102 |
|
---|
103 | F.write(script_foot)
|
---|
104 |
|
---|
105 | def main(args):
|
---|
106 | if not os.path.exists(args.idir):
|
---|
107 | os.mkdir(args.idir)
|
---|
108 |
|
---|
109 | data = gen_bounds(args)
|
---|
110 | gen_script(data, args)
|
---|
111 |
|
---|
112 | if __name__ == '__main__':
|
---|
113 | P = argparse.ArgumentParser(
|
---|
114 | description="Generates a maperitive script to create a set of georeferenced images of the world's terrain",
|
---|
115 | epilog="To create a good set of world data, run with: --srtm3 -s 15 -r 6")
|
---|
116 | P.add_argument("-i", "--index", type=int, default=1,
|
---|
117 | help="Index to start at (helpful to continue a failed run where you left off)")
|
---|
118 | P.add_argument("-s", "--step", type=int, default=15,
|
---|
119 | help="Degrees to step per tile")
|
---|
120 | P.add_argument("-r", "--rate", type=int, default=6,
|
---|
121 | help="Sample rate of hillshading (higher makes a smaller image)")
|
---|
122 | P.add_argument("-f", "--format", choices=["png", "tif", "jpg"], default="png",
|
---|
123 | help="Image format to write")
|
---|
124 | P.add_argument("--srtm3", action="store_true",
|
---|
125 | help="Use the lower-resolution SRTMGL3 data instead of GL1")
|
---|
126 | P.add_argument("--mdir", default=maperitive_path,
|
---|
127 | help="Path to the Maperitive folder to write the script to. Default: %s"%maperitive_path)
|
---|
128 | P.add_argument("--idir", default=images_dir,
|
---|
129 | help="Path to output the generated tiles. Default: %s"%images_dir)
|
---|
130 | P.add_argument("--script", default=script_file,
|
---|
131 | help="File name of the script to generate. Default: %s"%script_file)
|
---|
132 | args = P.parse_args()
|
---|
133 |
|
---|
134 | main(args) |
---|