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

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

Changed the cows imports to reflect the new class positions.

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    outputDir = '/data/pnorton/owslib_tests'
89   
90    wmsFolderPath = os.path.join(outputDir, wmsFolderName)
91   
92    if not os.path.exists(wmsFolderPath) :
93        os.mkdir(wmsFolderPath)
94   
95    for dataset, links in cowslinks:
96   
97        if 'WMS' not in links:
98            continue
99   
100        url = links['WMS']
101        getWMSImagesForEndpoint(url, wmsFolderPath, dsName=dataset, **kwargs)
102   
103def getWMSImagesForEndpoint(url, outputFolder, dsName=None, outlineImage=None, 
104                            bbox=(-180, -90, 180, 90),
105                            size=(640, 320),
106                            selectTime='random',
107                            **kwargs):
108   
109    print "\nwms url = %s" % (url,)
110   
111    try:
112        wms = WebMapService(url)#, version='1.3.0')
113       
114    except:
115        print "\nexception getting capabilities for wms with url = %s\n" % (url,)
116        return
117                   
118    #print "get map formats = ", wms.getOperationByName('GetMap').formatOptions
119    #print "operations = ", [op.name for op in wms.operations]
120    #print "wmc.capabilities = ",  wms.capabilities
121
122    if dsName is None:
123        dataset = wms.identification.title
124    else:
125        dataset = dsName
126
127    datasetPath = os.path.join(outputFolder, dataset)
128   
129    if not os.path.exists(datasetPath) :
130        os.mkdir(datasetPath)
131   
132   
133    for layerId, layerMetadata in wms.contents.items():
134#        print "layer id = ", layerId
135        if layerId is None:
136            continue
137
138        i = 0
139        #print "layer metadata = ", layerMetadata
140        #print "time positions = ", layerMetadata.timepositions
141        #print dir(layerMetadata)
142#        for time in layerMetadata.timepositions:
143        #time = layerMetadata.timepositions[0]
144        timePoints = [None]
145        if layerMetadata.timepositions != None:
146            if selectTime == 'random':
147                timePoints = [random.choice(layerMetadata.timepositions)]
148            elif selectTime == 'all':
149                timePoints = layerMetadata.timepositions
150            else:
151                timePoints = [layerMetadata.timepositions[0]]
152       
153        for time in timePoints:
154            try:
155                imgfh = getmap(wms, layers=[layerId], styles=[], 
156                                 srs='EPSG:4326', 
157                                 #bbox=(-112, 36, -106, 41),
158                                 bbox=bbox, 
159                                 size=size, 
160                                 time=time,
161                                 format='image/png',         
162                                 transparent=True,
163                                 **kwargs)
164               
165                img = utils.makePILImage(imgfh)
166                imgfh.close()
167            except:
168                print "\nexception getting image for dataset = %s, layer = %s, time = %s\n" % (dataset, layerId, time)
169                continue
170   
171            if time is None:
172                time = "none"
173   
174            if outlineImage is None:
175                finalImg = img
176            else:
177                finalImg = utils.merge(img, outlineImage)
178   
179            name = '%s_%s_map.png' % (layerId, time)
180            outFile = os.path.join(datasetPath, name)
181            finalImg.save(outFile)
182           
183            name = '%s_frame%02i.png' % (layerId,i,)
184            outFile = os.path.join(datasetPath, name)
185            finalImg.save(outFile)
186                       
187           
188            os.sys.stdout.write(".")
189            os.sys.stdout.flush()
190            i = i + 1
191               
192    #convert *.png output.gif
193
194
195def getLegendForEndpoint(url, outputFolder, dsName=None, 
196                            size=(640, 320),
197                            **kwargs):
198    if dsName is None:
199        dataset = wms.identification.title
200    else:
201        dataset = dsName
202   
203    datasetPath = os.path.join(outputFolder, dataset)
204   
205    if not os.path.exists(datasetPath) :
206        os.mkdir(datasetPath)
207           
208    print "\nwms url = %s" % (url,)
209    wms = WebMapService(url)
210   
211    print "operations = ", [op.name for op in wms.operations]
212    print "get map formats = ", wms.getOperationByName('GetMap').formatOptions
213    print "wmc.capabilities = ",  wms.capabilities   
214   
215    legendLayer = None
216    for layerId, layerMetadata in wms.contents.items():
217        if layerId is None:
218            continue
219        legendLayer = layerId
220       
221    req_url = utils.parseURLString(url, request='GetLegend', layers=legendLayer,
222                                   **kwargs)
223   
224    req = urllib2.Request(req_url)
225    fh = urllib2.urlopen(req)
226    legendImg = utils.makePILImage(fh)
227    fh.close()
228   
229    name = "legend.png"
230    legendImg.save(os.path.join(datasetPath, name))
231   
232if __name__ == '__main__':
233   
234    import time
235    st = time.time()
236   
237    from cowsserver.tests.owslib_tests import SHORT_LOG_FORMAT_STRING
238    logging.basicConfig(level=logging.DEBUG, format=SHORT_LOG_FORMAT_STRING)
239   
240    size = (900,450)
241   
242    cowsEndpoint = 'http://ice.badc.rl.ac.uk:5000/'
243#    cowsEndpoint = 'http://phobos.badc.rl.ac.uk:5000/'
244#    cowsEndpoint = 'http://pampero.badc.rl.ac.uk/cows/'
245
246    olinefh = getmap(WebMapService('http://ice.badc.rl.ac.uk:5000/coastwms'), 
247                        layers=['coastline'], styles=[], 
248                        srs='EPSG:4326', 
249                        bbox=(-180, -90, 180, 90), 
250                        size=size,
251                        format='image/png',
252                        transparent=True)
253   
254    outlineImage = utils.makePILImage(olinefh)
255    olinefh.close()
256       
257    getWMSImagesForCowsEndpoint(cowsEndpoint, outlineImage=outlineImage, size=size)
258   
259#    outputFolder = getOwsLibTestOutputDir()
260#    url = 'http://ice.badc.rl.ac.uk:5000/PML_412_Ocean_Optical/wms'
261#   
262#    getWMSImagesForEndpoint(url, outputFolder,
263#                            dsName='PML_412',
264#                            outlineImage=outlineImage,
265#                            selectTime='all',
266#                            cmap_scale='log',
267#                            size=size
268#                            )
269#   
270#    getLegendForEndpoint(url, outputFolder,
271#                            dsName='PML_412',
272#                            cmap_scale='log',
273#                            size=(900,150),
274#                            cmap_min='1e-5',
275#                            cmap_max='1',
276#                            )
277   
278    print "done in %ss" % (time.time() - st)
279   
Note: See TracBrowser for help on using the repository browser.