root/trunk/py/compose.py

Revision 480, 4.8 kB (checked in by migurski, 3 months ago)

Added OpenStreetMap? provider

Line 
1 # vim:et sts=4 sw=4:
2
3 import sys, math, optparse, ModestMaps
4
5 def parseWidthHeight(option, opt, values, parser):
6     if values[0] > 0 and values[1] > 0:
7         parser.width = values[0]
8         parser.height = values[1]
9        
10     else:
11         raise optparse.OptionValueError('Image dimensions must be positive (got: width %d, height %d)' % values)
12
13 def assertWidthHeight(parser):
14     try:
15         parser.width, parser.height
16     except AttributeError:
17         raise optparse.OptionValueError('Image dimensions must be provided, e.g.: --dimensions <width> <height>')
18
19 def parseProvider(option, opt, value, parser):
20     if value == 'MICROSOFT_ROAD':
21         parser.provider = ModestMaps.Microsoft.RoadProvider()
22        
23     elif value == 'MICROSOFT_AERIAL':
24         parser.provider = ModestMaps.Microsoft.AerialProvider()
25        
26     elif value == 'MICROSOFT_HYBRID':
27         parser.provider = ModestMaps.Microsoft.HybridProvider()
28        
29     elif value == 'GOOGLE_ROAD':
30         parser.provider = ModestMaps.Google.RoadProvider()
31        
32     elif value == 'GOOGLE_AERIAL':
33         parser.provider = ModestMaps.Google.AerialProvider()
34        
35     elif value == 'GOOGLE_HYBRID':
36         parser.provider = ModestMaps.Google.HybridProvider()
37        
38     elif value == 'GOOGLE_TERRAIN':
39         parser.provider = ModestMaps.Google.TerrainProvider()
40        
41     elif value == 'YAHOO_ROAD':
42         parser.provider = ModestMaps.Yahoo.RoadProvider()
43        
44     elif value == 'YAHOO_AERIAL':
45         parser.provider = ModestMaps.Yahoo.AerialProvider()
46        
47     elif value == 'YAHOO_HYBRID':
48         parser.provider = ModestMaps.Yahoo.HybridProvider()
49        
50     elif value == 'BLUE_MARBLE':
51         parser.provider = ModestMaps.BlueMarble.Provider()
52        
53     elif value == 'OPEN_STREET_MAP':
54         parser.provider = ModestMaps.OpenStreetMap.Provider()
55        
56     else:
57         raise optparse.OptionValueError('Provider must be in eligible list (got: "%s")' % value)
58
59 def assertProvider(parser):
60     try:
61         parser.provider
62     except AttributeError:
63         raise optparse.OptionValueError('Provider must be provided, e.g.: --provider <name>')
64
65 def parseCenterZoom(option, opt, values, parser):
66     assertProvider(parser)
67
68     coordinate = parser.provider.locationCoordinate(ModestMaps.Geo.Location(values[0], values[1])).zoomTo(values[2])
69     coordPoint = ModestMaps.calculateMapCenter(parser.provider, coordinate)
70     parser.coord, parser.offset = coordPoint
71
72 def parseExtent(option, opt, values, parser):
73     assertWidthHeight(parser)
74     assertProvider(parser)
75
76     coordPoint = ModestMaps.calculateMapExtent(parser.provider,
77                                                parser.width, parser.height,
78                                                ModestMaps.Geo.Location(values[0], values[1]),
79                                                ModestMaps.Geo.Location(values[2], values[3]))
80     parser.coord, parser.offset = coordPoint
81
82 parser = optparse.OptionParser(usage="""compose.py [options]
83
84 Example map of San Francisco and Oakland:
85     python compose.py -o out.png -p MICROSOFT_ROAD -d 800 800 -c 37.8 -122.3 11
86
87 Map provider and output image dimensions MUST be specified before extent
88 or center/zoom. Multiple extents and center/zooms may be specified, but
89 only the last will be used.""")
90
91 parser.add_option('-v', '--verbose', dest='verbose',
92                   help='Make a bunch of noise',
93                   action='store_true')
94
95 parser.add_option('-o', '--out', dest='outfile',
96                   help='Write to output file')
97
98 parser.add_option('-c', '--center', dest='centerzoom', nargs=3,
99                   help='Center (lat, lon) and zoom level', type='float',
100                   action='callback', callback=parseCenterZoom)
101
102 parser.add_option('-e', '--extent', dest='extent', nargs=4,
103                   help='Geographical extent (lat, lon pair)', type='float',
104                   action='callback', callback=parseExtent)
105
106 parser.add_option('-p', '--provider', dest='provider',
107                   type='string', help='Map Provider, one of: MICROSOFT_ROAD, MICROSOFT_AERIAL, MICROSOFT_HYBRID, GOOGLE_ROAD, GOOGLE_AERIAL, GOOGLE_HYBRID, GOOGLE_TERRAIN, YAHOO_ROAD, YAHOO_AERIAL, YAHOO_HYBRID',
108                   action='callback', callback=parseProvider)
109
110 parser.add_option('-d', '--dimensions', dest='dimensions', nargs=2,
111                   help='Pixel dimensions (width, height) of resulting image', type='int',
112                   action='callback', callback=parseWidthHeight)
113
114 if __name__ == '__main__':
115
116     (options, args) = parser.parse_args()
117
118     if options.verbose:
119         print parser.coord, parser.offset, '->', options.outfile, (parser.width, parser.height)
120
121     dim = ModestMaps.Core.Point(parser.width, parser.height)
122     map = ModestMaps.Map(parser.provider, dim, parser.coord, parser.offset)
123
124     map.draw(options.verbose).save(options.outfile)
Note: See TracBrowser for help on using the browser.