source: cowsserver/trunk/lib/cowsserver/tests/owslib_tests/wms_test_image_download.py @ 6072

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/cowsserver/trunk/lib/cowsserver/tests/owslib_tests/wms_test_image_download.py@6072
Revision 6072, 8.5 KB checked in by spascoe, 10 years ago (diff)

Renaming package directory

Line 
1'''
2Created on 19 Nov 2009
3
4@author: pnorton
5'''
6from owslib.wms import WebMapService, ServiceException
7from cowsserver.tests.owslib_tests.owslib_test_utils import parseCowsCatalog
8from cowsserver.tests.owslib_tests import getOwsLibTestOutputDir
9import  xml.etree as etree
10from urllib import urlencode
11import urllib2
12import os
13import time
14import pprint
15import random
16
17import cowsserver.tests.owslib_tests.owslib_test_utils as utils
18
19seed = hash(time.time())
20print "seed = ", seed
21random.seed(seed)
22
23import logging
24
25log = logging.getLogger(__name__)
26
27
28def getmap(wms, layers=None, styles=None, srs=None, bbox=None,
29           format=None, size=None, time=None, transparent=False,
30           bgcolor='#FFFFFF',
31           exceptions='application/vnd.ogc.se_xml',
32           method='Get',
33           **kwargs
34           ):
35        base_url = wms.getOperationByName('GetMap').methods[method]['url']
36        request = {'version': wms.version, 'request': 'GetMap'}
37
38        # check layers and styles
39        assert len(layers) > 0
40        request['layers'] = ','.join(layers)
41        if styles:
42            assert len(styles) == len(layers)
43            request['styles'] = ','.join(styles)
44        else:
45            request['styles'] = ''
46
47        # size
48        request['width'] = str(size[0])
49        request['height'] = str(size[1])
50
51        request['srs'] = str(srs)
52        request['bbox'] = ','.join([str(x) for x in bbox])
53        request['format'] = str(format)
54        request['transparent'] = str(transparent).upper()
55        request['bgcolor'] = '0x' + bgcolor[1:7]
56        request['exceptions'] = str(exceptions)
57        for k, v in kwargs.items():
58            request[k] = str(v)
59
60        if time is not None:
61            request['time'] = str(time)
62
63        data = urlencode(request)
64        if method == 'Post':
65            u = wms._open(base_url, data=data)
66        else:
67            u = wms._open(base_url + data)
68
69        # check for service exceptions, and return
70        if u.info()['Content-Type'] == 'application/vnd.ogc.se_xml':
71            se_xml = u.read()
72            se_tree = etree.fromstring(se_xml)
73            raise ServiceException, \
74                str(se_tree.find('ServiceException').text).strip()
75
76        return u
77
78
79
80def getWMSImagesForCowsEndpoint(cowsEndpoint, **kwargs):
81
82    cowslinks = parseCowsCatalog(cowsEndpoint)
83   
84    wmsFolderName = cowsEndpoint[7:-1]
85   
86    outputDir = getOwsLibTestOutputDir()
87   
88    wmsFolderPath = os.path.join(outputDir, wmsFolderName)
89   
90    if not os.path.exists(wmsFolderPath) :
91        os.mkdir(wmsFolderPath)
92   
93    for dataset, links in cowslinks:
94   
95        url = links['WMS']
96        getWMSImagesForEndpoint(url, wmsFolderPath, dsName=dataset, **kwargs)
97   
98def getWMSImagesForEndpoint(url, outputFolder, dsName=None, outlineImage=None, 
99                            bbox=(-180, -90, 180, 90),
100                            size=(640, 320),
101                            selectTime='random',
102                            **kwargs):
103   
104    print "\nwms url = %s" % (url,)
105    wms = WebMapService(url)#, version='1.3.0')
106    #print "get map formats = ", wms.getOperationByName('GetMap').formatOptions
107    #print "operations = ", [op.name for op in wms.operations]
108    #print "wmc.capabilities = ",  wms.capabilities
109
110    if dsName is None:
111        dataset = wms.identification.title
112    else:
113        dataset = dsName
114
115    datasetPath = os.path.join(outputFolder, dataset)
116   
117    if not os.path.exists(datasetPath) :
118        os.mkdir(datasetPath)
119   
120   
121    for layerId, layerMetadata in wms.contents.items():
122#        print "layer id = ", layerId
123        if layerId is None:
124            continue
125
126        i = 0
127        #print "layer metadata = ", layerMetadata
128        #print "time positions = ", layerMetadata.timepositions
129        #print dir(layerMetadata)
130#        for time in layerMetadata.timepositions:
131        #time = layerMetadata.timepositions[0]
132        timePoints = [None]
133        if layerMetadata.timepositions != None:
134            if selectTime == 'random':
135                timePoints = [random.choice(layerMetadata.timepositions)]
136            elif selectTime == 'all':
137                timePoints = layerMetadata.timepositions
138            else:
139                timePoints = [layerMetadata.timepositions[0]]
140       
141        for time in timePoints:
142            try:
143                imgfh = getmap(wms, layers=[layerId], styles=[], 
144                                 srs='EPSG:4326', 
145                                 #bbox=(-112, 36, -106, 41),
146                                 bbox=bbox, 
147                                 size=size, 
148                                 time=time,
149                                 format='image/png',         
150                                 transparent=True,
151                                 **kwargs)
152               
153                img = utils.makePILImage(imgfh)
154                imgfh.close()
155            except:
156                print "\nexception getting image for dataset = %s, layer = %s, time = %s\n" % (dataset, layerId, time)
157                continue
158   
159            if time is None:
160                time = "none"
161   
162            if outlineImage is None:
163                finalImg = img
164            else:
165                finalImg = utils.merge(img, outlineImage)
166   
167            name = '%s_%s_map.png' % (layerId, time)
168            outFile = os.path.join(datasetPath, name)
169            finalImg.save(outFile)
170           
171            name = '%s_frame%02i.png' % (layerId,i,)
172            outFile = os.path.join(datasetPath, name)
173            finalImg.save(outFile)
174                       
175           
176            os.sys.stdout.write(".")
177            os.sys.stdout.flush()
178            i = i + 1
179           
180        break
181   
182    #convert *.png output.gif
183
184
185def getLegendForEndpoint(url, outputFolder, dsName=None, 
186                            size=(640, 320),
187                            **kwargs):
188    if dsName is None:
189        dataset = wms.identification.title
190    else:
191        dataset = dsName
192   
193    datasetPath = os.path.join(outputFolder, dataset)
194   
195    if not os.path.exists(datasetPath) :
196        os.mkdir(datasetPath)
197           
198    print "\nwms url = %s" % (url,)
199    wms = WebMapService(url)
200   
201    print "operations = ", [op.name for op in wms.operations]
202    print "get map formats = ", wms.getOperationByName('GetMap').formatOptions
203    print "wmc.capabilities = ",  wms.capabilities   
204   
205    legendLayer = None
206    for layerId, layerMetadata in wms.contents.items():
207        if layerId is None:
208            continue
209        legendLayer = layerId
210       
211    req_url = utils.parseURLString(url, request='GetLegend', layers=legendLayer,
212                                   **kwargs)
213   
214    req = urllib2.Request(req_url)
215    fh = urllib2.urlopen(req)
216    legendImg = utils.makePILImage(fh)
217    fh.close()
218   
219    name = "legend.png"
220    legendImg.save(os.path.join(datasetPath, name))
221   
222if __name__ == '__main__':
223   
224    import time
225    st = time.time()
226   
227    from cowsserver.tests.owslib_tests import SHORT_LOG_FORMAT_STRING
228    logging.basicConfig(level=logging.DEBUG, format=SHORT_LOG_FORMAT_STRING)
229   
230    size = (900,450)
231   
232    cowsEndpoint = 'http://ice.badc.rl.ac.uk:5000/'
233#    cowsEndpoint = 'http://phobos.badc.rl.ac.uk:5000/'
234#    cowsEndpoint = 'http://pampero.badc.rl.ac.uk/cows/'
235
236    olinefh = getmap(WebMapService('http://ice.badc.rl.ac.uk:5000/coastwms'), 
237                        layers=['coastline'], styles=[], 
238                        srs='EPSG:4326', 
239                        bbox=(-180, -90, 180, 90), 
240                        size=size,
241                        format='image/png',
242                        transparent=True)
243   
244    outlineImage = utils.makePILImage(olinefh)
245    olinefh.close()
246       
247    #getWMSImagesForCowsEndpoint(cowsEndpoint, outlineImage=outlineImage)
248   
249    outputFolder = getOwsLibTestOutputDir()
250    url = 'http://ice.badc.rl.ac.uk:5000/PML_412_Ocean_Optical/wms'
251   
252    getWMSImagesForEndpoint(url, outputFolder, 
253                            dsName='PML_412',
254                            outlineImage=outlineImage,
255                            selectTime='all',
256                            cmap_scale='log',
257                            size=size
258                            )
259   
260    getLegendForEndpoint(url, outputFolder, 
261                            dsName='PML_412',
262                            cmap_scale='log',
263                            size=(900,150),
264                            cmap_min='1e-5',
265                            cmap_max='1',
266                            )
267   
268    print "done in %ss" % (time.time() - st)
269   
Note: See TracBrowser for help on using the repository browser.