From 73781656efd76996e769012c2fcfbbdf7d2bff59 Mon Sep 17 00:00:00 2001 From: "christian.schiller" Date: Wed, 10 May 2017 14:42:45 +0200 Subject: [PATCH] release version 0.3 --- EOxWCSClient/cmdline_wcs_client.py | 397 --- EOxWCSClient/wcs_client.py | 114 +- Makefile | 2 +- README.md | 39 +- __init__.py | 2 +- config.py | 34 +- config_srvlist.pkl | 80 - display_txt.py | 47 +- display_txt.ui | 35 +- display_txtdialog.py | 3 +- downloader.py | 14 +- metadata.txt | 14 +- qgsnewhttpconnectionbase.py | 71 +- qgsnewhttpconnectionbase.ui | 119 +- qgsnewhttpconnectionbasedialog.py | 6 +- qgswcsclient2.py | 39 +- qgswcsclient2dialog.py | 612 ++-- ui_qgswcsclient2.py | 1392 +++++--- ui_qgswcsclient2.ui | 4989 ++++++++++++++++------------ 19 files changed, 4375 insertions(+), 3634 deletions(-) delete mode 100755 EOxWCSClient/cmdline_wcs_client.py delete mode 100644 config_srvlist.pkl diff --git a/EOxWCSClient/cmdline_wcs_client.py b/EOxWCSClient/cmdline_wcs_client.py deleted file mode 100755 index 65e9f36..0000000 --- a/EOxWCSClient/cmdline_wcs_client.py +++ /dev/null @@ -1,397 +0,0 @@ -#!/usr/bin/env python - -# -*- coding: utf-8 -*- -""" -#------------------------------------------------------------------------------ -# Name: cmdline_wcs_client.py -# -# Command Line interface to the general purpose WCS 2.0/EO-WCS Client (wcs_client.py): -# This routine allows to use the general purpose WCS 2.0/EO-WCS Client (wcs_client.py) -# from the cmd-line. It importes the wcs_client (required) as a module. -# It provieds extensive help information. -# -# This WCS-Client provides the following functionality: -# - GetCapabilities Request -# - DescribeCoverage Request -# - DescribeEOCoverageSet Request -# - GetMap Request -# -# - return responses -# - download coverages -# - download time-series of coverages -# -# It allows users to specify: -# + Server URL -# + Area of Interest (subset) -# + Time of Interest (time constrain) -# + DatasetSeries or Coverage -# + Rangesubsetting (eg. Bands) -# + File-Format (image format) for downloads -# + output CRS for downloads -# + mediatype -# + updateSequence -# + containment -# + section -# + count -# + interpolation -# + size or resolution -# -# Additional (non-standard parameters implemented: -# + mask -# + IDs_only (DescribeEOCoverageSet returns only CoverageIDs - to be used for immediate download) -# + output (GetCoverage only - local location where downloaded files shall be written too) -# -# -# -# Name: cmdline_wcs_client.py -# Project: DeltaDREAM -# Author(s): Christian Schiller -## -#------------------------------------------------------------------------------- -# Copyright (C) 2014 EOX IT Services GmbH -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies of this Software or works derived from this Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -#------------------------------------------------------------------------------- - -""" - -import sys - -import argparse - # wcs_client provides the WCS/EO-WCS functionality (required) -import wcs_client # as wcsClient - -global __version__ -__version__ = '0.1' - - - -#/************************************************************************/ -#/* _get_cmdline() */ -#/************************************************************************/ -def _get_cmdline(): - """ - Handles the input from the cmd-line, extensive help, and usage information. - It initiates some checks and reformatting of the input from the cmd-line - It uses argparse() with submenus, providing the Mandatory and Optional parameter - handling for each request type. - """ - # print "I'm in "+sys._getframe().f_code.co_name - - #--------------- - class _reformat_outsize(argparse.Action): - """ - reformats and sets the size/resolution parameter for the requested output-size - """ - def __call__(self, cl_parser, namespace, values, option_string=None): - out = '' - label = values[1] - if values[0].startswith('siz'): - out = 'size='+label+'('+values[2] - if values[0].startswith('res'): - out = 'resolution='+label+'('+values[2] - - setattr(namespace, self.dest, out) - - #--------------- - class _chk_time(argparse.Action): - """ - validates and reformats the received time input - """ - def __call__(self, cl_parser, namespace, values, option_string=None): - items = values.split(',') - if len(values) < 1: - raise argparse.ArgumentError - else: - out = ",".join(items) - - setattr(namespace, self.dest, out) - - #--------------- - class _chk_format(argparse.Action): - """ - adapts format input to --> image/format - """ - def __call__(self, cl_parser, namespace, values, option_string=None): - print 'FFF: ',values - - if values == 'tiff': - out = 'image/tiff' - if values == 'jpeg': - out = 'image/jpeg' - if values == 'png': - out = 'image/png' - if values == 'gif': - out = 'image/gif' - - setattr(namespace, self.dest, out) - - #--------------- - class _chk_coord(argparse.Action): - """ - checks and reformats the recieved coordinates and provides the corrcet Axis syntax - """ - def __call__(self, cl_parser, namespace, values, option_string=None): - print namespace - if values[0].startswith('epsg'): - crs = values[0].split(':')[1] - label = values[1] - coord = values[2].strip() - out = label+','+'http://www.opengis.net/def/crs/EPSG/0/'+crs+'('+coord - elif values[0].startswith('pix') or values[0].startswith('ori'): - label = values[1] - coord = values[2].strip() - out = label+'('+coord - else: - print '\n', 'Input causing the Error: ', values - raise argparse.ArgumentError - - setattr(namespace, self.dest, out) - - #--------------- - class _chk_mask(argparse.Action): - """ - some simple checks of the recieved mask values (count, start=end , etc.) - """ - def __call__(self, cl_parser, namespace, values, option_string=None): - if values[0].startswith('epsg'): - coord = values[1].split(',') - else: - coord = values[0].split(',') - - if len(coord) % 2 is 0: - if coord[0] == coord[-2] and coord[1] == coord[-1]: - if values[0].startswith('epsg'): - crs = values[0].split(':')[1] - out = crs+'('+",".join(coord) - else: - out = '4326('+",".join(coord) - else: - raise ValueError('Provided Masking Polygon not closed') - else: - raise ValueError('Provided Mask coordinates are not given in pairs') - - - setattr(namespace, self.dest, out) - - #--------------- - class _cnv2str(argparse.Action): - """ - converts input received as numbers/lists to strings for further usage - """ - def __call__(self, cl_parser, namespace, values, option_string=None): - out = ",".join(values) - setattr(namespace, self.dest, out) - - #--------------- - - # workaround -> this is needed to handle negativ input values (eg. for coordinates) - # otherwise argparser would interpret them as arguments - for i, arg in enumerate(sys.argv): - if (arg[0] == '-') and arg[1].isdigit(): - sys.argv[i] = ' '+arg - - #=============== - - - # the argument parser sections - # Common to all subparsers - common_parser = argparse.ArgumentParser(add_help=False, version='%(prog)s'+': '+ __version__) - - cl_parser = argparse.ArgumentParser(description='WCS 2.0.1/EO-WCS Client routine', parents=[common_parser]) - subparsers = cl_parser.add_subparsers(help='Requests', dest='request') - - - # ==== GetCapabilities parameters - getcap_parser = subparsers.add_parser('GetCapabilities', parents=[common_parser], - help='send a GetCapabilities request') - - # Mandatory parameters - mandatory = getcap_parser.add_argument_group('Mandatory') - mandatory.add_argument('-s', '--server_url', metavar='server_url', dest='server_url', action='store', - required=True, help='the SERVER URL to be contaced') - - # Optional parameters - getcap_parser.add_argument('--updateSequence', metavar='[Date_of_Change]', dest='updateSequence', action='store', - help='to receive a new document only if it has changed since last requested (expressed in ISO-8601 e.g. 2007-04-05)') - - getcap_parser.add_argument('--sections', dest='sections', nargs='*', choices=['DatasetSeriesSummary', 'CoverageSummary', \ - 'Contents', 'ServiceIdentification', 'ServiceProvider', 'OperationsMetadata', 'Languages', 'All'], - help='request one or more section(s) of a Capabilities Document; NOTE: multiple sections need to \ - be supplied within {}; [default=All]', action=_cnv2str) - - - # ==== DescribeCoverage parameters - desccov_parser = subparsers.add_parser('DescribeCoverage', parents=[common_parser], - help='send a DescribeCoverage request') - - # Mandatory parameters - mandatory = desccov_parser.add_argument_group('Mandatory') - - mandatory.add_argument('-s', '--server_url', metavar='server_url', dest='server_url', action='store', - required=True, help='the SERVER URL which should be contaced') - - mandatory.add_argument('--coverageID', metavar='coverageID', required=True, - help='a valid ID of a Coverage or a StitchedMosaic') - - - # ==== DescribeEOCoverageSet parameters - desceocov_parser = subparsers.add_parser('DescribeEOCoverageSet', parents=[common_parser], - help='DescribeEOCoverageSet') - - # Mandatory parameters - mandatory = desceocov_parser.add_argument_group('Mandatory') - - mandatory.add_argument('-s', '--server_url', metavar='server_url', dest='server_url', action='store', - required=True, help='the SERVER URL which should be contaced') - - mandatory.add_argument('--eoID', metavar='eoID', required=True, - help='a valid ID of a: DatasetSeries, Coverage, or StitchedMosaic ') - - # Optional parameters - desceocov_parser.add_argument('--subset_lat', metavar='subset_lat', dest='subset_lat', - help='Allows to constrain the request in Lat-dimensions. \ - The spatial constraint is always expressed in WGS84. ') - - desceocov_parser.add_argument('--subset_lon', metavar='subset_lon', dest='subset_lon', - help='Allows to constrain the request in Long-dimensions. \ - The spatial constraint is always expressed in WGS84. ') - - desceocov_parser.add_argument('--subset_time', metavar='subset_Start, subset_End', action=_chk_time, - help='Allows to constrain the request in Time-dimensions. The temporal \ - constraint is always expressed in ISO-8601 format and in the UTC time zone \ - (e.g. -subset_time 2007-04-05T14:30Z,2007-04-07T23:59Z). ') - - desceocov_parser.add_argument('--containment', choices=['overlaps', 'contains'], - help='Allows to limit the spatial search results to either: overlaps (just touching) \ - (=default) or contains (fully within)') - - desceocov_parser.add_argument('--count', metavar='count', help='Limits the maximum number of \ - DatasetDescriptions returned') - - desceocov_parser.add_argument('--section', dest='section', choices=['DatasetSeriesSummary', 'CoverageSummary', 'All'], - nargs='+', help='request one or more section(s) of a DescribeEOCoverageSet Document; NOTE: multiple sections need to \ - be supplied within {}; [default=All]', action=_cnv2str) - - desceocov_parser.add_argument('--IDs_only', dest='IDs_only', action='store_true', default=None, help='A non-standard parameter -\ - which will provide only a listing of the available CoverageIDs; intended to be fed directly to a GetCoverage loop') - - - # ==== GetCoverage parameters - getcov_parser = subparsers.add_parser('GetCoverage', parents=[common_parser], - help='request a coverage for download') - - # Mandatory parameters - mandatory = getcov_parser.add_argument_group('Mandatory') - - mandatory.add_argument('-s', '--server_url', metavar='server_url', dest='server_url', action='store', - required=True, help='the SERVER URL which should be contaced') - - mandatory.add_argument('--coverageID', metavar='coverageID', required=True, help='a valid coverageID') - - mandatory.add_argument('--format', choices=['tiff', 'jpeg', 'png', 'gif'], action=_chk_format, - required=True, help='requested format of coverage to be returned') - - mandatory.add_argument('-o', '--output', metavar='output', dest='output', action='store', - help='location where downloaded data shall be stored') - - # Optional parameters - getcov_parser.add_argument('--subset_x', metavar='subset_x', action=_chk_coord, nargs=3, - help='Trimming of coverage in X-dimension (no slicing allowed!), \ - Syntax: Coord-Type Axis-Label Coord,Coord; either in: pixel \ - coordinates [use: pix x 400,200 ], coordinates without CRS (-> original projection) [use: orig Long 12,14 ], \ - or coordinates with CRS (-> reprojecting) [use: epsg:4326 Long 17,17.4 ]') - - getcov_parser.add_argument('--subset_y', metavar='subset_y', action=_chk_coord, nargs=3, - help='Trimming of coverage in Y-dimension (no slicing allowed!), \ - Syntax: Coord-Type Axis-Label Coord,Coord; either in: pixel \ - coordinates [use: pix y 400,200 ], coordinates without CRS (-> original projection) [use: orig Lat 12,14 ], \ - or coordinates with CRS (-> reprojecting) [use: epsg:4326 Lat 17,17.4 ]') - - getcov_parser.add_argument('--rangesubset', metavar='rangesubset', help='Subsetting in the range \ - domain (e.g. Band-Subsetting, e.g. 3,2,1)') - - getcov_parser.add_argument('--outputcrs', metavar='outputcrs', type=int, - help='CRS for the requested output coverage, supplied as EPSG number [default=4326]. \ - Example: --outputcrs 3035') - - getcov_parser.add_argument('--size_x', nargs='*', action=_reformat_outsize, metavar=('[size X 100 |', 'resolution Long 15 ]'), - help='Mutually exclusive, enter either: size & Axis-Label & integer dimension of \ - the requested coverage or resolution & Axis-Label & the dimension of one pixel in X-Dimension') - - getcov_parser.add_argument('--size_y', nargs='*', action=_reformat_outsize, metavar=('[size Lat 100 |', 'resolution Y 15 ]'), - help='Mutually exclusive, enter either: size & Axis-Label & integer dimension of \ - the requested coverage or resolution & Axis-Label & dimension of one pixel in Y-Dimension') - - getcov_parser.add_argument('--interpolation', choices=['nearest', 'bilinear', 'average'], - help='Interpolation method to be used [default=nearest]') - - getcov_parser.add_argument('--mediatype', choices=['multipart/related'], nargs='?', - help='Coverage delivered directly as image file or enclosed in GML structure \ - [default=parameter is not provided]') - - getcov_parser.add_argument('--mask', metavar='mask', action=_chk_mask, nargs='*', - help='Masking of coverage by polygon: define the polygon as a list of points \ - (i.e. latitude and longitude values), e.g. lat1,lon1,lat2,lon2,...; make sure \ - to close the polygon with the last pair of coordinates; CRS is optional; per default \ - EPSG 4326 is assumed; use the subset parameter to crop the resulting coverage \ - Syntax: epsg:xxxx lat1,lon1,lat2,lon2, lat3,lon3,lat1,lon1 \ - epsg:4326 42,10,43,12,39,13,38,9,42,10') - - # parse the input and convert it into a dict - input_params = cl_parser.parse_args().__dict__ - - return input_params - - - -#/************************************************************************/ -#/* main() */ -#/************************************************************************/ -def main(): - """ - Command Line interface to the general purpose WCS client (wcs_client.py) - for WCS 2.0/EO-WCS server access - This cmd-line interface handles all functionalities as described in - the EOxServer ver.0.3 documentation - (http://eoxserver.org/doc/en/users/EO-WCS_request_parameters.html) - It offers cmd-line execution of: - - GetCapabilities Request - - DescribeCoverage Request - - DescribeEOCoverageSet Request - - GetMap Request - """ - # print "I'm in "+sys._getframe().f_code.co_name - - # get all parameters provided via cmd-line - input_params = _get_cmdline() - - # execute the user selected Request-type - if input_params.has_key('request'): - to_call = input_params.get('request') - - wcs_call = wcs_client.wcsClient() - - exec "result = wcs_call."+to_call+"(input_params)" - - print result - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/EOxWCSClient/wcs_client.py b/EOxWCSClient/wcs_client.py index f00f27b..bd057bc 100755 --- a/EOxWCSClient/wcs_client.py +++ b/EOxWCSClient/wcs_client.py @@ -88,9 +88,6 @@ global crs_url crs_url = 'http://www.opengis.net/def/crs/EPSG/0/' -global namespacemap -namespacemap = {"wcs": "http://www.opengis.net/wcs/2.0", "wcseo": "http://www.opengis.net/wcseo/1.0", "crs": "http://www.opengis.net/wcs/service-extension/crs/1.0", "gml" : "http://www.opengis.net/gml/3.2", "gmlcov" : "http://www.opengis.net/gmlcov/1.0", "ogc" : "http://www.opengis.net/ogc", "ows" : "http://www.opengis.net/ows/2.0", "swe" : "http://www.opengis.net/swe/2.0", "int" : "http://www.opengis.net/WCS_service-extension_interpolation/1.0", "eop" : "http://www.opengis.net/eop/2.0", "om" : "http://www.opengis.net/om/2.0"} - # sets a storage location in case the user doesn't provide one (to be on the save side) - eg. for error msgs. global temp_storage @@ -294,14 +291,17 @@ def _set_base_desceocoverageset(self): 'request': '&request=', 'server_url': '', 'eoID': '&eoID=', - 'subset_lon': '&subset=Long,'+crs_url+'4326(', - 'subset_lat': '&subset=Lat,'+crs_url+'4326(', +# 'subset_lon': '&subset=Long,'+crs_url+'4326(', #@@ +# 'subset_lat': '&subset=Lat,'+crs_url+'4326(', #@@ + 'subset_lon': '&subset=Long(', + 'subset_lat': '&subset=Lat(', 'subset_time': '&subset=phenomenonTime(%22', 'containment': '&containment=', 'section': '§ion=', 'count': '&count=', 'IDs_only': False} + #print "base_desceocoverageset", base_desceocoverageset return base_desceocoverageset @@ -323,7 +323,8 @@ def _set_base_getcov(self): 'subset_y': '&subset=', 'rangesubset': '&rangesubset=', 'outputcrs': '&outputcrs='+crs_url, - 'interpolation': '&interpolation=', + 'interpolation': '&interpolation=', #@@ +# 'interpolation': '&interpolation=nearest-neighbour', #@@ 'mediatype': '&mediatype=', 'mask': '&mask=polygon,'+crs_url, 'size_x': '&', @@ -463,7 +464,7 @@ def DescribeEOCoverageSet(self, input_params): #/* GetCoverage() */ #/************************************************************************/ - def GetCoverage(self, input_params): + def GetCoverage(self, input_params, use_wcs_GCo_call): """ Creates a GetCoverage request url based on the input_parameters and executes the request. @@ -513,13 +514,14 @@ def GetCoverage(self, input_params): # provide the same functionality for input as for the cmd-line # (to get around the url-notation for input) - if input_params.has_key('subset_x') and input_params['subset_x'].startswith('epsg'): + if input_params.has_key('subset_x') and input_params['subset_x'] is not None and input_params['subset_x'].startswith('epsg') : crs = input_params['subset_x'].split(':')[1].split(' ')[0] label = input_params['subset_x'].split(':')[1].split(' ')[1] coord = input_params['subset_x'].split(':')[1].split(' ')[2] - out = label+','+crs_url+crs+'('+coord +# out = label+','+crs_url+crs+'('+coord #@@ + out = label+'('+coord input_params['subset_x'] = out - elif input_params.has_key('subset_x') and (input_params['subset_x'].startswith('pix') or input_params['subset_x'].startswith('ori')): + elif input_params.has_key('subset_x') and input_params['subset_x'] is not None and (input_params['subset_x'].startswith('pix') or input_params['subset_x'].startswith('ori')): label = input_params['subset_x'].split(' ')[1] coord = input_params['subset_x'].split(' ')[2] out = label+'('+coord @@ -527,13 +529,14 @@ def GetCoverage(self, input_params): else: pass - if input_params.has_key('subset_y') and input_params['subset_y'].startswith('epsg'): + if input_params.has_key('subset_y') and input_params['subset_y'] is not None and input_params['subset_y'].startswith('epsg'): crs = input_params['subset_y'].split(':')[1].split(' ')[0] label = input_params['subset_y'].split(':')[1].split(' ')[1] coord = input_params['subset_y'].split(':')[1].split(' ')[2] - out = label+','+crs_url+crs+'('+coord +# out = label+','+crs_url+crs+'('+coord #@@ + out = label+'('+coord input_params['subset_y'] = out - elif input_params.has_key('subset_y') and (input_params['subset_y'].startswith('pix') or input_params['subset_y'].startswith('ori')): + elif input_params.has_key('subset_y') and input_params['subset_y'] is not None and (input_params['subset_y'].startswith('pix') or input_params['subset_y'].startswith('ori')): label = input_params['subset_y'].split(' ')[1] coord = input_params['subset_y'].split(' ')[2] out = label+'('+coord @@ -542,7 +545,7 @@ def GetCoverage(self, input_params): pass - if input_params.has_key('size_x'): + if input_params.has_key('size_x') and input_params['size_x'] is not None: if input_params['size_x'].startswith('siz'): out = "size="+input_params['size_x'].split(" ")[1]+"("+input_params['size_x'].split(" ")[2] input_params['size_x'] = out @@ -550,7 +553,7 @@ def GetCoverage(self, input_params): out = "resolution="+input_params['size_x'].split(" ")[1]+"("+input_params['size_x'].split(" ")[2] input_params['size_x'] = out - if input_params.has_key('size_y'): + if input_params.has_key('size_y') and input_params['size_y'] is not None: if input_params['size_y'].startswith('siz'): out = "size="+input_params['size_y'].split(" ")[1]+"("+input_params['size_y'].split(" ")[2] input_params['size_y'] = out @@ -579,17 +582,17 @@ def _parse_xml(self, in_xml): """ join_xml = ''.join(in_xml) tree = etree.fromstring(join_xml) - tag_ids = tree.xpath("wcs:CoverageDescriptions/wcs:CoverageDescription/wcs:CoverageId/text()", namespaces=namespacemap) - #print tag_ids - -## TODO - map each axis and crs to the respective coverage, abd show them accordingly to the selection - - # also read out the gml:Envelope axisLabels and srsName - use only first returned entry - axis_labels = tree.xpath("wcs:CoverageDescriptions/wcs:CoverageDescription/gml:boundedBy/gml:Envelope/@axisLabels|wcs:CoverageDescriptions/wcs:CoverageDescription/gml:boundedBy/gml:EnvelopeWithTimePeriod/@axisLabels", namespaces=namespacemap) + try: + tag_ids = tree.xpath("wcs:CoverageDescriptions/wcs:CoverageDescription/wcs:CoverageId/text()", namespaces=tree.nsmap) + #print tag_ids + except etree.XPathEvalError: + raise IndexError + + axis_labels = tree.xpath("wcs:CoverageDescriptions/wcs:CoverageDescription/gml:boundedBy/gml:Envelope/@axisLabels|wcs:CoverageDescriptions/wcs:CoverageDescription/gml:boundedBy/gml:EnvelopeWithTimePeriod/@axisLabels", namespaces=tree.nsmap) #print 'AxisLabels: ', type(axis_labels),len(axis_labels), axis_labels axis_labels = axis_labels[0].encode().split(" ") #print axis_labels - offered_crs = tree.xpath("wcs:CoverageDescriptions/wcs:CoverageDescription/gml:boundedBy/gml:Envelope/@srsName|wcs:CoverageDescriptions/wcs:CoverageDescription/gml:boundedBy/gml:EnvelopeWithTimePeriod/@srsName", namespaces=namespacemap) + offered_crs = tree.xpath("wcs:CoverageDescriptions/wcs:CoverageDescription/gml:boundedBy/gml:Envelope/@srsName|wcs:CoverageDescriptions/wcs:CoverageDescription/gml:boundedBy/gml:EnvelopeWithTimePeriod/@srsName", namespaces=tree.nsmap) offered_crs = os.path.basename(offered_crs[0]) #print offered_crs if len(axis_labels) == 0: @@ -611,34 +614,40 @@ def _execute_xml_request(self, http_request, IDs_only=False): Output: prints out the submitted http_request or Error_XML in case of failure """ # print "I'm in "+sys._getframe().f_code.co_name - print http_request + print 'REQUEST: ',http_request #@@ try: - # access the url - request_handle = urllib2.urlopen(http_request) - # read the content of the url - result_xml = request_handle.read() + # create a request object, + request_handle = urllib2.Request(http_request, headers={'User-Agent': 'Python-urllib/2.7,QgsWcsClient-plugin'}) + response = urllib2.urlopen(request_handle) + xml_result = response.read() + status = response.code + #headers = response.headers.dict + #print 'HEADERS ', headers + #print 'XML-ResponseStatus: ', status + - ## TODO ## to change the User-agent header --> change the above to the following - # create a request object, this construct doesn't need the close-statements (-> line 633 / 633) anymore - #request_handle = urllib2.Request(http_request, headers={'User-Agent': 'Python-urllib/2.6,QgsWcsClient-plugin'}) - #result_xml = urllib2.urlopen(request_handle).read() # extract only the CoverageIDs and provide them as a list for further usage if IDs_only == True: - cids, axis_labels, offered_crs = self._parse_xml(result_xml) - request_handle.close() - return cids, axis_labels, offered_crs + try: + cids, axis_labels, offered_crs = self._parse_xml(xml_result) + # request_handle.close() + return cids, axis_labels, offered_crs + except IndexError: + raise IndexError else: - request_handle.close() - return result_xml + return xml_result except urllib2.URLError, url_ERROR: if hasattr(url_ERROR, 'reason'): - print '\n', time.strftime("%Y-%m-%dT%H:%M:%S%Z"), "- ERROR: Server not accessible -", url_ERROR.reason + print '\n', time.strftime("%Y-%m-%dT%H:%M:%S%Z"), "- ERROR: Server not accessible -" , url_ERROR.reason + err_msg=['ERROR', url_ERROR.read()] + return err_msg try: print url_ERROR.read(), '\n' + except: pass @@ -669,7 +678,7 @@ def _execute_getcov_request(self, http_request, input_params): Returns: HttpCode (if success) """ # print "I'm in "+sys._getframe().f_code.co_name - print http_request + print 'REQUEST:', http_request now = time.strftime('_%Y%m%dT%H%M%S') @@ -689,14 +698,7 @@ def _execute_getcov_request(self, http_request, input_params): else: out_format_ext = input_params['format'] - #if not (input_params['coverageID'].endswith('tif') or input_params['coverageID'].endswith('tiff') or \ - #input_params['coverageID'].endswith('jpeg') or input_params['coverageID'].endswith('jpg') or \ - #input_params['coverageID'].endswith('gif')): - #out_coverageID = input_params['coverageID']+now+'.'+out_format_ext # input_params['format'] - #else: - #out_coverageID = input_params['coverageID'] -#@@ out_coverageID = input_params['coverageID']+now+'.'+out_format_ext # input_params['format'] if input_params.has_key('output') and input_params['output'] is not None: @@ -704,20 +706,26 @@ def _execute_getcov_request(self, http_request, input_params): else: outfile = temp_storage+dsep+out_coverageID + print 'REQUEST-GetCov: ',http_request #@@ try: - request_handle = urllib2.urlopen(http_request) - status = request_handle.code + request_handle = urllib2.Request(http_request, headers={'User-Agent': 'Python-urllib/2.7,QgsWcsClient-plugin'}) + response = urllib2.urlopen(request_handle) + result = response.read() + status = response.code + #headers = response.headers.dict + #print 'HEADERS ', headers + #print 'GCov-Status: ', status try: file_getcov = open(outfile, 'w+b') - file_getcov.write(request_handle.read()) + file_getcov.write(result) file_getcov.flush() os.fsync(file_getcov.fileno()) file_getcov.close() - request_handle.close() return status + except IOError as (errno, strerror): print "I/O error({0}): {1}".format(errno, strerror) except: @@ -756,7 +764,7 @@ def _merge_dicts(self, input_params, procedure_dict): request_dict = {} for k, v in input_params.iteritems(): - #print k,' -- ',v + #print 'TTTT: ', k,' -- ',v # make sure there is always a version set if k == 'version' and (v == '' or v == None): v = '2.0.0' @@ -768,11 +776,10 @@ def _merge_dicts(self, input_params, procedure_dict): # (which got inserted for argparse() to handle negativ input values correctly) request_dict[k] = str(procedure_dict[k])+str(v).strip() - # get the basic request settings base_request = self._set_base_request() request_dict.update(base_request) - #print 'request_dict ',request_dict + return request_dict @@ -787,6 +794,7 @@ def _create_request(self, input_params, procedure_dict): # print "I'm in "+sys._getframe().f_code.co_name request_dict = self._merge_dicts(input_params, procedure_dict) + #print 'Request_Dict: ', request_dict #@@ # this doesn't look so nice, but this way I can control the order within the generated request http_request = '' diff --git a/Makefile b/Makefile index 26eb6b1..d2b711f 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ # # A OGC WCS 2.0/EO-WCS Client # ------------------- -# begin : 2014-06-26 +# begin : 2014-06-26; 2017-04-10 # copyright : (C) 2014 by Christian Schiller / EOX IT Services GmbH, Vienna, Austria # email : christian.schiller@eox.at # ***************************************************************************/ diff --git a/README.md b/README.md index 5077443..9574235 100644 --- a/README.md +++ b/README.md @@ -3,12 +3,45 @@ QgsWcsClient2 A QGis WCS2.0/EO-WCS Plugin -A tool to download (and subset in space and time) a series of raster data +A tool to download (and subset in space and time) a time-series of raster data and get the data in your desired file-format and projection. -The WCS 2.0/EO-WCS Client allows to specify an Area-Of-Interest and a Time-Of-Interest and then access/download the raster data (coverages) from OGC WCS-2.0 compliant servers. +The WCS 2.0/EO-WCS Client allows to specify an Area-Of-Interest and a Time-Of-Interest and then access/download the raster data (coverages) from OGC WCS-2.0 and WCS-2.0/EO-WCS compliant servers. Unlike WMS, WCS enables the access to the original data (and not just to portrayals). The tool also handles the EO-WCS Application profile which allows to access/download a full time-series of coverages with just a few clicks. For multi-band EO-imagery the bands of interest can also be selected/sub-setted and their order in the output can be chosen. -The downloaded coverages are directly loaded as layers into QGIS +The downloaded coverages are directly loaded as layers into QGIS. Requirements: This tool requires the python lxml-module to be pre-installed. +[ Help for installation in Windows (thankfully provided by hkristen) can by found at: https://github.com/EOX-A/QgsWcsClient2/issues/8 ] + +It would be more than welcome to receive accessible EO-WCS server-urls for additional testing. + + +Added Features & Fixed Bugs: +2017-05-03 - verison 0.3: +- added Button to import WCS-Urls already stored in native QGis settings +- added Button to sort the Server_List +- enabled resizing of QgsWcsClient2-Client Window +- added "WGS84 UpperCorner & WGS84LowerCorner" (BoundingBox) fields to GetCapabilities and DescribeEOCoverageSet Results-View +- added a uniq "Browser tag" to be submitted with the requests, to verify in the access log-files that the Qgis-plugin was used + (Identifies now with User-Agent => 'Python-urllib/2.7,QgsWcsClient-plugin') +- enabled support to access https:// sites +- config_server.pkl file (containing the server entries) will not get overwritten during update/re-installatinon anymore + (a default one will only be installed if it is not available at plugin startup) +- added possibility to view full GetCapabilities XML response-document (also made more clear to view DescribeEOCoverageSet XML) + (now all are accessible => GetCap, DescCov, DescEOCov: just use copy/paste to save them) +- better error checking e.g. for http errors -> warning messages (e.g. for redirects, automatic redirection is not supported to + minimize security issues) + +- fixed xml_parsing error +- fixed issue with "offered CRS" +- fixed issue "offered interpolation" +- fixed issue if no coverage was found in selected time-period +- removed the "striping/alternatingRowColors" from the Coverage-listings +- fixed issue with "no data selected" fixed for "DescribeEOCoverage" Request +- fixed various the xml-namespace handling issues +- fixed issue with the "clock" icon shown permanently +- fixed Time selection (BeginTime/EndTime) for DescribeEOCoverageSet (2.5 D coverages i.e 2D plus Time), added plausability check +- fixed issue with associateing the corresponding axisLabel / CRS etc. with each coverage (once DescribeCoverage is executed for a specific + Coverage) + diff --git a/__init__.py b/__init__.py index 1c3b64a..32056a3 100644 --- a/__init__.py +++ b/__init__.py @@ -5,7 +5,7 @@ A QGIS plugin A OGC WCS 2.0/EO-WCS Client ------------------- - begin : 2014-06-26 + begin : 2014-06-26; 2017-04-10 copyright : (C) 2014 by Christian Schiller / EOX IT Services GmbH, Vienna, Austria email : christian dot schiller at eox dot at ***************************************************************************/ diff --git a/config.py b/config.py index 6dc69aa..014a07c 100644 --- a/config.py +++ b/config.py @@ -5,7 +5,7 @@ A QGIS plugin A OGC WCS 2.0/EO-WCS Client ------------------- - begin : 2014-06-26 + begin : 2014-06-26; 2017-04-10 copyright : (C) 2014 by Christian Schiller / EOX IT Services GmbH, Vienna, Austria email : christian dot schiller at eox dot at ***************************************************************************/ @@ -43,17 +43,49 @@ #configured server listing (srv_list) import os, pickle global srv_list +global default_interpol plugin_dir = os.path.dirname(os.path.realpath(__file__)) +default_interpol = ['nearest (default)', 'bilinear', 'average (slow)'] # read the sever names/urls from a file def read_srv_list(): insrvlst = os.path.join(plugin_dir, 'config_srvlist.pkl') + # check if a 'config_srvlist.pkl already exists, if not create a default one + # this prevents overwriting of user edited listings during update/re-installation + if not os.path.isfile(insrvlst): + chk_srvlist(insrvlst) + fo = open(insrvlst, 'rb') sl = pickle.load(fo) fo.close() return sl + # check if a insrvlst exists if not create a default one; this way we don't need to distrubute a sepaerate file + # and an already existing 'config_srvlist.pkl' doesn't get overwritten during the installation +def chk_srvlist(insrvlst): + print 'Creating a default Server-list file' + f = open(insrvlst,'w') + print >> f, "(dp0" + print >> f, "S'servers'" + print >> f, "p1" + print >> f, "(lp2" + print >> f, "(lp3" + print >> f, "VOGC: WCS 2.0/EO-WCS 1.0 - Reference Implemetation (EOxServer)" + print >> f, "p4" + print >> f, "aVhttp://ows.eox.at/cite/eoxserver/ows?" + print >> f, "p5" + print >> f, "aa(lp6" + print >> f, "VOGC: WCS 2.0 - Reference Implementation (MapServer)" + print >> f, "p7" + print >> f, "aVhttp://ows.eox.at/cite/mapserver/ows?" + print >> f, "p8" + print >> f, "aas.", + f.close() + + + # read the sever names/urls from a file srv_list = read_srv_list() + diff --git a/config_srvlist.pkl b/config_srvlist.pkl deleted file mode 100644 index bc4a8b2..0000000 --- a/config_srvlist.pkl +++ /dev/null @@ -1,80 +0,0 @@ -(dp0 -S'servers' -p1 -(lp2 -(lp3 -VDREAM -p4 -aVhttp://data.eox.at/instance00/ows? -p5 -aa(lp6 -VEC FP7-CryoLand - Copernicus Service Snow and Land Ice (>16.000 datasets, GetCapabilities is slow) -p7 -aVhttp://neso.cryoland.enveo.at/cryoland/ows? -p8 -aa(lp9 -VEarthServer -p10 -aVhttp://earthserver.eox.at/rasdaman? -p11 -aa(lp12 -VEarthServer-Beta -p13 -aVhttp://earthserver.eox.at/beta-rasdaman? -p14 -aa(lp15 -Vtest-failure -p16 -aVhttp:// -p17 -aa(lp18 -VDLR-/geotest.eoc.dlr.de/eoc/atmosphere/wcs -p19 -aVhttp://geotest.eoc.dlr.de/eoc/atmosphere/wcs? -p20 -aa(lp21 -VDLR-/geoservice.dlr.de/eoc/atmosphere/wcs? -p22 -aVhttp://geoservice.dlr.de/eoc/atmosphere/wcs? -p23 -aa(lp24 -VDLR-EOC imagery -p25 -aVhttp://geoservice.dlr.de/eoc/imagery/wcs? -p26 -aa(lp27 -VOGC: WCS 2.0/EO-WCS 1.0 - Reference Implemetation (EoxServer) -p28 -aVhttp://ows.eox.at/cite/ows? -p29 -aa(lp30 -VOGC: WCS 2.0 - Reference Implementation (MapServer) -p31 -aVhttp://ows.eox.at/cite-wcs? -p32 -aa(lp33 -VAlaska Snow metric (MODIS) -p34 -aVhttp://snow.proto.gina.alaska.edu/metrics? -p35 -aa(lp36 -VV-MANIP (ESA project - Visualizing and Manipulating multidimensional data directly through a web client) -p37 -aVhttp://demo.v-manip.eox.at/browse/ows? -p38 -aa(lp39 -VDREAM-2- WCS with new extensions -p40 -aVhttp://dream.eox.at/eoxs2/ows? -p41 -aa(lp42 -Vnew_CryoLand_TEST -p43 -aVhttp://192.168.122.129/cryoland/ows? -p44 -aa(lp45 -VCryoLand - NEW (neso1) -p46 -aVhttp://neso1.cryoland.enveo.at/cryoland/ows? -p47 -aas. \ No newline at end of file diff --git a/display_txt.py b/display_txt.py index e7d960b..79983b6 100644 --- a/display_txt.py +++ b/display_txt.py @@ -1,43 +1,8 @@ # -*- coding: utf-8 -*- -""" -/*************************************************************************** - QgsWcsClient2 - A QGIS plugin - A OGC WCS 2.0/EO-WCS Client - ------------------- - begin : 2014-06-26 - copyright : (C) 2014 by Christian Schiller / EOX IT Services GmbH, Vienna, Austria - email : christian dot schiller at eox dot at - ***************************************************************************/ -/*********************************************************************************/ - * The MIT License (MIT) * - * * - * Copyright (c) 2014 EOX IT Services GmbH * - * * - * Permission is hereby granted, free of charge, to any person obtaining a copy * - * of this software and associated documentation files (the "Software"), to deal * - * in the Software without restriction, including without limitation the rights * - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * - * copies of the Software, and to permit persons to whom the Software is * - * furnished to do so, subject to the following conditions: * - * * - * The above copyright notice and this permission notice shall be included in * - * all copies or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * - * SOFTWARE. * - * * - *********************************************************************************/ -""" # Form implementation generated from reading ui file 'display_txt.ui' # -# Created: Fri Jul 11 17:52:52 2014 +# Created: Mon Apr 10 15:55:21 2017 # by: PyQt4 UI code generator 4.10.4 # # WARNING! All changes made in this file will be lost! @@ -62,12 +27,14 @@ class Ui_Dialog_Disp(object): def setupUi(self, Dialog_Disp): Dialog_Disp.setObjectName(_fromUtf8("Dialog_Disp")) Dialog_Disp.resize(721, 610) - self.pushButton_DIsp_Done = QtGui.QPushButton(Dialog_Disp) - self.pushButton_DIsp_Done.setGeometry(QtCore.QRect(610, 570, 98, 27)) - self.pushButton_DIsp_Done.setObjectName(_fromUtf8("pushButton_DIsp_Done")) + self.gridLayout = QtGui.QGridLayout(Dialog_Disp) + self.gridLayout.setObjectName(_fromUtf8("gridLayout")) self.textBrowser_Disp = QtGui.QTextBrowser(Dialog_Disp) - self.textBrowser_Disp.setGeometry(QtCore.QRect(10, 10, 701, 551)) self.textBrowser_Disp.setObjectName(_fromUtf8("textBrowser_Disp")) + self.gridLayout.addWidget(self.textBrowser_Disp, 0, 0, 1, 1) + self.pushButton_DIsp_Done = QtGui.QPushButton(Dialog_Disp) + self.pushButton_DIsp_Done.setObjectName(_fromUtf8("pushButton_DIsp_Done")) + self.gridLayout.addWidget(self.pushButton_DIsp_Done, 1, 0, 1, 1) self.retranslateUi(Dialog_Disp) QtCore.QObject.connect(self.pushButton_DIsp_Done, QtCore.SIGNAL(_fromUtf8("clicked()")), Dialog_Disp.close) diff --git a/display_txt.ui b/display_txt.ui index 837d0af..4cf61f4 100644 --- a/display_txt.ui +++ b/display_txt.ui @@ -13,29 +13,18 @@ Dialog - - - - 610 - 570 - 98 - 27 - - - - Done - - - - - - 10 - 10 - 701 - 551 - - - + + + + + + + + Done + + + + diff --git a/display_txtdialog.py b/display_txtdialog.py index 96b68c9..3dc26d5 100644 --- a/display_txtdialog.py +++ b/display_txtdialog.py @@ -1,12 +1,11 @@ # -*- coding: utf-8 -*- -# -*- coding: utf-8 -*- """ /*************************************************************************** QgsWcsClient2 A QGIS plugin A OGC WCS 2.0/EO-WCS Client ------------------- - begin : 2014-06-26 + begin : 2014-06-26; 2017-04-10 copyright : (C) 2014 by Christian Schiller / EOX IT Services GmbH, Vienna, Austria email : christian dot schiller at eox dot at ***************************************************************************/ diff --git a/downloader.py b/downloader.py index cad8d38..174cb15 100644 --- a/downloader.py +++ b/downloader.py @@ -5,7 +5,7 @@ A QGIS plugin A OGC WCS 2.0/EO-WCS Client ------------------- - begin : 2014-06-26 + begin : 2014-06-26; 2017-04-10 copyright : (C) 2014 by Christian Schiller / EOX IT Services GmbH, Vienna, Austria email : christian dot schiller at eox dot at ***************************************************************************/ @@ -69,14 +69,14 @@ def read_data1(): global xml_result1 xml_result1.append(reply.readAll().data()) return xml_result1 - + # request the content of the url request = QNetworkRequest(QUrl(url)) reply = manager.get(request) - + #print "EEE: ", reply.error(), reply.errorString(), reply.size() - #print "AA1: ", reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) + #print "AA1: ", reply.attribute(QNetworkRequest.HttpStatusCodeAttribute), type(reply.attribute(QNetworkRequest.HttpStatusCodeAttribute)) #print "AA2: ", reply.attribute(QNetworkRequest.HttpReasonPhraseAttribute) #print "AA3: ", reply.attribute(QNetworkRequest.RedirectionTargetAttribute) #print "==================" @@ -143,6 +143,12 @@ def cancel_action(): QCoreApplication.processEvents() result = reply.error() + + if reply.attribute(QNetworkRequest.RedirectionTargetAttribute): + redir_url = reply.attribute(QNetworkRequest.RedirectionTargetAttribute).toString().split('?')[0]+'?' + print 'Redirection-Url:',redir_url, type(redir_url) + return True, None, 'Redirection-URL:\t'+redir_url + if result == QNetworkReply.NoError: if output_path is None: return True, None, xml_result diff --git a/metadata.txt b/metadata.txt index 971dfd5..6d46577 100644 --- a/metadata.txt +++ b/metadata.txt @@ -10,13 +10,20 @@ [general] name = QgsWcsClient2 qgisMinimumVersion = 2.0 -description = A OGC WCS 2.0/EO-WCS Client; a tool to download (and subset in space and time) a series of raster data -version = version 0.2 +description = A OGC WCS 2.0/EO-WCS Client; a tool to download (and subset in space and time) a time-series of raster data. +version = version 0.3 category = Web author = Christian Schiller at EOX IT Services GmbH, Vienna, Austria email = christian.schiller@eox.at +about = The WCS 2.0/EO-WCS Client allows to specify an Area-Of-Interest and a Time-Of-Interest and then access/download the raster data (coverages) from OGC WCS-2.0 and WCS-2.0/EO-WCS compliant servers. + Unlike WMS, WCS enables the access to the original data (and not just to portrayals). + The tool also handles the EO-WCS Application profile which allows to access/download a full time-series of coverages with just a few clicks. + For multi-band EO-imagery the bands of interest can also be selected/sub-setted and their order in the output can be chosen. + The downloaded coverages are directly loaded as layers into QGIS. + Requirements: This tool requires the python lxml-module to be pre-installed. + # end of mandatory metadata @@ -39,4 +46,5 @@ deprecated=False changelog= 0.1: first release 0.2: bug fixed which prevented multiple-coverage downloads with single GetCoverage request - \ No newline at end of file + 0:3: multiple bug fixes and added features (for a full list please see: https://github.com/EOX-A/QgsWcsClient2 ) + diff --git a/qgsnewhttpconnectionbase.py b/qgsnewhttpconnectionbase.py index b659576..51ac8d8 100644 --- a/qgsnewhttpconnectionbase.py +++ b/qgsnewhttpconnectionbase.py @@ -1,45 +1,8 @@ # -*- coding: utf-8 -*- -""" -/*************************************************************************** - QgsWcsClient2 - A QGIS plugin - A OGC WCS 2.0/EO-WCS Client - ------------------- - begin : 2014-06-26 - copyright : (C) 2014 by Christian Schiller / EOX IT Services GmbH, Vienna, Austria - email : christian dot schiller at eox dot at - ***************************************************************************/ - -/*********************************************************************************/ - * The MIT License (MIT) * - * * - * Copyright (c) 2014 EOX IT Services GmbH * - * * - * Permission is hereby granted, free of charge, to any person obtaining a copy * - * of this software and associated documentation files (the "Software"), to deal * - * in the Software without restriction, including without limitation the rights * - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * - * copies of the Software, and to permit persons to whom the Software is * - * furnished to do so, subject to the following conditions: * - * * - * The above copyright notice and this permission notice shall be included in * - * all copies or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * - * SOFTWARE. * - * * - *********************************************************************************/ - a dialog to set server names and urls to be used with this plugin -""" # Form implementation generated from reading ui file 'qgsnewhttpconnectionbase.ui' # -# Created: Thu Jul 3 14:57:42 2014 +# Created: Wed Mar 29 15:46:57 2017 # by: PyQt4 UI code generator 4.10.4 # # WARNING! All changes made in this file will be lost! @@ -63,28 +26,30 @@ def _translate(context, text, disambig): class Ui_qgsnewhttpconnectionbase(object): def setupUi(self, qgsnewhttpconnectionbase): qgsnewhttpconnectionbase.setObjectName(_fromUtf8("qgsnewhttpconnectionbase")) - qgsnewhttpconnectionbase.resize(619, 153) - self.buttonBox = QtGui.QDialogButtonBox(qgsnewhttpconnectionbase) - self.buttonBox.setGeometry(QtCore.QRect(260, 100, 341, 32)) - self.buttonBox.setFocusPolicy(QtCore.Qt.NoFocus) - self.buttonBox.setOrientation(QtCore.Qt.Horizontal) - self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) - self.buttonBox.setObjectName(_fromUtf8("buttonBox")) + qgsnewhttpconnectionbase.resize(642, 153) + self.gridLayout = QtGui.QGridLayout(qgsnewhttpconnectionbase) + self.gridLayout.setObjectName(_fromUtf8("gridLayout")) self.label_NewSrvName = QtGui.QLabel(qgsnewhttpconnectionbase) - self.label_NewSrvName.setGeometry(QtCore.QRect(40, 30, 66, 17)) self.label_NewSrvName.setObjectName(_fromUtf8("label_NewSrvName")) - self.label_NewSrvUrl = QtGui.QLabel(qgsnewhttpconnectionbase) - self.label_NewSrvUrl.setGeometry(QtCore.QRect(40, 90, 66, 17)) - self.label_NewSrvUrl.setObjectName(_fromUtf8("label_NewSrvUrl")) + self.gridLayout.addWidget(self.label_NewSrvName, 0, 0, 1, 1) self.txt_NewSrvName = QtGui.QLineEdit(qgsnewhttpconnectionbase) self.txt_NewSrvName.setEnabled(True) - self.txt_NewSrvName.setGeometry(QtCore.QRect(100, 30, 501, 27)) self.txt_NewSrvName.setCursor(QtGui.QCursor(QtCore.Qt.IBeamCursor)) self.txt_NewSrvName.setFocusPolicy(QtCore.Qt.ClickFocus) self.txt_NewSrvName.setObjectName(_fromUtf8("txt_NewSrvName")) + self.gridLayout.addWidget(self.txt_NewSrvName, 0, 1, 1, 1) + self.label_NewSrvUrl = QtGui.QLabel(qgsnewhttpconnectionbase) + self.label_NewSrvUrl.setObjectName(_fromUtf8("label_NewSrvUrl")) + self.gridLayout.addWidget(self.label_NewSrvUrl, 1, 0, 1, 1) self.txt_NewSrvUrl = QtGui.QLineEdit(qgsnewhttpconnectionbase) - self.txt_NewSrvUrl.setGeometry(QtCore.QRect(100, 70, 501, 27)) self.txt_NewSrvUrl.setObjectName(_fromUtf8("txt_NewSrvUrl")) + self.gridLayout.addWidget(self.txt_NewSrvUrl, 1, 1, 1, 1) + self.buttonBox = QtGui.QDialogButtonBox(qgsnewhttpconnectionbase) + self.buttonBox.setFocusPolicy(QtCore.Qt.NoFocus) + self.buttonBox.setOrientation(QtCore.Qt.Horizontal) + self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) + self.buttonBox.setObjectName(_fromUtf8("buttonBox")) + self.gridLayout.addWidget(self.buttonBox, 2, 1, 1, 1) self.retranslateUi(qgsnewhttpconnectionbase) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), qgsnewhttpconnectionbase.accept) @@ -93,6 +58,6 @@ def setupUi(self, qgsnewhttpconnectionbase): def retranslateUi(self, qgsnewhttpconnectionbase): qgsnewhttpconnectionbase.setWindowTitle(_translate("qgsnewhttpconnectionbase", "New WCS Server ", None)) - self.label_NewSrvName.setText(_translate("qgsnewhttpconnectionbase", "Name", None)) - self.label_NewSrvUrl.setText(_translate("qgsnewhttpconnectionbase", "URL", None)) + self.label_NewSrvName.setText(_translate("qgsnewhttpconnectionbase", "Server Name", None)) + self.label_NewSrvUrl.setText(_translate("qgsnewhttpconnectionbase", "Server URL", None)) diff --git a/qgsnewhttpconnectionbase.ui b/qgsnewhttpconnectionbase.ui index 7377e3b..60222da 100644 --- a/qgsnewhttpconnectionbase.ui +++ b/qgsnewhttpconnectionbase.ui @@ -13,80 +13,51 @@ New WCS Server - - - - 280 - 110 - 341 - 32 - - - - Qt::NoFocus - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - 20 - 33 - 91 - 17 - - - - Server Name - - - - - - 20 - 75 - 91 - 17 - - - - Server URL - - - - - true - - - - 120 - 30 - 501 - 27 - - - - IBeamCursor - - - Qt::ClickFocus - - - - - - 120 - 70 - 501 - 27 - - - + + + + + Server Name + + + + + + + true + + + IBeamCursor + + + Qt::ClickFocus + + + + + + + Server URL + + + + + + + + + + Qt::NoFocus + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + diff --git a/qgsnewhttpconnectionbasedialog.py b/qgsnewhttpconnectionbasedialog.py index 12f0b7a..0325e94 100644 --- a/qgsnewhttpconnectionbasedialog.py +++ b/qgsnewhttpconnectionbasedialog.py @@ -5,7 +5,7 @@ A QGIS plugin A OGC WCS 2.0/EO-WCS Client ------------------- - begin : 2014-06-26 + begin : 2014-06-26; 2017-04-10 copyright : (C) 2014 by Christian Schiller / EOX IT Services GmbH, Vienna, Austria email : christian dot schiller at eox dot at ***************************************************************************/ @@ -72,8 +72,8 @@ def accept(self): srv_url = self.txt_NewSrvUrl.text() # verify that URL starts with http:// - if not srv_url.startswith("http://"): - msg = "Sorry, you need to supply a 'Server URL' starting with http://\n" + if not srv_url.startswith("http://") and not srv_url.startswith("https://"): + msg = "Sorry, you need to supply a 'Server URL' starting with http:// or https://\n" self.warning_msg(msg) srv_name = self.txt_NewSrvName.text() diff --git a/qgswcsclient2.py b/qgswcsclient2.py index 1d8ef48..46ac5e7 100644 --- a/qgswcsclient2.py +++ b/qgswcsclient2.py @@ -5,7 +5,7 @@ A QGIS plugin A OGC WCS 2.0/EO-WCS Client ------------------- - begin : 2014-06-26 + begin : 2014-06-26; 2017-04-10 copyright : (C) 2014 by Christian Schiller / EOX IT Services GmbH, Vienna, Austria email : christian dot schiller at eox dot at ***************************************************************************/ @@ -36,19 +36,19 @@ *********************************************************************************/ initialisation, etc. of the QgsWcsClient2 plugin """ -# Import the PyQt and QGIS libraries + # Import the PyQt and QGIS libraries from PyQt4.QtCore import * from PyQt4.QtGui import * from qgis.core import * -# Initialize Qt resources from file resources.py + # Initialize Qt resources from file resources.py import resources_rc -# Import the code for the dialog(s) + # Import the code for the dialog(s) from qgswcsclient2dialog import QgsWcsClient2Dialog from qgsnewhttpconnectionbase import Ui_qgsnewhttpconnectionbase from EOxWCSClient.wcs_client import wcsClient import os.path -#global setttings and saved server list + # global setttings and saved server list global config import config @@ -57,10 +57,10 @@ class QgsWcsClient2: def __init__(self, iface): global config - # Save reference to the QGIS interface + # Save reference to the QGIS interface self.iface = iface - # initialize locale + # initialize locale locale = QSettings().value("locale/userLocale")[0:2] localePath = os.path.join(config.plugin_dir, 'i18n', 'qgswcsclient2_{}.qm'.format(locale)) @@ -71,36 +71,37 @@ def __init__(self, iface): if qVersion() > '4.3.3': QCoreApplication.installTranslator(self.translator) - # Create the dialog (after translation) and keep reference + # Create the dialog (after translation) and keep reference self.dlg = QgsWcsClient2Dialog(iface) + def initGui(self): - # Create action that will start plugin configuration + # Create action that will start plugin configuration self.action = QAction( QIcon(":/plugins/qgswcsclient2/icon.png"), - u"WCS 2.0/EO-WCS Clien", self.iface.mainWindow()) - # connect the action to the run method + u"WCS 2.0/EO-WCS Client", self.iface.mainWindow()) + # connect the action to the run method self.action.triggered.connect(self.run) - # Add toolbar button and menu item + # Add toolbar button and menu item self.iface.addToolBarIcon(self.action) self.iface.addPluginToMenu(u"&WcsClient2", self.action) def unload(self): - # Remove the plugin menu item and icon + # Remove the plugin menu item and icon self.iface.removePluginMenu(u"&WcsClient2", self.action) self.iface.removeToolBarIcon(self.action) - # run method that performs all the real work + # run method that performs all the real work def run(self): - # show the dialog + # show the dialog self.dlg.show() - # Run the dialog event loop + # Run the dialog event loop result = self.dlg.exec_() - # See if OK was pressed + # See if OK was pressed if result == 1: - # do something useful (delete the line containing pass and - # substitute with your code) + # do something useful (delete the line containing pass and + # substitute with your code) pass diff --git a/qgswcsclient2dialog.py b/qgswcsclient2dialog.py index 4c8f694..68e97d9 100644 --- a/qgswcsclient2dialog.py +++ b/qgswcsclient2dialog.py @@ -5,7 +5,7 @@ A QGIS plugin A OGC WCS 2.0/EO-WCS Client ------------------- - begin : 2014-06-26 + begin : 2014-06-26; 2017-04-10 copyright : (C) 2014 by Christian Schiller / EOX IT Services GmbH, Vienna, Austria email : christian dot schiller at eox dot at ***************************************************************************/ @@ -42,6 +42,7 @@ import os, sys, pickle from lxml import etree from glob import glob +from itertools import izip_longest from qgis.core import * from qgis.gui import * @@ -64,9 +65,6 @@ global config import config -global namespacemap -namespacemap = {"wcs": "http://www.opengis.net/wcs/2.0", "wcseo": "http://www.opengis.net/wcseo/1.0", "crs": "http://www.opengis.net/wcs/service-extension/crs/1.0", "gml" : "http://www.opengis.net/gml/3.2", "gmlcov" : "http://www.opengis.net/gmlcov/1.0", "ogc" : "http://www.opengis.net/ogc", "ows" : "http://www.opengis.net/ows/2.0", "swe" : "http://www.opengis.net/swe/2.0", "int" : "http://www.opengis.net/WCS_service-extension_interpolation/1.0", "eop" : "http://www.opengis.net/eop/2.0", "om" : "http://www.opengis.net/om/2.0"} - try: @@ -90,14 +88,24 @@ def mouse_busy(function): """ set the mouse icon to show clock """ - def new_function(self): + #def new_function(self): + def new_function(*args, **kwargs): """ set the mouse icon to show clock """ QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) - function(self) - QApplication.restoreOverrideCursor() - + QApplication.processEvents() + + try: + #function(self) + return function(*args, **kwargs) + except Exception as e: + raise e + print("Error {}".format(e.args[0])) + finally: + QApplication.restoreOverrideCursor() + + QApplication.restoreOverrideCursor() return new_function @@ -161,9 +169,10 @@ def clear_req_params(self, req_params): req_params.pop(k) return req_params -## ====== Beginning Server Tab-section ====== +## ====== Beginning Server Tab-section ====== + #--------------- # add a new server to the list def newServer(self): @@ -175,7 +184,6 @@ def newServer(self): dlgNew.show() self.btnConnectServer_Serv.setFocus(True) -##TODO -- sort the srv_list #--------------- # read the selected server/url params @@ -187,6 +195,119 @@ def get_serv_url(self): sel_url = config.srv_list['servers'][idx][1] return sel_serv, sel_url + +#--------------- + # modify a server entry + def editServer(self): + global config + + #print "btnEdit: here we are editing... " + flags = Qt.WindowTitleHint | Qt.WindowSystemMenuHint | Qt.WindowMinimizeButtonHint | Qt.WindowMaximizeButtonHint + + idx = self.cmbConnections_Serv.currentIndex() + select_serv = config.srv_list['servers'][idx] + print "Editing: ", idx, " -- ", select_serv, " -- Check: ", serv[idx] + + dlgEdit = qgsnewhttpconnectionbase(self, flags, toEdit=True, choice=idx) + dlgEdit.txt_NewSrvName.setText(select_serv[0]) + dlgEdit.txt_NewSrvUrl.setText(select_serv[1]) + dlgEdit.show() + self.btnConnectServer_Serv.setFocus(True) + +#--------------- + # delete a server entry + def deleteServer(self): + global config + + #print "btnDelete: here we are deleting...." + idx = self.cmbConnections_Serv.currentIndex() + print "Deleting: ", serv[idx]," -- ",config.srv_list['servers'][idx] + config.srv_list['servers'].pop(idx) + + self.write_srv_list() + self.updateServerListing() + self.btnConnectServer_Serv.setFocus(True) + +#--------------- + #sort the server list alphabetically + def sortServerListing(self): + + #print "btnSort_Serv: here we are sorting...." + config.srv_list = config.read_srv_list() + config.srv_list['servers'].sort() + + self.write_srv_list() + self.updateServerListing() + self.btnConnectServer_Serv.setFocus(True) + +#--------------- + # update the server-listing shown in the selectionBar + def updateServerListing(self): + global serv + global config + + #print "btnUpdateServerListing: here we are updating the ServerList...." + serv = [] + config.srv_list = config.read_srv_list() + for ii in range(len(config.srv_list['servers'])): + serv.append(config.srv_list['servers'][ii][0][:]) + + self.cmbConnections_Serv.clear() + self.cmbConnections_Serv.addItems(serv) + +#--------------- + # write the sever names/urls to a file + @mouse_busy + def write_srv_list(self): + + #print "btnwriteServerListing: here we are writing the ServerList...." + plugin_dir = os.path.dirname(os.path.realpath(__file__)) + outsrvlst = os.path.join(plugin_dir, 'config_srvlist.pkl') + fo = open(outsrvlst, 'wb') + pickle.dump(config.srv_list, fo, 0) + fo.close() + +#--------------- + # import WCS Names & Urls from the antive Qgis-settings location + @mouse_busy + def importQgis_ServList(self): + global config + from PyQt4.QtCore import QSettings + + #print "btnImport_QgsWcsUrls: here we are importing the Qgis-WCS ServerList...." + qgs_settings = QSettings(QSettings.NativeFormat, QSettings.UserScope, 'QGIS', 'QGIS2') + + qgis_wcs_urls = [] + for elem in qgs_settings.allKeys(): + if elem.startswith('Qgis/connections-wcs') and elem.endswith('url'): + print 'Importing WCS-Url: ', str.rsplit(str(elem),'/',2)[-2], qgs_settings.value(elem) + qgis_wcs_urls.append([str.rsplit(str(elem),'/',2)[-2], str(qgs_settings.value(elem))]) + + # append qgis_wcs_urls to the QgsWcsClient2 plugin settings + config.srv_list = config.read_srv_list() + for elem in qgis_wcs_urls: + config.srv_list['servers'].append((unicode(elem[0]), elem[1])) + + # write the imported settings to the QgsWcsClient2 plugin settings file + self.write_srv_list() + self.updateServerListing() + self.btnConnectServer_Serv.setFocus(True) + + +#--------------- + # get the path where the downloaded datasets shall be stored + @mouse_busy + def get_outputLoc(self): + global req_outputLoc + + start_dir = os.getenv("HOME") + req_outputLoc = QFileDialog.getExistingDirectory(self, "Select Output Path", start_dir) + if len(req_outputLoc) > 0: + if not req_outputLoc.endswith(os.sep): + req_outputLoc = req_outputLoc+os.sep + self.lineEdit_Serv_OutputLoc.setText(str(req_outputLoc)) + + #--------------- # check if the url exist and if we get a respond to a simple OWS request @mouse_busy @@ -198,10 +319,23 @@ def connectServer(self): selected_serv, selected_url = self.get_serv_url() print 'You choose: ', selected_serv, "URL:", selected_url + if self.tab_GCa.isEnabled(): + self.tab_GCa.setEnabled(False) + if self.tab_DC.isEnabled(): + self.tab_DC.setEnabled(False) + if self.tab_DCS.isEnabled(): + self.tab_DCS.setEnabled(False) + if self.tab_GCov.isEnabled(): + self.tab_GCov.setEnabled(False) + if self.checkBox_GCaFull.isChecked(): + self.checkBox_GCaFull.setChecked(False) + if self.checkBox_DCSFull.isChecked(): + self.checkBox_DCSFull.setChecked(False) + url_base = selected_url # request only §ions=ServiceMetadata -- this makes if faster (especially on large sites), # but some Servers don't provide/accept it, so there is a fallback implemented - url_ext1 = "service=WCS&request=GetCapabilities§ions=ServiceMetadata" + url_ext1 = "service=WCS&request=GetCapabilities§ions=ServiceMetadata,ServiceIdentification" url_ext2 = "service=WCS&request=GetCapabilities" myUrl = url_base + url_ext1 myUrl2 = url_base + url_ext2 @@ -224,11 +358,11 @@ def connectServer(self): self.reset_comboboxes() req_qgsmng = QNetworkAccessManager(self) - + # start the download response = download_url(req_qgsmng, myUrl, None, self.progress_dialog) - #print 'myUrl: ', response[0:1] - #print response[2] + #print 'myUrl: ', response[0:1] , type(response[1]) + #print 'Payload: ',response[2] # check if response is valid and useful, else try the fallback or issue an error if response[0] is not True: @@ -239,6 +373,10 @@ def connectServer(self): self.progress_dialog.close() else: msg = self.eval_response(response, msg) + elif response[0] is True and ((type(response[2]) is unicode or type(response[2]) is str) and response[2].startswith('Redirection-URL:')): + msg = msg+"\n\t**** ATTENTION! ****\nThe server you selected:\n\t"+selected_serv +"\nresponded with a:\n\t"+response[2]+"\n" + msg = msg+"Please VERIFY(!) URL and change your Server-List accordingly." + self.progress_dialog.close() elif response[0] is True and ((response[2] is not None or len(response[2]) == 0)): FGCa_sect = True msg = self.eval_response(response, msg) @@ -246,8 +384,8 @@ def connectServer(self): msg = msg+"Response: An Error occurred: --> "+str(response[1])+"\n HTTP-Code received: "+str(response[0])+"\n" self.progress_dialog.close() - self.textBrowser_Serv.setText(msg) + self.textBrowser_Serv.setText(msg) if FGCa_sect is True: self.checkBox_GCaDaSerSum.setChecked(True) @@ -256,13 +394,13 @@ def connectServer(self): self.checkBox_GCaDaSerSum.setChecked(False) self.checkBox_GCaCovSum.setChecked(False) - #QApplication.restoreOverrideCursor() - QApplication.changeOverrideCursor(Qt.ArrowCursor) - #--------------- # reset content of combo-boxes and tree-widgets def reset_comboboxes(self): + global config + #print 'Config.Interpol: ', config.default_interpol + self.treeWidget_GCa.clear() self.treeWidget_DC.clear() self.treeWidget_DCS.clear() @@ -271,20 +409,20 @@ def reset_comboboxes(self): self.comboBox_GCOvOutFormat.clear() self.comboBox_GCovOutCRS.clear() self.comboBox_GCovInterpol.clear() - default_interpol = ['nearest (default)', 'bilinear', 'average (slow)'] + for elem in range(0, 3): self.comboBox_GCovInterpol.addItem(_fromUtf8("")) - self.comboBox_GCovInterpol.setItemText(elem, _translate("QgsWcsClient2", default_interpol[elem], None)) - - + self.comboBox_GCovInterpol.setItemText(elem, _translate("QgsWcsClient2", config.default_interpol[elem], None)) #--------------- - # evaluate a valid response and anable settings in the tabs + # evaluate a valid response and enable settings in the tabs def eval_response(self, response, msg): msg = msg+"Response: Server OK\n" - self.parse_first_xml(response[2]) + ret_msg = self.parse_first_xml(response[2]) + if ret_msg is not None: + msg = msg + "\n"+ret_msg self.treeWidget_GCa.clear() self.treeWidget_DC.clear() self.treeWidget_DCS.clear() @@ -292,7 +430,7 @@ def eval_response(self, response, msg): self.progress_dialog.close() - # all tabs (except Server/Help/About) are disable until server connection is OK + # all tabs (except Server/Help/About) are disabled until server connection is OK # once server connection is verifyed, activate all other tabs if not self.tab_GCa.isEnabled(): self.tab_GCa.setEnabled(True) @@ -317,7 +455,6 @@ def eval_response(self, response, msg): if not self.spinBox_DCSCount.isEnabled(): self.spinBox_DCSCount.setEnabled(True) - if self.radioButton_GCovSubCRS.isChecked(): self.radioButton_GCovSubCRS.setChecked(False) if self.radioButton_GCovSubPixel.isChecked(): @@ -336,41 +473,120 @@ def eval_response(self, response, msg): return msg + +#--------------- + # get a mapping of the namespaces + def get_namespace(self, result_xml): + my_nsp=result_xml.getroot().nsmap + return my_nsp + +#--------------- + # get a listing of interpoation methods offered + def getlist_interpol(self, result_xml, my_nsp): + interpol=[] + for k,v in my_nsp.iteritems(): + if 'int' in k: + prefix = './/' +k+ ':' + #print prefix + + for elem in (result_xml.findall(prefix+'InterpolationSupported', my_nsp)): + interpol.append(os.path.basename(elem.text)) + if len(interpol) == 0: + for elem in (result_xml.findall(prefix+'interpolationSupported', my_nsp)): + interpol.append(elem.text.rsplit('/',1)[1]) + + if len(interpol) == 0: + interpol = config.default_interpol + + return interpol + +#--------------- + # get a listing of CRSs offered + def getlist_crs(self, result_xml, my_nsp): + crs=[] + for k,v in my_nsp.iteritems(): + if 'crs' in k: + prefix = './/' +k+ ':' + #print prefix + + for elem in (result_xml.findall(prefix+'crsSupported', my_nsp)): + #print elem.text + crs.append(os.path.basename(elem.text)) + + if 'wcscrs' in k: + prefix = './/' +k+ ':' + #print prefix + + for elem in (result_xml.findall(prefix+'crsSupported', my_nsp)): + #print elem.text + crs.append(os.path.basename(elem.text)) + + return crs + +#--------------- + # get a listing of fromats offered + def getlist_formats(self, result_xml, my_nsp): + formats=[] + for k,v in my_nsp.iteritems(): + if 'wcs' in k: + prefix = './/' +k+ ':' + #print prefix + + for elem in (result_xml.findall(prefix+'formatSupported', my_nsp)): + #print elem.text + formats.append(elem.text) + + return formats + #--------------- # parse the response issued during "Server Connect" and set some parameters def parse_first_xml(self, in_xml): global offered_version - + global config + global use_wcs_GCo_call + use_wcs_GCo_call = 0 join_xml = ''.join(in_xml) - tree1 = etree.XML(join_xml) - # get the required information from the GetCapabilitiy response - outformat = tree1.xpath("wcs:ServiceMetadata/wcs:formatSupported/text()", namespaces=namespacemap) - outcrs = tree1.xpath("wcs:ServiceMetadata/wcs:Extension/crs:crsSupported/text()", namespaces=namespacemap) - # new syntax ??? vereify - #outcrs = tree1.xpath("wcs:ServiceMetadata/wcs:Extension/crs:CrsMetadata/crs:crsSupported/text()", namespaces=namespacemap) + #fix by hkristen + tree1 = etree.XML(join_xml) - interpol = tree1.xpath("wcs:ServiceMetadata/wcs:Extension/int:interpolationSupported/text()", namespaces=namespacemap) - # new syntax ??? verify - #interpol = tree1.xpath("wcs:ServiceMetadata/wcs:Extension/int:InterpolationMetadata/int:InterpolationSupported/text()", namespaces=namespacemap) - offered_version = tree1.attrib['version'] + print 'WCS-Version: ', offered_version + + # since this is for plugin WCS >2.0 and EO-WCS, we skip the WCS 1.x and issue an error + if offered_version.startswith('1'): + msg = "WARNING: \nThe selected Site doesn't support WCS 2.0 or above. \n\n" + msg = msg+"The server responded with supported version: "+ offered_version +"\n" + msg = msg+" (Hint: try to use the QGis internal WCS for this site)" + self.progress_dialog.close() + warning_msg(msg) + return msg + + + # check which additional profiles are offered + # especially for the "WCS_service-extension_crs/1.0/conf/crs" profile, since this one changes the request syntax + target_profile = "WCS_service-extension_crs/1.0/conf/crs" + profiles = tree1.xpath("ows:ServiceIdentification/ows:Profile/text()", namespaces=tree1.nsmap) + res_prof = [x for x in profiles if (target_profile in x)] + + if res_prof.__len__() > 0: + # set global parameter for WCS-GetCoverage call selection + use_wcs_GCo_call = 1 + + my_nsp = self.get_namespace(tree1.getroottree()) + #print 'MY_NSP: ',my_nsp + + interpol = self.getlist_interpol(tree1, my_nsp) + outcrs = self.getlist_crs(tree1, my_nsp) + outformat = self.getlist_formats(tree1, my_nsp) oformat_num = len(outformat) ocrs_num = len(outcrs) interpol_num = len(interpol) support_outcrs = [] support_interpol = [] - #print 'support_outcrs: ',ocrs_num, type(outcrs), outcrs - #print 'formatSupported: ',oformat_num, type(outformat), outformat - #print 'support_interpol: ', interpol_num, type(interpol), interpol - #print 'offered_version: ', type(offered_version), offered_version - - # since this is for plugin WCS 2.0 and EO-WCS, we skip the WCS 1.x and issue an error - if offered_version.startswith('1'): - msg = "WARNING: \nThe chosen WCS Server doesn't support WCS 2.0 or above \n" - msg = msg+"The server responded with supported version: "+offered_version - warning_msg(msg) + #print 'INT-1: ', interpol + #print 'INT-1a: ', outcrs # set the output-crs, output-format, and interpolation possibilities # in the corresponding combo-boxes @@ -380,6 +596,10 @@ def parse_first_xml(self, in_xml): for elem in interpol: support_interpol.append(os.path.basename(elem)) + #print 'supported_format: ',oformat_num, type(outformat), outformat + #print 'supported_outcrs: ',ocrs_num, type(outcrs), outcrs + #print 'supported_interpol: ', interpol_num, type(interpol), interpol + for elem in range(0, oformat_num): self.comboBox_GCOvOutFormat.addItem(_fromUtf8("")) self.comboBox_GCOvOutFormat.setItemText(elem, _translate("QgsWcsClient2", outformat[elem], None)) @@ -388,99 +608,29 @@ def parse_first_xml(self, in_xml): self.comboBox_GCovOutCRS.addItem(_fromUtf8("")) self.comboBox_GCovOutCRS.setItemText(elem, _translate("QgsWcsClient2", support_outcrs[elem], None)) + self.comboBox_GCovInterpol.clear() for elem in range(0, interpol_num): self.comboBox_GCovInterpol.addItem(_fromUtf8("")) self.comboBox_GCovInterpol.setItemText(elem, _translate("QgsWcsClient2", support_interpol[elem], None)) -#--------------- - # modify a server entry - def editServer(self): - global config - - #print "btnEdit: here we are editing... " - flags = Qt.WindowTitleHint | Qt.WindowSystemMenuHint | Qt.WindowMinimizeButtonHint | Qt.WindowMaximizeButtonHint - - idx = self.cmbConnections_Serv.currentIndex() - select_serv = config.srv_list['servers'][idx] - - print "Selection: ", idx, " -- ", select_serv, " -- Check: ", serv[idx] - - dlgEdit = qgsnewhttpconnectionbase(self, flags, toEdit=True, choice=idx) - dlgEdit.txt_NewSrvName.setText(select_serv[0]) - dlgEdit.txt_NewSrvUrl.setText(select_serv[1]) - dlgEdit.show() - self.btnConnectServer_Serv.setFocus(True) - -#--------------- - # dele a server entry - def deleteServer(self): - global config - - #print "btnDelete: here we are deleting...." - idx = self.cmbConnections_Serv.currentIndex() - config.srv_list['servers'].pop(idx) - - self.write_srv_list() - self.updateServerListing() - self.btnConnectServer_Serv.setFocus(True) - -#--------------- - # update the server-listing shown in the selectionBar - def updateServerListing(self): - global serv - global config - - #print "btnUpdateServerListing: here we are updating the ServerList...." - serv = [] - config.srv_list = config.read_srv_list() - for ii in range(len(config.srv_list['servers'])): - serv.append(config.srv_list['servers'][ii][0][:]) - - self.cmbConnections_Serv.clear() - self.cmbConnections_Serv.addItems(serv) - -#--------------- - # write the sever names/urls to a file - @mouse_busy - def write_srv_list(self): +## ====== End of Server Tab-section ====== - #print "btnwriteServerListing: here we are writing the ServerList...." - plugin_dir = os.path.dirname(os.path.realpath(__file__)) - outsrvlst = os.path.join(plugin_dir, 'config_srvlist.pkl') - fo = open(outsrvlst, 'wb') - pickle.dump(config.srv_list, fo, 0) - fo.close() #--------------- - # get the path where the downloaded datasets shall be stored - @mouse_busy - def get_outputLoc(self): - global req_outputLoc - - start_dir = os.getenv("HOME") - req_outputLoc = QFileDialog.getExistingDirectory(self, "Select Output Path", start_dir) - if len(req_outputLoc) > 0: - if not req_outputLoc.endswith(os.sep): - req_outputLoc = req_outputLoc+os.sep - self.lineEdit_Serv_OutputLoc.setText(str(req_outputLoc)) - #print req_outputLoc - - -## ====== End of Server section ====== - - -## ====== Beginning GetCapabilities section ====== - # read-out params from the GetCapabilities Tab, execute the request and show results @mouse_busy def exeGetCapabilities(self): + """ + read-out params from the GetCapabilities Tab, execute the request and show results + """ global cov_ids global dss_ids global req_outputLoc self.treeWidget_GCa.clear() req_sections = [] + req_full_GCa = False req_updateDate = '' selected_serv, selected_url = self.get_serv_url() @@ -502,6 +652,8 @@ def exeGetCapabilities(self): req_sections.append("Content") if self.checkBox_GCaLang.isChecked(): req_sections.append("Languages") + if self.checkBox_GCaFull.isChecked(): + req_full_GCa = True req_outputLoc = self.lineEdit_Serv_OutputLoc.text() @@ -525,25 +677,43 @@ def exeGetCapabilities(self): # issue the WCS request GCa_result = self.myWCS.GetCapabilities(req_params) + #print "GCa_result: ", type(GCa_result), GCa_result[0], GCa_result[1], GCa_result + if type(GCa_result) is list and GCa_result[0] == 'ERROR': + self.textBrowser_Serv.setText(GCa_result[0]+'\n'+GCa_result[1]+'\n HINT: Select only the "All" setting or select none') + warning_msg(GCa_result[0]+'\n'+GCa_result[1]+'\n HINT: Select only the All setting or select none') + return + - # parse the results and place them in the crespective widgets - cov_ids, dss_ids, dss_begin, dss_end = self.parse_GCa_xml(GCa_result) + #print 'RESULT: ',GCa_result + if req_full_GCa is False: + # parse the results and place them in the crespective widgets + try: + cov_ids, dss_ids, dss_begin, dss_end, cov_lcorn, cov_ucorn, dss_lcorn, dss_ucorn = self.parse_GCa_xml(GCa_result) + except TypeError: + self.textBrowser_Serv.setText("No usable results received"+'\n HINT: Select only the "All" setting or select none') + warning_msg("No usable results received"+'\n HINT: Select only the All setting or select none') + return -# TODO -- add the coverage extension (BoundingBox) information to the respective Tabs + # TODO -- add the coverage extension (BoundingBox) information to the respective Tabs + if len(cov_ids) > 0: + for ids, uc, lc, in izip_longest(cov_ids, cov_ucorn, cov_lcorn, fillvalue = ""): + inlist = (ids, "", "", uc, lc, "C") + item = QtGui.QTreeWidgetItem(self.treeWidget_GCa, inlist) - if len(cov_ids) > 0: - for elem in cov_ids: - inlist = (elem, "", "", "C") - item = QtGui.QTreeWidgetItem(self.treeWidget_GCa, inlist) + if len(dss_ids) > 0: + for a, b, c, d, e in izip_longest(dss_ids, dss_begin, dss_end, dss_ucorn, dss_lcorn, fillvalue = ""): + inlist = (a, b, c, d, e, "S") + item = QtGui.QTreeWidgetItem(self.treeWidget_GCa, inlist) - if len(dss_ids) > 0: - for a, b, c in zip(dss_ids, dss_begin, dss_end): - inlist = (a, b, c, "S") - item = QtGui.QTreeWidgetItem(self.treeWidget_GCa, inlist) - self.treeWidget_GCa.resizeColumnToContents(0) + self.treeWidget_GCa.resizeColumnToContents(0) + else: + myDisplay_txt = display_txt(self) + myDisplay_txt.textBrowser_Disp.setText(GCa_result) + myDisplay_txt.show() + if self.checkBox_GCaFull.isChecked(): + self.checkBox_GCaFull.setChecked(False) - #QApplication.restoreOverrideCursor() QApplication.changeOverrideCursor(Qt.ArrowCursor) #--------------- @@ -559,13 +729,13 @@ def on_GCa_clicked(self): # place selected items also in the DescribeCoverage, DescribeEOCoverageSet, GetCoverage Tab widgets for elem in sel_GCa_items: - # covID BeginTime EndTime [C]/[S] - print 'Selected Item: ', elem.data(0, 0), elem.data(1, 0), elem.data(2, 0), elem.data(3, 0) + # covID BeginTime EndTime UpperCorner LowerCorner [C]/[S] + print 'Selected Item: ', elem.data(0, 0), elem.data(1, 0), elem.data(2, 0), elem.data(3, 0), elem.data(4, 0), elem.data(5, 0) if elem.data(0, 0) in cov_ids: item = QtGui.QTreeWidgetItem(self.treeWidget_DC, (elem.data(0, 0), )) item2 = QtGui.QTreeWidgetItem(self.treeWidget_GCov, (elem.data(0, 0), )) elif elem.data(0, 0) in dss_ids: - item1 = QtGui.QTreeWidgetItem(self.treeWidget_DCS, (elem.data(0, 0), elem.data(1, 0), elem.data(2, 0))) + item1 = QtGui.QTreeWidgetItem(self.treeWidget_DCS, (elem.data(0, 0), elem.data(1, 0), elem.data(2, 0), elem.data(3, 0), elem.data(4, 0))) self.treeWidget_DC.resizeColumnToContents(0) self.treeWidget_DCS.resizeColumnToContents(0) @@ -585,17 +755,64 @@ def updateDateChanged(self): #--------------- # parse GetCapabilities XML-response def parse_GCa_xml(self, GCa_result): - + join_xml = ''.join(GCa_result) - tree = etree.fromstring(join_xml) - coverage_ids = tree.xpath("wcs:Contents/wcs:CoverageSummary/wcs:CoverageId/text()", namespaces=namespacemap) - datasetseries_ids = tree.xpath("wcs:Contents/wcs:Extension/wcseo:DatasetSeriesSummary/wcseo:DatasetSeriesId/text()", namespaces=namespacemap) - datasetseries_timeBegin = tree.xpath("wcs:Contents/wcs:Extension/wcseo:DatasetSeriesSummary/gml:TimePeriod/gml:beginPosition/text()", namespaces=namespacemap) + tree = etree.fromstring(join_xml).getroottree() + nsmap=tree.getroot().nsmap + + if len(tree.xpath("wcs:Contents", namespaces=nsmap)) == 0: + return + + # Coverages ID + try: + coverage_ids = tree.xpath("wcs:Contents/wcs:CoverageSummary/wcs:CoverageId/text()", namespaces=nsmap) + except etree.XPathEvalError: + coverage_ids = [] - datasetseries_timeEnd = tree.xpath("wcs:Contents/wcs:Extension/wcseo:DatasetSeriesSummary/gml:TimePeriod/gml:endPosition/text()", namespaces=namespacemap) + # Coverages ID - Corner Coordinates + try: + cov_lower_corner = tree.xpath("wcs:Contents/wcs:CoverageSummary/ows:WGS84BoundingBox/ows:LowerCorner/text()", namespaces=nsmap) + except etree.XPathEvalError: + cov_lower_corner = [] + + try: + cov_upper_corner = tree.xpath("wcs:Contents/wcs:CoverageSummary/ows:WGS84BoundingBox/ows:UpperCorner/text()", namespaces=nsmap) + except etree.XPathEvalError: + cov_upper_corner = [] + + + # DatasetSeries ID + try: + datasetseries_ids = tree.xpath("wcs:Contents/wcs:Extension/wcseo:DatasetSeriesSummary/wcseo:DatasetSeriesId/text()", namespaces=nsmap) + except etree.XPathEvalError: + datasetseries_ids = [] + + # DatasetSeries - Time Period + try: + datasetseries_timeBegin = tree.xpath("wcs:Contents/wcs:Extension/wcseo:DatasetSeriesSummary/gml:TimePeriod/gml:beginPosition/text()", namespaces=nsmap) + except etree.XPathEvalError: + datasetseries_ids = [] + datasetseries_timeBegin = [] + + try: + datasetseries_timeEnd = tree.xpath("wcs:Contents/wcs:Extension/wcseo:DatasetSeriesSummary/gml:TimePeriod/gml:endPosition/text()", namespaces=nsmap) + except etree.XPathEvalError: + datasetseries_timeEnd = [] + + # DatasetSeries - Corner Coordinates + try: + datasetseries_lower_corner = tree.xpath("wcs:Contents/wcs:Extension/wcseo:DatasetSeriesSummary/ows:WGS84BoundingBox/ows:LowerCorner/text()", namespaces=nsmap) + except etree.XPathEvalError: + datasetseries_lower_corner = [] + + try: + datasetseries_upper_corner = tree.xpath("wcs:Contents/wcs:Extension/wcseo:DatasetSeriesSummary/ows:WGS84BoundingBox/ows:UpperCorner/text()", namespaces=nsmap) + except etree.XPathEvalError: + datasetseries_upper_corner = [] - return coverage_ids, datasetseries_ids, datasetseries_timeBegin, datasetseries_timeEnd + + return coverage_ids, datasetseries_ids, datasetseries_timeBegin, datasetseries_timeEnd, cov_lower_corner, cov_upper_corner, datasetseries_lower_corner, datasetseries_upper_corner ## ====== End of GetCapabilities section ====== @@ -617,27 +834,25 @@ def exeDescribeCoverage(self): req_params = {'version': offered_version, 'request': 'DescribeCoverage', 'server_url': selected_url, - 'coverageID': selected_covid} + 'coverageID': selected_covid } except NameError: - msg = "Error, You need to select a CoverageID first!\n (see also GetCapabilities TAB)" + msg = "Error: You need to select a CoverageID first!\n (see also GetCapabilities TAB)" warning_msg(msg) - #self.tabWidget_EOWcsClient2.setCurrentIndex(1) return req_params = self.clear_req_params(req_params) #print "DC: ", req_params - DC_result = self.myWCS.DescribeCoverage(req_params) # also read out the gml:Envelope axisLabels - use only first returned entry # TODO - associate the right axisLabe / CRS etc. with each cooverage join_xml = ''.join(DC_result) tree = etree.fromstring(join_xml) - axis_labels = tree.xpath("wcs:CoverageDescription/gml:boundedBy/gml:Envelope/@axisLabels|wcs:CoverageDescription/gml:boundedBy/gml:EnvelopeWithTimePeriod/@axisLabels", namespaces=namespacemap) + axis_labels = tree.xpath("wcs:CoverageDescription/gml:boundedBy/gml:Envelope/@axisLabels|wcs:CoverageDescription/gml:boundedBy/gml:EnvelopeWithTimePeriod/@axisLabels", namespaces=tree.nsmap) axis_labels = axis_labels[0].encode().split(" ") #print 'AxisLabels: ',axis_labels - offered_crs = tree.xpath("wcs:CoverageDescription/gml:boundedBy/gml:Envelope/@srsName|wcs:CoverageDescription/gml:boundedBy/gml:EnvelopeWithTimePeriod/@srsName", namespaces=namespacemap) + offered_crs = tree.xpath("wcs:CoverageDescription/gml:boundedBy/gml:Envelope/@srsName|wcs:CoverageDescription/gml:boundedBy/gml:EnvelopeWithTimePeriod/@srsName", namespaces=tree.nsmap) offered_crs = os.path.basename(offered_crs[0]) #print 'Offered CRS: ',offered_crs # set a default if AxisdLabels, offered_crs are not presented @@ -667,9 +882,9 @@ def exeDescribeCoverage(self): myDisplay_txt.textBrowser_Disp.setText(DC_result) myDisplay_txt.show() - #QApplication.restoreOverrideCursor() QApplication.changeOverrideCursor(Qt.ArrowCursor) + #--------------- # the DescribeCoverage Button def on_DC_clicked(self): @@ -677,7 +892,7 @@ def on_DC_clicked(self): sel_DC_items = self.treeWidget_DC.selectedItems() selected_covid = sel_DC_items[0].data(0, 0).encode() -# return + #--------------- # parse DescribeCoverage XML-response @@ -724,10 +939,13 @@ def exeDescribeEOCoverageSet(self): else: req_count = None - if self.checkBox_DCSIDonly.isChecked(): - req_IDs_only = True - else: + if self.checkBox_DCSFull.isChecked(): req_IDs_only = False + else: + req_IDs_only = True + + if self.checkBox_DCSFull.isChecked(): + self.checkBox_DCSFull.setChecked(False) min_x = self.lineEdit_DCSMinLon.text() max_x = self.lineEdit_DCSMaxLon.text() @@ -745,6 +963,12 @@ def exeDescribeEOCoverageSet(self): if self.checkBox_DCS_ActiveDate.isChecked(): beginTime = self.dateTimeEdit_DCSBegin.text() endTime = self.dateTimeEdit_DCSEnd.text() + # check if begin is before end; otherwise err_msg + if beginTime > endTime: + msg="Dates entered: End-Time before Start-Time\nPlease correct the Dates" + warning_msg(msg) + return + req_toi = str(beginTime.strip()+","+endTime.strip()) else: req_toi = None @@ -752,7 +976,9 @@ def exeDescribeEOCoverageSet(self): try: # a basic DescribeEOCoverageSet request - selected_eoid = ','.join(selected_eoid) + if type(selected_eoid) is list: + selected_eoid = ','.join(selected_eoid) + req_params = {'version': offered_version, 'request': 'DescribeEOCoverageSet', 'server_url': selected_url, @@ -765,9 +991,8 @@ def exeDescribeEOCoverageSet(self): 'section' : req_sections, 'IDs_only': req_IDs_only} except NameError: - msg = "Error, You need to select an DatasetSeriesID (eoID) first!\n (see also GetCapabilities TAB)" + msg = "Error: You need to select an DatasetSeriesID (eoID) first!\n (see also GetCapabilities TAB)" warning_msg(msg) - #self.tabWidget_EOWcsClient2.setCurrentIndex(1) return @@ -781,7 +1006,7 @@ def exeDescribeEOCoverageSet(self): msg='Sorry, it seems that there are no datasets for the chosen parameters.' warning_msg(msg) return - + # set a default if AxisdLabels, offered_crs are not presented if len(axis_labels) == 0: axis_labels = ["", ""] @@ -805,12 +1030,9 @@ def exeDescribeEOCoverageSet(self): else: DCS_result = self.myWCS.DescribeEOCoverageSet(req_params) -##TODO add Button to concurrently also view the full XML-Response file (=> Getcapabilities) - # for the DescribeEOCoverageSet the full Response will be shown if IDs_only check-box is not checked ! # get only the IDs to be used thereafter in the GetCoverage Tab & Request if req_params['IDs_only'] == True: - #self.treeWidget_DCS.clear() self.treeWidget_GCov.clear() for elem in DCS_result: item = QtGui.QTreeWidgetItem(self.treeWidget_GCov, [elem]) @@ -827,9 +1049,9 @@ def exeDescribeEOCoverageSet(self): self.treeWidget_DCS.resizeColumnToContents(0) - #QApplication.restoreOverrideCursor() QApplication.changeOverrideCursor(Qt.ArrowCursor) + #--------------- # activate the 2 Date-Subsetting selection fields def enableDCS_ActiveDate(self): @@ -840,6 +1062,7 @@ def enableDCS_ActiveDate(self): self.dateTimeEdit_DCSBegin.setEnabled(True) self.dateTimeEdit_DCSEnd.setEnabled(True) + #--------------- # activate the Count field def enableDCS_ActiveCount(self): @@ -848,6 +1071,7 @@ def enableDCS_ActiveCount(self): else: self.spinBox_DCSCount.setEnabled(True) + #--------------- # DescribeEOCoverageSet Button def on_DCS_clicked(self): @@ -871,6 +1095,8 @@ def exeGetCoverage(self): global req_outputLoc global offered_crs global offered_version + global use_wcs_GCo_call + selected_serv, selected_url = self.get_serv_url() @@ -878,6 +1104,10 @@ def exeGetCoverage(self): req_interpolation = self.comboBox_GCovInterpol.currentText() req_outputcrs = self.comboBox_GCovOutCRS.currentText() + #print 'REQ-INT: ', req_interpolation + #print 'REQ-CRS: ', req_outputcrs + #print 'REQ-FORMAT: ', req_format + if req_interpolation.encode().startswith("nearest"): req_interpolation = None @@ -908,6 +1138,15 @@ def exeGetCoverage(self): req_size_x = None req_size_y = None + + # check if a coverage has been selected + try: + selected_gcovid + except NameError: + msg = "Error: You need to select one or more Coverage(s) first.\n(see the GetCapabilities & DescribeEOCoverageSet TABs" + warning_msg(msg) + return + if self.radioButton_GCovSubOrig.isChecked(): req_subsetCRS = "epsg:"+offered_crs if self.radioButton_GCovSubCRS.isChecked(): @@ -932,9 +1171,6 @@ def exeGetCoverage(self): req_lat = req_subsetCRS+" "+req_y_label+" "+str(min_y+","+max_y) - #if req_outputcrs == offered_crs: - #req_outputcrs = None - if not "req_outputLoc" in globals(): msg = "Error: For downloading coverages you need to supply a Local Storage Path --> see TAB Server / Storage" QMessageBox.critical(self, "Error", msg, QMessageBox.Ok) @@ -947,6 +1183,7 @@ def exeGetCoverage(self): else: req_outputLoc = self.lineEdit_Serv_OutputLoc.text() + try: # a basic GetCoverage request for gcov_elem in selected_gcovid: @@ -970,47 +1207,38 @@ def exeGetCoverage(self): req_params['mediatype'] = 'multipart/related' - ##print req_params - #req_params = self.clear_req_params(req_params) - ##print req_params - #GCov_result = self.myWCS.GetCoverage(req_params) - #print "GCov_result / HTTP-Code: ", GCov_result try: # send the request #print req_params req_params = self.clear_req_params(req_params) - #print req_params - GCov_result = self.myWCS.GetCoverage(req_params) + #print "req_params-2:", req_params + + GCov_result = self.myWCS.GetCoverage(req_params, use_wcs_GCo_call) print "GCov_result / HTTP-Code: ", GCov_result - except IOError, TypeError: + except IOError, TypeError: return - ## TODO -- mediatype & mask --> not yet implemented +## TODO -- mediatype & mask --> not yet implemented; but mask is not standard anyway # 'mask': '&mask=polygon,'+crs_url, if GCov_result == 200: #Register the downloaded datsets with QGis MapCanvas -> load and show self.add_to_map(req_params) # reset the cursur - #QApplication.restoreOverrideCursor() QApplication.changeOverrideCursor(Qt.ArrowCursor) - else: + else: msg = "There is no loadable/viewable Coverage available ! \nMaybe it wasn't an image format you choose ? \n" msg = msg+"Please check you output-location. \n" msg = msg+"But maybe another error occurred. \nPlease check you output-location for 'access_error_xxxx.xml' files" warning_msg(msg) - - - except NameError as EEE: print 'NameError: ', EEE - msg = "Error, You need to select one or more CoverageIDs first!\n " + msg = "Error: You need to select one or more CoverageIDs first!\n " warning_msg(msg) - #self.tabWidget_EOWcsClient2.setCurrentIndex(1) return @@ -1040,6 +1268,7 @@ def enableGCov_SubCRS(self): self.radioButton_GCovSubPixel.setChecked(False) self.lineEdit_GCovSubEPSG.setEnabled(True) + #--------------- # activate the SubsetPixel setting def enableGCov_SubPixel(self): @@ -1048,6 +1277,7 @@ def enableGCov_SubPixel(self): self.radioButton_GCovSubOrig.setChecked(False) self.lineEdit_GCovSubEPSG.setEnabled(False) + #--------------- # activate the OriginalCRS setting def enableGCov_SubOrig(self): @@ -1056,6 +1286,7 @@ def enableGCov_SubOrig(self): self.radioButton_GCovSubPixel.setChecked(False) self.lineEdit_GCovSubEPSG.setEnabled(False) + #--------------- # enabele scaling X-Size def enableGCov_XSize(self): @@ -1065,6 +1296,7 @@ def enableGCov_XSize(self): self.lineEdit_GCovXSize.setEnabled(True) self.radioButton_GCovXRes.setChecked(False) + #--------------- # enabele scaling X-Resolution def enableGCov_XResolution(self): @@ -1074,6 +1306,7 @@ def enableGCov_XResolution(self): self.lineEdit_GCovXAxisLabel.setEnabled(True) self.lineEdit_GCovXSize.setEnabled(True) + #--------------- # enabele scaling Y-Size def enableGCov_YSize(self): @@ -1083,6 +1316,7 @@ def enableGCov_YSize(self): self.lineEdit_GCovYSize.setEnabled(True) self.radioButton_GCovYRes.setChecked(False) + #--------------- # enabele scaling Y-Resolution def enableGCov_YResolution(self): @@ -1092,6 +1326,7 @@ def enableGCov_YResolution(self): self.lineEdit_GCovYAxisLabel.setEnabled(True) self.lineEdit_GCovYSize.setEnabled(True) + #--------------- # reset scaling to original size/resolution def disableGCov_OutSize(self): @@ -1120,14 +1355,19 @@ def add_to_map(self, req_params): # check if there is a loadable coverage availabel (and not eg. an multipart/related gml) or an error occurred if len(disp_coverage) > 0: covInfo = QFileInfo(disp_coverage[-1]) - cov_baseName = covInfo.baseName() + cov_baseName = disp_coverage[-1].rsplit('/',1)[-1] cov_layer = QgsRasterLayer(disp_coverage[-1], cov_baseName.encode()) if not cov_layer.isValid(): warning_msg("Layer failed to load!") + #print 'CC1: ', disp_coverage + #print 'CC2: ', help(covInfo) + #print 'CC3: ', cov_baseName + #print 'CC4: ', covInfo.baseName(), covInfo.bundleName, covInfo.completeBaseName + else: msg = "There is no loadable/viewable Coverage available ! \nMaybe it wasn't an image format you choose ? \n" - msg = msg+"But maybe another error occurred. \nPlease check you output-location for 'access_error_xxxx.xml' files" + msg = msg+"But maybe another error occurred. \nPlease check your output-location for 'access_error_xxxx.xml' files" warning_msg(msg) diff --git a/ui_qgswcsclient2.py b/ui_qgswcsclient2.py index 21ef07e..c9518d5 100644 --- a/ui_qgswcsclient2.py +++ b/ui_qgswcsclient2.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'ui_qgswcsclient2.ui' # -# Created: Fri Sep 5 14:14:13 2014 +# Created: Mon Apr 10 15:51:03 2017 # by: PyQt4 UI code generator 4.10.4 # # WARNING! All changes made in this file will be lost! @@ -26,90 +26,121 @@ def _translate(context, text, disambig): class Ui_QgsWcsClient2(object): def setupUi(self, QgsWcsClient2): QgsWcsClient2.setObjectName(_fromUtf8("QgsWcsClient2")) - QgsWcsClient2.resize(799, 676) + QgsWcsClient2.resize(824, 748) + self.verticalLayout_6 = QtGui.QVBoxLayout(QgsWcsClient2) + self.verticalLayout_6.setObjectName(_fromUtf8("verticalLayout_6")) self.tabWidget_EOWcsClient2 = QtGui.QTabWidget(QgsWcsClient2) self.tabWidget_EOWcsClient2.setEnabled(True) - self.tabWidget_EOWcsClient2.setGeometry(QtCore.QRect(10, 0, 781, 661)) self.tabWidget_EOWcsClient2.setLocale(QtCore.QLocale(QtCore.QLocale.English, QtCore.QLocale.UnitedStates)) self.tabWidget_EOWcsClient2.setObjectName(_fromUtf8("tabWidget_EOWcsClient2")) self.tab_Serv = QtGui.QWidget() self.tab_Serv.setObjectName(_fromUtf8("tab_Serv")) + self.verticalLayout_11 = QtGui.QVBoxLayout(self.tab_Serv) + self.verticalLayout_11.setObjectName(_fromUtf8("verticalLayout_11")) self.GroupBox_9 = QtGui.QGroupBox(self.tab_Serv) - self.GroupBox_9.setGeometry(QtCore.QRect(7, 13, 762, 121)) self.GroupBox_9.setObjectName(_fromUtf8("GroupBox_9")) - self._6 = QtGui.QGridLayout(self.GroupBox_9) - self._6.setMargin(9) - self._6.setSpacing(6) - self._6.setObjectName(_fromUtf8("_6")) - self.btnDelete_Serv = QtGui.QPushButton(self.GroupBox_9) - self.btnDelete_Serv.setEnabled(False) - self.btnDelete_Serv.setAutoDefault(False) - self.btnDelete_Serv.setObjectName(_fromUtf8("btnDelete_Serv")) - self._6.addWidget(self.btnDelete_Serv, 4, 3, 1, 1) - spacerItem = QtGui.QSpacerItem(258, 27, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) - self._6.addItem(spacerItem, 4, 4, 1, 1) - self.btnEdit_Serv = QtGui.QPushButton(self.GroupBox_9) - self.btnEdit_Serv.setEnabled(False) - self.btnEdit_Serv.setAutoDefault(False) - self.btnEdit_Serv.setObjectName(_fromUtf8("btnEdit_Serv")) - self._6.addWidget(self.btnEdit_Serv, 4, 2, 1, 1) - self.btnNew_Serv = QtGui.QPushButton(self.GroupBox_9) - self.btnNew_Serv.setAutoDefault(False) - self.btnNew_Serv.setObjectName(_fromUtf8("btnNew_Serv")) - self._6.addWidget(self.btnNew_Serv, 4, 1, 1, 1) + self.verticalLayout_15 = QtGui.QVBoxLayout(self.GroupBox_9) + self.verticalLayout_15.setObjectName(_fromUtf8("verticalLayout_15")) + self.label_6 = QtGui.QLabel(self.GroupBox_9) + self.label_6.setObjectName(_fromUtf8("label_6")) + self.verticalLayout_15.addWidget(self.label_6) self.cmbConnections_Serv = QtGui.QComboBox(self.GroupBox_9) self.cmbConnections_Serv.setObjectName(_fromUtf8("cmbConnections_Serv")) - self._6.addWidget(self.cmbConnections_Serv, 1, 0, 1, 5) + self.verticalLayout_15.addWidget(self.cmbConnections_Serv) + self.horizontalLayout_21 = QtGui.QHBoxLayout() + self.horizontalLayout_21.setObjectName(_fromUtf8("horizontalLayout_21")) self.btnConnectServer_Serv = QtGui.QPushButton(self.GroupBox_9) self.btnConnectServer_Serv.setEnabled(True) self.btnConnectServer_Serv.setObjectName(_fromUtf8("btnConnectServer_Serv")) - self._6.addWidget(self.btnConnectServer_Serv, 4, 0, 1, 1) - self.label_6 = QtGui.QLabel(self.GroupBox_9) - self.label_6.setObjectName(_fromUtf8("label_6")) - self._6.addWidget(self.label_6, 0, 0, 1, 1) - self.textBrowser_Serv = QtGui.QTextBrowser(self.tab_Serv) - self.textBrowser_Serv.setGeometry(QtCore.QRect(20, 166, 731, 321)) - self.textBrowser_Serv.setObjectName(_fromUtf8("textBrowser_Serv")) - self.btnClose_Serv = QtGui.QPushButton(self.tab_Serv) - self.btnClose_Serv.setGeometry(QtCore.QRect(650, 585, 98, 27)) - self.btnClose_Serv.setObjectName(_fromUtf8("btnClose_Serv")) + self.horizontalLayout_21.addWidget(self.btnConnectServer_Serv) + self.btnNew_Serv = QtGui.QPushButton(self.GroupBox_9) + self.btnNew_Serv.setAutoDefault(False) + self.btnNew_Serv.setObjectName(_fromUtf8("btnNew_Serv")) + self.horizontalLayout_21.addWidget(self.btnNew_Serv) + self.btnEdit_Serv = QtGui.QPushButton(self.GroupBox_9) + self.btnEdit_Serv.setEnabled(False) + self.btnEdit_Serv.setAutoDefault(False) + self.btnEdit_Serv.setObjectName(_fromUtf8("btnEdit_Serv")) + self.horizontalLayout_21.addWidget(self.btnEdit_Serv) + self.btnDelete_Serv = QtGui.QPushButton(self.GroupBox_9) + self.btnDelete_Serv.setEnabled(False) + self.btnDelete_Serv.setAutoDefault(False) + self.btnDelete_Serv.setObjectName(_fromUtf8("btnDelete_Serv")) + self.horizontalLayout_21.addWidget(self.btnDelete_Serv) + spacerItem = QtGui.QSpacerItem(258, 27, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.horizontalLayout_21.addItem(spacerItem) + self.btnSort_Serv = QtGui.QPushButton(self.GroupBox_9) + self.btnSort_Serv.setObjectName(_fromUtf8("btnSort_Serv")) + self.horizontalLayout_21.addWidget(self.btnSort_Serv) + self.btnImport_QgsWcsUrls = QtGui.QPushButton(self.GroupBox_9) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.btnImport_QgsWcsUrls.sizePolicy().hasHeightForWidth()) + self.btnImport_QgsWcsUrls.setSizePolicy(sizePolicy) + self.btnImport_QgsWcsUrls.setAutoDefault(False) + self.btnImport_QgsWcsUrls.setObjectName(_fromUtf8("btnImport_QgsWcsUrls")) + self.horizontalLayout_21.addWidget(self.btnImport_QgsWcsUrls) + self.verticalLayout_15.addLayout(self.horizontalLayout_21) + self.verticalLayout_11.addWidget(self.GroupBox_9) + self.verticalLayout_4 = QtGui.QVBoxLayout() + self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4")) self.label_2 = QtGui.QLabel(self.tab_Serv) - self.label_2.setGeometry(QtCore.QRect(24, 143, 321, 17)) font = QtGui.QFont() font.setBold(True) font.setItalic(True) font.setWeight(75) self.label_2.setFont(font) self.label_2.setObjectName(_fromUtf8("label_2")) + self.verticalLayout_4.addWidget(self.label_2) + self.textBrowser_Serv = QtGui.QTextBrowser(self.tab_Serv) + self.textBrowser_Serv.setObjectName(_fromUtf8("textBrowser_Serv")) + self.verticalLayout_4.addWidget(self.textBrowser_Serv) + self.verticalLayout_11.addLayout(self.verticalLayout_4) self.groupBox = QtGui.QGroupBox(self.tab_Serv) - self.groupBox.setGeometry(QtCore.QRect(20, 511, 741, 81)) font = QtGui.QFont() font.setBold(False) font.setWeight(50) self.groupBox.setFont(font) self.groupBox.setObjectName(_fromUtf8("groupBox")) - self.toolButton_Serv_OutputLoc = QtGui.QToolButton(self.groupBox) - self.toolButton_Serv_OutputLoc.setGeometry(QtCore.QRect(650, 35, 23, 25)) - self.toolButton_Serv_OutputLoc.setObjectName(_fromUtf8("toolButton_Serv_OutputLoc")) + self.verticalLayout_5 = QtGui.QVBoxLayout(self.groupBox) + self.verticalLayout_5.setObjectName(_fromUtf8("verticalLayout_5")) + self.horizontalLayout = QtGui.QHBoxLayout() + self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.lineEdit_Serv_OutputLoc = QtGui.QLineEdit(self.groupBox) - self.lineEdit_Serv_OutputLoc.setGeometry(QtCore.QRect(0, 35, 641, 27)) self.lineEdit_Serv_OutputLoc.setObjectName(_fromUtf8("lineEdit_Serv_OutputLoc")) + self.horizontalLayout.addWidget(self.lineEdit_Serv_OutputLoc) + self.toolButton_Serv_OutputLoc = QtGui.QToolButton(self.groupBox) + self.toolButton_Serv_OutputLoc.setObjectName(_fromUtf8("toolButton_Serv_OutputLoc")) + self.horizontalLayout.addWidget(self.toolButton_Serv_OutputLoc) + self.verticalLayout_5.addLayout(self.horizontalLayout) + self.horizontalLayout_17 = QtGui.QHBoxLayout() + self.horizontalLayout_17.setObjectName(_fromUtf8("horizontalLayout_17")) + spacerItem1 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.horizontalLayout_17.addItem(spacerItem1) + self.btnClose_Serv = QtGui.QPushButton(self.groupBox) + self.btnClose_Serv.setObjectName(_fromUtf8("btnClose_Serv")) + self.horizontalLayout_17.addWidget(self.btnClose_Serv) + self.verticalLayout_5.addLayout(self.horizontalLayout_17) + self.verticalLayout_11.addWidget(self.groupBox) self.tabWidget_EOWcsClient2.addTab(self.tab_Serv, _fromUtf8("")) self.tab_GCa = QtGui.QWidget() self.tab_GCa.setEnabled(False) self.tab_GCa.setMouseTracking(False) self.tab_GCa.setFocusPolicy(QtCore.Qt.NoFocus) self.tab_GCa.setObjectName(_fromUtf8("tab_GCa")) + self.verticalLayout_8 = QtGui.QVBoxLayout(self.tab_GCa) + self.verticalLayout_8.setObjectName(_fromUtf8("verticalLayout_8")) self.GroupBox_4 = QtGui.QGroupBox(self.tab_GCa) - self.GroupBox_4.setGeometry(QtCore.QRect(9, 10, 741, 131)) self.GroupBox_4.setObjectName(_fromUtf8("GroupBox_4")) - self.gridLayoutWidget_3 = QtGui.QWidget(self.GroupBox_4) - self.gridLayoutWidget_3.setGeometry(QtCore.QRect(10, 50, 651, 81)) - self.gridLayoutWidget_3.setObjectName(_fromUtf8("gridLayoutWidget_3")) - self.gridLayout_5 = QtGui.QGridLayout(self.gridLayoutWidget_3) - self.gridLayout_5.setMargin(0) + self.verticalLayout_9 = QtGui.QVBoxLayout(self.GroupBox_4) + self.verticalLayout_9.setObjectName(_fromUtf8("verticalLayout_9")) + self.label = QtGui.QLabel(self.GroupBox_4) + self.label.setObjectName(_fromUtf8("label")) + self.verticalLayout_9.addWidget(self.label) + self.gridLayout_5 = QtGui.QGridLayout() self.gridLayout_5.setObjectName(_fromUtf8("gridLayout_5")) - self.checkBox_GCaDaSerSum = QtGui.QCheckBox(self.gridLayoutWidget_3) + self.checkBox_GCaDaSerSum = QtGui.QCheckBox(self.GroupBox_4) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -117,7 +148,7 @@ def setupUi(self, QgsWcsClient2): self.checkBox_GCaDaSerSum.setSizePolicy(sizePolicy) self.checkBox_GCaDaSerSum.setObjectName(_fromUtf8("checkBox_GCaDaSerSum")) self.gridLayout_5.addWidget(self.checkBox_GCaDaSerSum, 1, 0, 1, 1) - self.checkBox_GCaCovSum = QtGui.QCheckBox(self.gridLayoutWidget_3) + self.checkBox_GCaCovSum = QtGui.QCheckBox(self.GroupBox_4) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -125,7 +156,7 @@ def setupUi(self, QgsWcsClient2): self.checkBox_GCaCovSum.setSizePolicy(sizePolicy) self.checkBox_GCaCovSum.setObjectName(_fromUtf8("checkBox_GCaCovSum")) self.gridLayout_5.addWidget(self.checkBox_GCaCovSum, 2, 0, 1, 1) - self.checkBox_GCaServProv = QtGui.QCheckBox(self.gridLayoutWidget_3) + self.checkBox_GCaServProv = QtGui.QCheckBox(self.GroupBox_4) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -133,10 +164,10 @@ def setupUi(self, QgsWcsClient2): self.checkBox_GCaServProv.setSizePolicy(sizePolicy) self.checkBox_GCaServProv.setObjectName(_fromUtf8("checkBox_GCaServProv")) self.gridLayout_5.addWidget(self.checkBox_GCaServProv, 1, 1, 1, 1) - self.checkBox_GCaAll = QtGui.QCheckBox(self.gridLayoutWidget_3) + self.checkBox_GCaAll = QtGui.QCheckBox(self.GroupBox_4) self.checkBox_GCaAll.setObjectName(_fromUtf8("checkBox_GCaAll")) self.gridLayout_5.addWidget(self.checkBox_GCaAll, 0, 0, 1, 1) - self.checkBox_GCaServId = QtGui.QCheckBox(self.gridLayoutWidget_3) + self.checkBox_GCaServId = QtGui.QCheckBox(self.GroupBox_4) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -144,7 +175,7 @@ def setupUi(self, QgsWcsClient2): self.checkBox_GCaServId.setSizePolicy(sizePolicy) self.checkBox_GCaServId.setObjectName(_fromUtf8("checkBox_GCaServId")) self.gridLayout_5.addWidget(self.checkBox_GCaServId, 0, 1, 1, 1) - self.checkBox_GCaLang = QtGui.QCheckBox(self.gridLayoutWidget_3) + self.checkBox_GCaLang = QtGui.QCheckBox(self.GroupBox_4) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -152,7 +183,7 @@ def setupUi(self, QgsWcsClient2): self.checkBox_GCaLang.setSizePolicy(sizePolicy) self.checkBox_GCaLang.setObjectName(_fromUtf8("checkBox_GCaLang")) self.gridLayout_5.addWidget(self.checkBox_GCaLang, 2, 2, 1, 1) - self.checkBox_GCaCont = QtGui.QCheckBox(self.gridLayoutWidget_3) + self.checkBox_GCaCont = QtGui.QCheckBox(self.GroupBox_4) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -160,7 +191,7 @@ def setupUi(self, QgsWcsClient2): self.checkBox_GCaCont.setSizePolicy(sizePolicy) self.checkBox_GCaCont.setObjectName(_fromUtf8("checkBox_GCaCont")) self.gridLayout_5.addWidget(self.checkBox_GCaCont, 1, 2, 1, 1) - self.checkBox_GCaOpMeta = QtGui.QCheckBox(self.gridLayoutWidget_3) + self.checkBox_GCaOpMeta = QtGui.QCheckBox(self.GroupBox_4) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -168,7 +199,7 @@ def setupUi(self, QgsWcsClient2): self.checkBox_GCaOpMeta.setSizePolicy(sizePolicy) self.checkBox_GCaOpMeta.setObjectName(_fromUtf8("checkBox_GCaOpMeta")) self.gridLayout_5.addWidget(self.checkBox_GCaOpMeta, 0, 2, 1, 1) - self.checkBox_GCaServMeta = QtGui.QCheckBox(self.gridLayoutWidget_3) + self.checkBox_GCaServMeta = QtGui.QCheckBox(self.GroupBox_4) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -176,139 +207,325 @@ def setupUi(self, QgsWcsClient2): self.checkBox_GCaServMeta.setSizePolicy(sizePolicy) self.checkBox_GCaServMeta.setObjectName(_fromUtf8("checkBox_GCaServMeta")) self.gridLayout_5.addWidget(self.checkBox_GCaServMeta, 2, 1, 1, 1) - self.label = QtGui.QLabel(self.GroupBox_4) - self.label.setGeometry(QtCore.QRect(11, 25, 651, 17)) - self.label.setObjectName(_fromUtf8("label")) + self.verticalLayout_9.addLayout(self.gridLayout_5) + self.verticalLayout_8.addWidget(self.GroupBox_4) self.GroupBox_5 = QtGui.QGroupBox(self.tab_GCa) - self.GroupBox_5.setGeometry(QtCore.QRect(1, 160, 431, 51)) + self.GroupBox_5.setMinimumSize(QtCore.QSize(431, 50)) self.GroupBox_5.setTitle(_fromUtf8("")) + self.GroupBox_5.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) self.GroupBox_5.setObjectName(_fromUtf8("GroupBox_5")) + self.horizontalLayout_2 = QtGui.QHBoxLayout(self.GroupBox_5) + self.horizontalLayout_2.setSpacing(20) + self.horizontalLayout_2.setContentsMargins(-1, 0, -1, 0) + self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) self.label_GCaInfo1 = QtGui.QLabel(self.GroupBox_5) - self.label_GCaInfo1.setGeometry(QtCore.QRect(10, 6, 241, 31)) font = QtGui.QFont() font.setBold(True) font.setWeight(75) self.label_GCaInfo1.setFont(font) self.label_GCaInfo1.setObjectName(_fromUtf8("label_GCaInfo1")) + self.horizontalLayout_2.addWidget(self.label_GCaInfo1) self.checkBox_GCa_ActiveDate = QtGui.QCheckBox(self.GroupBox_5) self.checkBox_GCa_ActiveDate.setEnabled(False) - self.checkBox_GCa_ActiveDate.setGeometry(QtCore.QRect(246, 10, 31, 22)) self.checkBox_GCa_ActiveDate.setText(_fromUtf8("")) self.checkBox_GCa_ActiveDate.setObjectName(_fromUtf8("checkBox_GCa_ActiveDate")) - self.pushButton_GCa = QtGui.QPushButton(self.tab_GCa) - self.pushButton_GCa.setGeometry(QtCore.QRect(597, 568, 171, 41)) - font = QtGui.QFont() - font.setBold(True) - font.setWeight(75) - self.pushButton_GCa.setFont(font) - self.pushButton_GCa.setObjectName(_fromUtf8("pushButton_GCa")) - self.btnClose_GCa = QtGui.QPushButton(self.tab_GCa) - self.btnClose_GCa.setGeometry(QtCore.QRect(480, 576, 98, 27)) - self.btnClose_GCa.setObjectName(_fromUtf8("btnClose_GCa")) - self.treeWidget_GCa = QtGui.QTreeWidget(self.tab_GCa) - self.treeWidget_GCa.setGeometry(QtCore.QRect(10, 240, 762, 321)) - self.treeWidget_GCa.setEditTriggers(QtGui.QAbstractItemView.DoubleClicked) - self.treeWidget_GCa.setAlternatingRowColors(True) - self.treeWidget_GCa.setSelectionMode(QtGui.QAbstractItemView.MultiSelection) - self.treeWidget_GCa.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) - self.treeWidget_GCa.setAutoExpandDelay(-1) - self.treeWidget_GCa.setColumnCount(4) - self.treeWidget_GCa.setObjectName(_fromUtf8("treeWidget_GCa")) - self.treeWidget_GCa.header().setDefaultSectionSize(200) - self.treeWidget_GCa.header().setStretchLastSection(True) - self.dateEdit_GCaDocUpdate = QtGui.QDateEdit(self.tab_GCa) + self.horizontalLayout_2.addWidget(self.checkBox_GCa_ActiveDate) + self.dateEdit_GCaDocUpdate = QtGui.QDateEdit(self.GroupBox_5) self.dateEdit_GCaDocUpdate.setEnabled(False) - self.dateEdit_GCaDocUpdate.setGeometry(QtCore.QRect(282, 168, 131, 27)) - self.dateEdit_GCaDocUpdate.setDate(QtCore.QDate(2014, 1, 1)) + self.dateEdit_GCaDocUpdate.setDate(QtCore.QDate(2017, 1, 1)) self.dateEdit_GCaDocUpdate.setMinimumDateTime(QtCore.QDateTime(QtCore.QDate(1900, 1, 1), QtCore.QTime(0, 0, 0))) self.dateEdit_GCaDocUpdate.setMaximumTime(QtCore.QTime(23, 59, 59)) self.dateEdit_GCaDocUpdate.setCurrentSection(QtGui.QDateTimeEdit.YearSection) self.dateEdit_GCaDocUpdate.setCalendarPopup(True) self.dateEdit_GCaDocUpdate.setObjectName(_fromUtf8("dateEdit_GCaDocUpdate")) + self.horizontalLayout_2.addWidget(self.dateEdit_GCaDocUpdate) + spacerItem2 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.horizontalLayout_2.addItem(spacerItem2) + self.verticalLayout_8.addWidget(self.GroupBox_5) + self.verticalLayout_10 = QtGui.QVBoxLayout() + self.verticalLayout_10.setObjectName(_fromUtf8("verticalLayout_10")) self.label_3 = QtGui.QLabel(self.tab_GCa) - self.label_3.setGeometry(QtCore.QRect(10, 215, 591, 17)) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_3.sizePolicy().hasHeightForWidth()) + self.label_3.setSizePolicy(sizePolicy) + self.label_3.setMinimumSize(QtCore.QSize(0, 0)) font = QtGui.QFont() font.setBold(True) font.setItalic(True) font.setWeight(75) self.label_3.setFont(font) + self.label_3.setWordWrap(True) self.label_3.setObjectName(_fromUtf8("label_3")) + self.verticalLayout_10.addWidget(self.label_3) + self.label_7 = QtGui.QLabel(self.tab_GCa) + self.label_7.setIndent(15) + self.label_7.setObjectName(_fromUtf8("label_7")) + self.verticalLayout_10.addWidget(self.label_7) + self.treeWidget_GCa = QtGui.QTreeWidget(self.tab_GCa) + self.treeWidget_GCa.setEditTriggers(QtGui.QAbstractItemView.DoubleClicked) + self.treeWidget_GCa.setAlternatingRowColors(False) + self.treeWidget_GCa.setSelectionMode(QtGui.QAbstractItemView.MultiSelection) + self.treeWidget_GCa.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) + self.treeWidget_GCa.setAutoExpandDelay(-1) + self.treeWidget_GCa.setIndentation(4) + self.treeWidget_GCa.setColumnCount(6) + self.treeWidget_GCa.setObjectName(_fromUtf8("treeWidget_GCa")) + self.treeWidget_GCa.header().setDefaultSectionSize(220) + self.treeWidget_GCa.header().setMinimumSectionSize(70) + self.treeWidget_GCa.header().setStretchLastSection(True) + self.verticalLayout_10.addWidget(self.treeWidget_GCa) + self.verticalLayout_8.addLayout(self.verticalLayout_10) + self.horizontalLayout_3 = QtGui.QHBoxLayout() + self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3")) + self.checkBox_GCaFull = QtGui.QCheckBox(self.tab_GCa) + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + self.checkBox_GCaFull.setFont(font) + self.checkBox_GCaFull.setLayoutDirection(QtCore.Qt.RightToLeft) + self.checkBox_GCaFull.setObjectName(_fromUtf8("checkBox_GCaFull")) + self.horizontalLayout_3.addWidget(self.checkBox_GCaFull) + spacerItem3 = QtGui.QSpacerItem(68, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.horizontalLayout_3.addItem(spacerItem3) + self.btnClose_GCa = QtGui.QPushButton(self.tab_GCa) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.btnClose_GCa.sizePolicy().hasHeightForWidth()) + self.btnClose_GCa.setSizePolicy(sizePolicy) + self.btnClose_GCa.setMinimumSize(QtCore.QSize(85, 27)) + self.btnClose_GCa.setObjectName(_fromUtf8("btnClose_GCa")) + self.horizontalLayout_3.addWidget(self.btnClose_GCa) + self.pushButton_GCa = QtGui.QPushButton(self.tab_GCa) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.pushButton_GCa.sizePolicy().hasHeightForWidth()) + self.pushButton_GCa.setSizePolicy(sizePolicy) + self.pushButton_GCa.setMinimumSize(QtCore.QSize(190, 40)) + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + self.pushButton_GCa.setFont(font) + self.pushButton_GCa.setObjectName(_fromUtf8("pushButton_GCa")) + self.horizontalLayout_3.addWidget(self.pushButton_GCa) + self.verticalLayout_8.addLayout(self.horizontalLayout_3) self.tabWidget_EOWcsClient2.addTab(self.tab_GCa, _fromUtf8("")) self.tab_DC = QtGui.QWidget() self.tab_DC.setEnabled(False) self.tab_DC.setObjectName(_fromUtf8("tab_DC")) - self.treeWidget_DC = QtGui.QTreeWidget(self.tab_DC) - self.treeWidget_DC.setGeometry(QtCore.QRect(10, 106, 762, 431)) - self.treeWidget_DC.setAlternatingRowColors(True) - self.treeWidget_DC.setSelectionMode(QtGui.QAbstractItemView.SingleSelection) - self.treeWidget_DC.setColumnCount(1) - self.treeWidget_DC.setObjectName(_fromUtf8("treeWidget_DC")) + self.verticalLayout_7 = QtGui.QVBoxLayout(self.tab_DC) + self.verticalLayout_7.setObjectName(_fromUtf8("verticalLayout_7")) + self.verticalLayout_13 = QtGui.QVBoxLayout() + self.verticalLayout_13.setObjectName(_fromUtf8("verticalLayout_13")) self.label_DCInfo1 = QtGui.QLabel(self.tab_DC) - self.label_DCInfo1.setGeometry(QtCore.QRect(10, 18, 331, 21)) font = QtGui.QFont() font.setBold(True) font.setWeight(75) self.label_DCInfo1.setFont(font) self.label_DCInfo1.setObjectName(_fromUtf8("label_DCInfo1")) + self.verticalLayout_13.addWidget(self.label_DCInfo1) self.label_DCInfo2 = QtGui.QLabel(self.tab_DC) - self.label_DCInfo2.setGeometry(QtCore.QRect(30, 43, 581, 16)) self.label_DCInfo2.setObjectName(_fromUtf8("label_DCInfo2")) - self.pushButton_DC = QtGui.QPushButton(self.tab_DC) - self.pushButton_DC.setGeometry(QtCore.QRect(599, 565, 171, 41)) + self.verticalLayout_13.addWidget(self.label_DCInfo2) + self.label_4 = QtGui.QLabel(self.tab_DC) font = QtGui.QFont() font.setBold(True) + font.setItalic(True) font.setWeight(75) - self.pushButton_DC.setFont(font) - self.pushButton_DC.setObjectName(_fromUtf8("pushButton_DC")) + self.label_4.setFont(font) + self.label_4.setObjectName(_fromUtf8("label_4")) + self.verticalLayout_13.addWidget(self.label_4) + self.treeWidget_DC = QtGui.QTreeWidget(self.tab_DC) + self.treeWidget_DC.setAlternatingRowColors(False) + self.treeWidget_DC.setSelectionMode(QtGui.QAbstractItemView.SingleSelection) + self.treeWidget_DC.setColumnCount(1) + self.treeWidget_DC.setObjectName(_fromUtf8("treeWidget_DC")) + self.verticalLayout_13.addWidget(self.treeWidget_DC) + self.verticalLayout_7.addLayout(self.verticalLayout_13) + self.horizontalLayout_4 = QtGui.QHBoxLayout() + self.horizontalLayout_4.setObjectName(_fromUtf8("horizontalLayout_4")) + spacerItem4 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.horizontalLayout_4.addItem(spacerItem4) self.btnClose_DC = QtGui.QPushButton(self.tab_DC) - self.btnClose_DC.setGeometry(QtCore.QRect(484, 575, 98, 27)) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(85) + sizePolicy.setVerticalStretch(27) + sizePolicy.setHeightForWidth(self.btnClose_DC.sizePolicy().hasHeightForWidth()) + self.btnClose_DC.setSizePolicy(sizePolicy) self.btnClose_DC.setObjectName(_fromUtf8("btnClose_DC")) - self.label_4 = QtGui.QLabel(self.tab_DC) - self.label_4.setGeometry(QtCore.QRect(10, 83, 701, 17)) + self.horizontalLayout_4.addWidget(self.btnClose_DC) + self.pushButton_DC = QtGui.QPushButton(self.tab_DC) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.pushButton_DC.sizePolicy().hasHeightForWidth()) + self.pushButton_DC.setSizePolicy(sizePolicy) + self.pushButton_DC.setMinimumSize(QtCore.QSize(190, 40)) font = QtGui.QFont() font.setBold(True) - font.setItalic(True) font.setWeight(75) - self.label_4.setFont(font) - self.label_4.setObjectName(_fromUtf8("label_4")) + self.pushButton_DC.setFont(font) + self.pushButton_DC.setObjectName(_fromUtf8("pushButton_DC")) + self.horizontalLayout_4.addWidget(self.pushButton_DC) + self.verticalLayout_7.addLayout(self.horizontalLayout_4) self.tabWidget_EOWcsClient2.addTab(self.tab_DC, _fromUtf8("")) self.tab_DCS = QtGui.QWidget() self.tab_DCS.setEnabled(False) self.tab_DCS.setObjectName(_fromUtf8("tab_DCS")) - self.pushButton_DCS = QtGui.QPushButton(self.tab_DCS) - self.pushButton_DCS.setGeometry(QtCore.QRect(558, 568, 211, 41)) + self.verticalLayout_14 = QtGui.QVBoxLayout(self.tab_DCS) + self.verticalLayout_14.setObjectName(_fromUtf8("verticalLayout_14")) + self.verticalLayout_17 = QtGui.QVBoxLayout() + self.verticalLayout_17.setObjectName(_fromUtf8("verticalLayout_17")) + self.label_DCSInfo1 = QtGui.QLabel(self.tab_DCS) font = QtGui.QFont() font.setBold(True) font.setWeight(75) - self.pushButton_DCS.setFont(font) - self.pushButton_DCS.setObjectName(_fromUtf8("pushButton_DCS")) + self.label_DCSInfo1.setFont(font) + self.label_DCSInfo1.setObjectName(_fromUtf8("label_DCSInfo1")) + self.verticalLayout_17.addWidget(self.label_DCSInfo1) self.label_DCSInfo2 = QtGui.QLabel(self.tab_DCS) - self.label_DCSInfo2.setGeometry(QtCore.QRect(29, 44, 721, 16)) self.label_DCSInfo2.setObjectName(_fromUtf8("label_DCSInfo2")) - self.label_DCSInfo1 = QtGui.QLabel(self.tab_DCS) - self.label_DCSInfo1.setGeometry(QtCore.QRect(9, 19, 451, 21)) + self.verticalLayout_17.addWidget(self.label_DCSInfo2) + self.label_5 = QtGui.QLabel(self.tab_DCS) font = QtGui.QFont() font.setBold(True) + font.setItalic(True) font.setWeight(75) - self.label_DCSInfo1.setFont(font) - self.label_DCSInfo1.setObjectName(_fromUtf8("label_DCSInfo1")) + self.label_5.setFont(font) + self.label_5.setObjectName(_fromUtf8("label_5")) + self.verticalLayout_17.addWidget(self.label_5) self.treeWidget_DCS = QtGui.QTreeWidget(self.tab_DCS) - self.treeWidget_DCS.setGeometry(QtCore.QRect(10, 100, 762, 181)) - self.treeWidget_DCS.setColumnCount(3) + self.treeWidget_DCS.setMinimumSize(QtCore.QSize(0, 200)) + self.treeWidget_DCS.setIndentation(4) + self.treeWidget_DCS.setColumnCount(5) self.treeWidget_DCS.setObjectName(_fromUtf8("treeWidget_DCS")) - self.treeWidget_DCS.header().setDefaultSectionSize(200) - self.btnClose_DCS = QtGui.QPushButton(self.tab_DCS) - self.btnClose_DCS.setGeometry(QtCore.QRect(439, 575, 98, 27)) - self.btnClose_DCS.setObjectName(_fromUtf8("btnClose_DCS")) - self.groupBox_11 = QtGui.QGroupBox(self.tab_DCS) - self.groupBox_11.setGeometry(QtCore.QRect(12, 350, 481, 171)) + self.treeWidget_DCS.header().setDefaultSectionSize(197) + self.treeWidget_DCS.header().setMinimumSectionSize(70) + self.verticalLayout_17.addWidget(self.treeWidget_DCS) + self.verticalLayout_14.addLayout(self.verticalLayout_17) + self.horizontalLayout_20 = QtGui.QHBoxLayout() + self.horizontalLayout_20.setObjectName(_fromUtf8("horizontalLayout_20")) + self.gridLayout_2 = QtGui.QGridLayout() + self.gridLayout_2.setSpacing(6) + self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2")) + self.GroupBox_10 = QtGui.QGroupBox(self.tab_DCS) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.GroupBox_10.sizePolicy().hasHeightForWidth()) + self.GroupBox_10.setSizePolicy(sizePolicy) + self.GroupBox_10.setMinimumSize(QtCore.QSize(450, 62)) + self.GroupBox_10.setObjectName(_fromUtf8("GroupBox_10")) + self.gridLayoutWidget_5 = QtGui.QWidget(self.GroupBox_10) + self.gridLayoutWidget_5.setGeometry(QtCore.QRect(10, 23, 441, 24)) + self.gridLayoutWidget_5.setObjectName(_fromUtf8("gridLayoutWidget_5")) + self.horizontalLayout_13 = QtGui.QHBoxLayout(self.gridLayoutWidget_5) + self.horizontalLayout_13.setMargin(0) + self.horizontalLayout_13.setObjectName(_fromUtf8("horizontalLayout_13")) + spacerItem5 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.horizontalLayout_13.addItem(spacerItem5) + self.checkBox_DCSAll = QtGui.QCheckBox(self.gridLayoutWidget_5) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.checkBox_DCSAll.sizePolicy().hasHeightForWidth()) + self.checkBox_DCSAll.setSizePolicy(sizePolicy) + self.checkBox_DCSAll.setObjectName(_fromUtf8("checkBox_DCSAll")) + self.horizontalLayout_13.addWidget(self.checkBox_DCSAll) + self.checkBox_DCSDatSerSum = QtGui.QCheckBox(self.gridLayoutWidget_5) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.checkBox_DCSDatSerSum.sizePolicy().hasHeightForWidth()) + self.checkBox_DCSDatSerSum.setSizePolicy(sizePolicy) + self.checkBox_DCSDatSerSum.setObjectName(_fromUtf8("checkBox_DCSDatSerSum")) + self.horizontalLayout_13.addWidget(self.checkBox_DCSDatSerSum) + self.checkBox_DCSCovSum = QtGui.QCheckBox(self.gridLayoutWidget_5) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.checkBox_DCSCovSum.sizePolicy().hasHeightForWidth()) + self.checkBox_DCSCovSum.setSizePolicy(sizePolicy) + self.checkBox_DCSCovSum.setObjectName(_fromUtf8("checkBox_DCSCovSum")) + self.horizontalLayout_13.addWidget(self.checkBox_DCSCovSum) + self.gridLayout_2.addWidget(self.GroupBox_10, 0, 0, 1, 2) + self.groupBox_21 = QtGui.QGroupBox(self.tab_DCS) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.groupBox_21.sizePolicy().hasHeightForWidth()) + self.groupBox_21.setSizePolicy(sizePolicy) + self.groupBox_21.setMinimumSize(QtCore.QSize(450, 210)) font = QtGui.QFont() font.setBold(True) font.setWeight(75) - self.groupBox_11.setFont(font) - self.groupBox_11.setObjectName(_fromUtf8("groupBox_11")) - self.lineEdit_DCSMinLon = QtGui.QLineEdit(self.groupBox_11) - self.lineEdit_DCSMinLon.setGeometry(QtCore.QRect(81, 78, 146, 27)) + self.groupBox_21.setFont(font) + self.groupBox_21.setObjectName(_fromUtf8("groupBox_21")) + self.layoutWidget_5 = QtGui.QWidget(self.groupBox_21) + self.layoutWidget_5.setGeometry(QtCore.QRect(10, 25, 441, 164)) + self.layoutWidget_5.setObjectName(_fromUtf8("layoutWidget_5")) + self.verticalLayout_18 = QtGui.QVBoxLayout(self.layoutWidget_5) + self.verticalLayout_18.setMargin(0) + self.verticalLayout_18.setObjectName(_fromUtf8("verticalLayout_18")) + self.horizontalLayout_8 = QtGui.QHBoxLayout() + self.horizontalLayout_8.setObjectName(_fromUtf8("horizontalLayout_8")) + spacerItem6 = QtGui.QSpacerItem(148, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.horizontalLayout_8.addItem(spacerItem6) + self.label_DCSMaxLat = QtGui.QLabel(self.layoutWidget_5) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_DCSMaxLat.sizePolicy().hasHeightForWidth()) + self.label_DCSMaxLat.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.label_DCSMaxLat.setFont(font) + self.label_DCSMaxLat.setLayoutDirection(QtCore.Qt.LeftToRight) + self.label_DCSMaxLat.setAlignment(QtCore.Qt.AlignCenter) + self.label_DCSMaxLat.setObjectName(_fromUtf8("label_DCSMaxLat")) + self.horizontalLayout_8.addWidget(self.label_DCSMaxLat) + spacerItem7 = QtGui.QSpacerItem(158, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.horizontalLayout_8.addItem(spacerItem7) + self.verticalLayout_18.addLayout(self.horizontalLayout_8) + self.horizontalLayout_9 = QtGui.QHBoxLayout() + self.horizontalLayout_9.setObjectName(_fromUtf8("horizontalLayout_9")) + spacerItem8 = QtGui.QSpacerItem(128, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.horizontalLayout_9.addItem(spacerItem8) + self.lineEdit_DCSMaxLat = QtGui.QLineEdit(self.layoutWidget_5) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lineEdit_DCSMaxLat.sizePolicy().hasHeightForWidth()) + self.lineEdit_DCSMaxLat.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.lineEdit_DCSMaxLat.setFont(font) + self.lineEdit_DCSMaxLat.setObjectName(_fromUtf8("lineEdit_DCSMaxLat")) + self.horizontalLayout_9.addWidget(self.lineEdit_DCSMaxLat) + spacerItem9 = QtGui.QSpacerItem(148, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.horizontalLayout_9.addItem(spacerItem9) + self.verticalLayout_18.addLayout(self.horizontalLayout_9) + self.horizontalLayout_10 = QtGui.QHBoxLayout() + self.horizontalLayout_10.setObjectName(_fromUtf8("horizontalLayout_10")) + self.label_DCSMinLon = QtGui.QLabel(self.layoutWidget_5) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_DCSMinLon.sizePolicy().hasHeightForWidth()) + self.label_DCSMinLon.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.label_DCSMinLon.setFont(font) + self.label_DCSMinLon.setAlignment(QtCore.Qt.AlignCenter) + self.label_DCSMinLon.setObjectName(_fromUtf8("label_DCSMinLon")) + self.horizontalLayout_10.addWidget(self.label_DCSMinLon) + self.lineEdit_DCSMinLon = QtGui.QLineEdit(self.layoutWidget_5) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -319,8 +536,8 @@ def setupUi(self, QgsWcsClient2): font.setWeight(50) self.lineEdit_DCSMinLon.setFont(font) self.lineEdit_DCSMinLon.setObjectName(_fromUtf8("lineEdit_DCSMinLon")) - self.lineEdit_DCSMaxLon = QtGui.QLineEdit(self.groupBox_11) - self.lineEdit_DCSMaxLon.setGeometry(QtCore.QRect(245, 78, 146, 27)) + self.horizontalLayout_10.addWidget(self.lineEdit_DCSMinLon) + self.lineEdit_DCSMaxLon = QtGui.QLineEdit(self.layoutWidget_5) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -331,20 +548,8 @@ def setupUi(self, QgsWcsClient2): font.setWeight(50) self.lineEdit_DCSMaxLon.setFont(font) self.lineEdit_DCSMaxLon.setObjectName(_fromUtf8("lineEdit_DCSMaxLon")) - self.lineEdit_DCSMinLat = QtGui.QLineEdit(self.groupBox_11) - self.lineEdit_DCSMinLat.setGeometry(QtCore.QRect(161, 111, 151, 27)) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.lineEdit_DCSMinLat.sizePolicy().hasHeightForWidth()) - self.lineEdit_DCSMinLat.setSizePolicy(sizePolicy) - font = QtGui.QFont() - font.setBold(False) - font.setWeight(50) - self.lineEdit_DCSMinLat.setFont(font) - self.lineEdit_DCSMinLat.setObjectName(_fromUtf8("lineEdit_DCSMinLat")) - self.label_DCSMaxLon = QtGui.QLabel(self.groupBox_11) - self.label_DCSMaxLon.setGeometry(QtCore.QRect(396, 71, 71, 41)) + self.horizontalLayout_10.addWidget(self.lineEdit_DCSMaxLon) + self.label_DCSMaxLon = QtGui.QLabel(self.layoutWidget_5) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -357,114 +562,131 @@ def setupUi(self, QgsWcsClient2): self.label_DCSMaxLon.setScaledContents(False) self.label_DCSMaxLon.setAlignment(QtCore.Qt.AlignCenter) self.label_DCSMaxLon.setObjectName(_fromUtf8("label_DCSMaxLon")) - self.label_DCSMinLat = QtGui.QLabel(self.groupBox_11) - self.label_DCSMinLat.setGeometry(QtCore.QRect(186, 144, 89, 17)) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Preferred) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.label_DCSMinLat.sizePolicy().hasHeightForWidth()) - self.label_DCSMinLat.setSizePolicy(sizePolicy) - font = QtGui.QFont() - font.setBold(False) - font.setWeight(50) - self.label_DCSMinLat.setFont(font) - self.label_DCSMinLat.setObjectName(_fromUtf8("label_DCSMinLat")) - self.lineEdit_DCSMaxLat = QtGui.QLineEdit(self.groupBox_11) - self.lineEdit_DCSMaxLat.setGeometry(QtCore.QRect(161, 45, 151, 27)) + self.horizontalLayout_10.addWidget(self.label_DCSMaxLon) + self.verticalLayout_18.addLayout(self.horizontalLayout_10) + self.horizontalLayout_11 = QtGui.QHBoxLayout() + self.horizontalLayout_11.setObjectName(_fromUtf8("horizontalLayout_11")) + spacerItem10 = QtGui.QSpacerItem(128, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.horizontalLayout_11.addItem(spacerItem10) + self.lineEdit_DCSMinLat = QtGui.QLineEdit(self.layoutWidget_5) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.lineEdit_DCSMaxLat.sizePolicy().hasHeightForWidth()) - self.lineEdit_DCSMaxLat.setSizePolicy(sizePolicy) + sizePolicy.setHeightForWidth(self.lineEdit_DCSMinLat.sizePolicy().hasHeightForWidth()) + self.lineEdit_DCSMinLat.setSizePolicy(sizePolicy) font = QtGui.QFont() font.setBold(False) font.setWeight(50) - self.lineEdit_DCSMaxLat.setFont(font) - self.lineEdit_DCSMaxLat.setObjectName(_fromUtf8("lineEdit_DCSMaxLat")) - self.label_DCSMinLon = QtGui.QLabel(self.groupBox_11) - self.label_DCSMinLon.setGeometry(QtCore.QRect(1, 71, 81, 41)) + self.lineEdit_DCSMinLat.setFont(font) + self.lineEdit_DCSMinLat.setObjectName(_fromUtf8("lineEdit_DCSMinLat")) + self.horizontalLayout_11.addWidget(self.lineEdit_DCSMinLat) + spacerItem11 = QtGui.QSpacerItem(148, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.horizontalLayout_11.addItem(spacerItem11) + self.verticalLayout_18.addLayout(self.horizontalLayout_11) + self.horizontalLayout_12 = QtGui.QHBoxLayout() + self.horizontalLayout_12.setObjectName(_fromUtf8("horizontalLayout_12")) + spacerItem12 = QtGui.QSpacerItem(158, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.horizontalLayout_12.addItem(spacerItem12) + self.label_DCSMinLat = QtGui.QLabel(self.layoutWidget_5) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.label_DCSMinLon.sizePolicy().hasHeightForWidth()) - self.label_DCSMinLon.setSizePolicy(sizePolicy) + sizePolicy.setHeightForWidth(self.label_DCSMinLat.sizePolicy().hasHeightForWidth()) + self.label_DCSMinLat.setSizePolicy(sizePolicy) font = QtGui.QFont() font.setBold(False) font.setWeight(50) - self.label_DCSMinLon.setFont(font) - self.label_DCSMinLon.setAlignment(QtCore.Qt.AlignCenter) - self.label_DCSMinLon.setObjectName(_fromUtf8("label_DCSMinLon")) - self.label_DCSMaxLat = QtGui.QLabel(self.groupBox_11) - self.label_DCSMaxLat.setGeometry(QtCore.QRect(189, 22, 92, 17)) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Preferred) + self.label_DCSMinLat.setFont(font) + self.label_DCSMinLat.setAlignment(QtCore.Qt.AlignCenter) + self.label_DCSMinLat.setObjectName(_fromUtf8("label_DCSMinLat")) + self.horizontalLayout_12.addWidget(self.label_DCSMinLat) + spacerItem13 = QtGui.QSpacerItem(158, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.horizontalLayout_12.addItem(spacerItem13) + self.verticalLayout_18.addLayout(self.horizontalLayout_12) + self.gridLayout_2.addWidget(self.groupBox_21, 2, 0, 1, 2) + self.groupBox_12 = QtGui.QGroupBox(self.tab_DCS) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.label_DCSMaxLat.sizePolicy().hasHeightForWidth()) - self.label_DCSMaxLat.setSizePolicy(sizePolicy) - font = QtGui.QFont() - font.setBold(False) - font.setWeight(50) - self.label_DCSMaxLat.setFont(font) - self.label_DCSMaxLat.setObjectName(_fromUtf8("label_DCSMaxLat")) - self.groupBox_12 = QtGui.QGroupBox(self.tab_DCS) - self.groupBox_12.setGeometry(QtCore.QRect(20, 510, 391, 101)) + sizePolicy.setHeightForWidth(self.groupBox_12.sizePolicy().hasHeightForWidth()) + self.groupBox_12.setSizePolicy(sizePolicy) + self.groupBox_12.setMinimumSize(QtCore.QSize(450, 105)) font = QtGui.QFont() font.setBold(True) font.setWeight(75) self.groupBox_12.setFont(font) self.groupBox_12.setObjectName(_fromUtf8("groupBox_12")) - self.dateTimeEdit_DCSBegin = QtGui.QDateTimeEdit(self.groupBox_12) - self.dateTimeEdit_DCSBegin.setGeometry(QtCore.QRect(164, 32, 194, 27)) - self.dateTimeEdit_DCSBegin.setLocale(QtCore.QLocale(QtCore.QLocale.English, QtCore.QLocale.UnitedKingdom)) - self.dateTimeEdit_DCSBegin.setDateTime(QtCore.QDateTime(QtCore.QDate(2013, 12, 31), QtCore.QTime(18, 0, 0))) - self.dateTimeEdit_DCSBegin.setDate(QtCore.QDate(2013, 12, 31)) - self.dateTimeEdit_DCSBegin.setMinimumDateTime(QtCore.QDateTime(QtCore.QDate(1899, 12, 31), QtCore.QTime(18, 0, 0))) - self.dateTimeEdit_DCSBegin.setMinimumTime(QtCore.QTime(18, 0, 0)) - self.dateTimeEdit_DCSBegin.setCalendarPopup(True) - self.dateTimeEdit_DCSBegin.setTimeSpec(QtCore.Qt.UTC) - self.dateTimeEdit_DCSBegin.setObjectName(_fromUtf8("dateTimeEdit_DCSBegin")) - self.dateTimeEdit_DCSEnd = QtGui.QDateTimeEdit(self.groupBox_12) - self.dateTimeEdit_DCSEnd.setGeometry(QtCore.QRect(164, 72, 194, 27)) - self.dateTimeEdit_DCSEnd.setDateTime(QtCore.QDateTime(QtCore.QDate(2014, 1, 1), QtCore.QTime(17, 59, 59))) - self.dateTimeEdit_DCSEnd.setDate(QtCore.QDate(2014, 1, 1)) - self.dateTimeEdit_DCSEnd.setTime(QtCore.QTime(17, 59, 59)) - self.dateTimeEdit_DCSEnd.setMinimumDateTime(QtCore.QDateTime(QtCore.QDate(1899, 12, 31), QtCore.QTime(18, 0, 0))) - self.dateTimeEdit_DCSEnd.setMaximumTime(QtCore.QTime(17, 59, 59)) + self.layoutWidget = QtGui.QWidget(self.groupBox_12) + self.layoutWidget.setGeometry(QtCore.QRect(7, 33, 431, 64)) + self.layoutWidget.setObjectName(_fromUtf8("layoutWidget")) + self.horizontalLayout_7 = QtGui.QHBoxLayout(self.layoutWidget) + self.horizontalLayout_7.setMargin(0) + self.horizontalLayout_7.setObjectName(_fromUtf8("horizontalLayout_7")) + spacerItem14 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.horizontalLayout_7.addItem(spacerItem14) + self.checkBox_DCS_ActiveDate = QtGui.QCheckBox(self.layoutWidget) + self.checkBox_DCS_ActiveDate.setEnabled(False) + self.checkBox_DCS_ActiveDate.setText(_fromUtf8("")) + self.checkBox_DCS_ActiveDate.setCheckable(True) + self.checkBox_DCS_ActiveDate.setObjectName(_fromUtf8("checkBox_DCS_ActiveDate")) + self.horizontalLayout_7.addWidget(self.checkBox_DCS_ActiveDate) + self.gridLayout_3 = QtGui.QGridLayout() + self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3")) + self.dateTimeEdit_DCSEnd = QtGui.QDateTimeEdit(self.layoutWidget) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.dateTimeEdit_DCSEnd.setFont(font) + self.dateTimeEdit_DCSEnd.setDateTime(QtCore.QDateTime(QtCore.QDate(2017, 1, 1), QtCore.QTime(0, 59, 59))) + self.dateTimeEdit_DCSEnd.setDate(QtCore.QDate(2017, 1, 1)) + self.dateTimeEdit_DCSEnd.setTime(QtCore.QTime(0, 59, 59)) + self.dateTimeEdit_DCSEnd.setMinimumDateTime(QtCore.QDateTime(QtCore.QDate(1899, 12, 31), QtCore.QTime(1, 0, 0))) + self.dateTimeEdit_DCSEnd.setMaximumTime(QtCore.QTime(0, 59, 59)) self.dateTimeEdit_DCSEnd.setCurrentSection(QtGui.QDateTimeEdit.YearSection) self.dateTimeEdit_DCSEnd.setCalendarPopup(True) self.dateTimeEdit_DCSEnd.setTimeSpec(QtCore.Qt.UTC) self.dateTimeEdit_DCSEnd.setObjectName(_fromUtf8("dateTimeEdit_DCSEnd")) - self.label_DCSBegin = QtGui.QLabel(self.groupBox_12) - self.label_DCSBegin.setGeometry(QtCore.QRect(54, 36, 111, 20)) - self.label_DCSBegin.setObjectName(_fromUtf8("label_DCSBegin")) - self.label_DCSEnd = QtGui.QLabel(self.groupBox_12) - self.label_DCSEnd.setGeometry(QtCore.QRect(54, 75, 111, 20)) + self.gridLayout_3.addWidget(self.dateTimeEdit_DCSEnd, 1, 1, 1, 1) + self.dateTimeEdit_DCSBegin = QtGui.QDateTimeEdit(self.layoutWidget) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.dateTimeEdit_DCSBegin.setFont(font) + self.dateTimeEdit_DCSBegin.setLocale(QtCore.QLocale(QtCore.QLocale.English, QtCore.QLocale.UnitedKingdom)) + self.dateTimeEdit_DCSBegin.setDateTime(QtCore.QDateTime(QtCore.QDate(2016, 12, 31), QtCore.QTime(1, 0, 0))) + self.dateTimeEdit_DCSBegin.setDate(QtCore.QDate(2016, 12, 31)) + self.dateTimeEdit_DCSBegin.setMinimumDateTime(QtCore.QDateTime(QtCore.QDate(1899, 12, 31), QtCore.QTime(1, 0, 0))) + self.dateTimeEdit_DCSBegin.setMinimumTime(QtCore.QTime(1, 0, 0)) + self.dateTimeEdit_DCSBegin.setCalendarPopup(True) + self.dateTimeEdit_DCSBegin.setTimeSpec(QtCore.Qt.UTC) + self.dateTimeEdit_DCSBegin.setObjectName(_fromUtf8("dateTimeEdit_DCSBegin")) + self.gridLayout_3.addWidget(self.dateTimeEdit_DCSBegin, 0, 1, 1, 1) + self.label_DCSEnd = QtGui.QLabel(self.layoutWidget) self.label_DCSEnd.setObjectName(_fromUtf8("label_DCSEnd")) - self.checkBox_DCS_ActiveDate = QtGui.QCheckBox(self.groupBox_12) - self.checkBox_DCS_ActiveDate.setEnabled(False) - self.checkBox_DCS_ActiveDate.setGeometry(QtCore.QRect(12, 55, 31, 22)) - self.checkBox_DCS_ActiveDate.setText(_fromUtf8("")) - self.checkBox_DCS_ActiveDate.setCheckable(True) - self.checkBox_DCS_ActiveDate.setObjectName(_fromUtf8("checkBox_DCS_ActiveDate")) - self.groupBox_13 = QtGui.QGroupBox(self.tab_DCS) - self.groupBox_13.setGeometry(QtCore.QRect(566, 293, 181, 91)) - self.groupBox_13.setObjectName(_fromUtf8("groupBox_13")) - self.verticalLayoutWidget_2 = QtGui.QWidget(self.groupBox_13) - self.verticalLayoutWidget_2.setGeometry(QtCore.QRect(12, 24, 160, 61)) - self.verticalLayoutWidget_2.setObjectName(_fromUtf8("verticalLayoutWidget_2")) - self.verticalLayout_2 = QtGui.QVBoxLayout(self.verticalLayoutWidget_2) - self.verticalLayout_2.setMargin(0) + self.gridLayout_3.addWidget(self.label_DCSEnd, 1, 0, 1, 1) + self.label_DCSBegin = QtGui.QLabel(self.layoutWidget) + self.label_DCSBegin.setObjectName(_fromUtf8("label_DCSBegin")) + self.gridLayout_3.addWidget(self.label_DCSBegin, 0, 0, 1, 1) + self.horizontalLayout_7.addLayout(self.gridLayout_3) + spacerItem15 = QtGui.QSpacerItem(118, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.horizontalLayout_7.addItem(spacerItem15) + self.gridLayout_2.addWidget(self.groupBox_12, 1, 0, 1, 2) + self.gridLayout_2.setRowStretch(0, 1) + self.gridLayout_2.setRowStretch(1, 2) + self.gridLayout_2.setRowStretch(2, 4) + self.horizontalLayout_20.addLayout(self.gridLayout_2) + self.verticalLayout_2 = QtGui.QVBoxLayout() self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) - self.radioButton_ContOver = QtGui.QRadioButton(self.verticalLayoutWidget_2) - self.radioButton_ContOver.setChecked(True) - self.radioButton_ContOver.setAutoExclusive(True) - self.radioButton_ContOver.setObjectName(_fromUtf8("radioButton_ContOver")) - self.verticalLayout_2.addWidget(self.radioButton_ContOver) - self.radioButton_ContCont = QtGui.QRadioButton(self.verticalLayoutWidget_2) - self.radioButton_ContCont.setObjectName(_fromUtf8("radioButton_ContCont")) - self.verticalLayout_2.addWidget(self.radioButton_ContCont) + self.gridLayout_6 = QtGui.QGridLayout() + self.gridLayout_6.setContentsMargins(139, -1, -1, -1) + self.gridLayout_6.setObjectName(_fromUtf8("gridLayout_6")) self.groupBox_14 = QtGui.QGroupBox(self.tab_DCS) - self.groupBox_14.setGeometry(QtCore.QRect(568, 390, 191, 71)) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Maximum) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.groupBox_14.sizePolicy().hasHeightForWidth()) + self.groupBox_14.setSizePolicy(sizePolicy) + self.groupBox_14.setMinimumSize(QtCore.QSize(180, 70)) self.groupBox_14.setObjectName(_fromUtf8("groupBox_14")) self.spinBox_DCSCount = QtGui.QSpinBox(self.groupBox_14) self.spinBox_DCSCount.setEnabled(False) @@ -478,100 +700,130 @@ def setupUi(self, QgsWcsClient2): self.checkBox_DCS_ActiveCount.setText(_fromUtf8("")) self.checkBox_DCS_ActiveCount.setChecked(True) self.checkBox_DCS_ActiveCount.setObjectName(_fromUtf8("checkBox_DCS_ActiveCount")) - self.GroupBox_10 = QtGui.QGroupBox(self.tab_DCS) - self.GroupBox_10.setGeometry(QtCore.QRect(10, 290, 511, 61)) - self.GroupBox_10.setObjectName(_fromUtf8("GroupBox_10")) - self.gridLayoutWidget_5 = QtGui.QWidget(self.GroupBox_10) - self.gridLayoutWidget_5.setGeometry(QtCore.QRect(10, 23, 481, 31)) - self.gridLayoutWidget_5.setObjectName(_fromUtf8("gridLayoutWidget_5")) - self.gridLayout_6 = QtGui.QGridLayout(self.gridLayoutWidget_5) - self.gridLayout_6.setMargin(0) - self.gridLayout_6.setObjectName(_fromUtf8("gridLayout_6")) - self.checkBox_DCSAll = QtGui.QCheckBox(self.gridLayoutWidget_5) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.checkBox_DCSAll.sizePolicy().hasHeightForWidth()) - self.checkBox_DCSAll.setSizePolicy(sizePolicy) - self.checkBox_DCSAll.setObjectName(_fromUtf8("checkBox_DCSAll")) - self.gridLayout_6.addWidget(self.checkBox_DCSAll, 0, 0, 1, 1) - self.checkBox_DCSDatSerSum = QtGui.QCheckBox(self.gridLayoutWidget_5) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed) + self.gridLayout_6.addWidget(self.groupBox_14, 2, 0, 1, 1) + self.groupBox_13 = QtGui.QGroupBox(self.tab_DCS) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.checkBox_DCSDatSerSum.sizePolicy().hasHeightForWidth()) - self.checkBox_DCSDatSerSum.setSizePolicy(sizePolicy) - self.checkBox_DCSDatSerSum.setObjectName(_fromUtf8("checkBox_DCSDatSerSum")) - self.gridLayout_6.addWidget(self.checkBox_DCSDatSerSum, 0, 1, 1, 1) - self.checkBox_DCSCovSum = QtGui.QCheckBox(self.gridLayoutWidget_5) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed) + sizePolicy.setHeightForWidth(self.groupBox_13.sizePolicy().hasHeightForWidth()) + self.groupBox_13.setSizePolicy(sizePolicy) + self.groupBox_13.setMinimumSize(QtCore.QSize(180, 90)) + self.groupBox_13.setLayoutDirection(QtCore.Qt.LeftToRight) + self.groupBox_13.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter) + self.groupBox_13.setObjectName(_fromUtf8("groupBox_13")) + self.radioButton_ContOver = QtGui.QRadioButton(self.groupBox_13) + self.radioButton_ContOver.setGeometry(QtCore.QRect(13, 28, 87, 22)) + self.radioButton_ContOver.setChecked(True) + self.radioButton_ContOver.setAutoExclusive(True) + self.radioButton_ContOver.setObjectName(_fromUtf8("radioButton_ContOver")) + self.radioButton_ContCont = QtGui.QRadioButton(self.groupBox_13) + self.radioButton_ContCont.setGeometry(QtCore.QRect(13, 59, 87, 22)) + self.radioButton_ContCont.setObjectName(_fromUtf8("radioButton_ContCont")) + self.gridLayout_6.addWidget(self.groupBox_13, 1, 0, 1, 1) + self.verticalLayout_2.addLayout(self.gridLayout_6) + spacerItem16 = QtGui.QSpacerItem(20, 128, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.MinimumExpanding) + self.verticalLayout_2.addItem(spacerItem16) + self.checkBox_DCSFull = QtGui.QCheckBox(self.tab_DCS) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.checkBox_DCSCovSum.sizePolicy().hasHeightForWidth()) - self.checkBox_DCSCovSum.setSizePolicy(sizePolicy) - self.checkBox_DCSCovSum.setObjectName(_fromUtf8("checkBox_DCSCovSum")) - self.gridLayout_6.addWidget(self.checkBox_DCSCovSum, 0, 2, 1, 1) - self.checkBox_DCSIDonly = QtGui.QCheckBox(self.tab_DCS) - self.checkBox_DCSIDonly.setGeometry(QtCore.QRect(564, 500, 191, 22)) + sizePolicy.setHeightForWidth(self.checkBox_DCSFull.sizePolicy().hasHeightForWidth()) + self.checkBox_DCSFull.setSizePolicy(sizePolicy) + self.checkBox_DCSFull.setMinimumSize(QtCore.QSize(300, 40)) font = QtGui.QFont() font.setBold(True) font.setWeight(75) - self.checkBox_DCSIDonly.setFont(font) - self.checkBox_DCSIDonly.setChecked(True) - self.checkBox_DCSIDonly.setObjectName(_fromUtf8("checkBox_DCSIDonly")) - self.label_5 = QtGui.QLabel(self.tab_DCS) - self.label_5.setGeometry(QtCore.QRect(10, 77, 731, 17)) + self.checkBox_DCSFull.setFont(font) + self.checkBox_DCSFull.setLayoutDirection(QtCore.Qt.RightToLeft) + self.checkBox_DCSFull.setIconSize(QtCore.QSize(16, 16)) + self.checkBox_DCSFull.setObjectName(_fromUtf8("checkBox_DCSFull")) + self.verticalLayout_2.addWidget(self.checkBox_DCSFull) + self.horizontalLayout_6 = QtGui.QHBoxLayout() + self.horizontalLayout_6.setSpacing(5) + self.horizontalLayout_6.setContentsMargins(41, 2, 0, 0) + self.horizontalLayout_6.setObjectName(_fromUtf8("horizontalLayout_6")) + self.btnClose_DCS = QtGui.QPushButton(self.tab_DCS) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.btnClose_DCS.sizePolicy().hasHeightForWidth()) + self.btnClose_DCS.setSizePolicy(sizePolicy) + self.btnClose_DCS.setMinimumSize(QtCore.QSize(85, 27)) + self.btnClose_DCS.setBaseSize(QtCore.QSize(40, 30)) + self.btnClose_DCS.setObjectName(_fromUtf8("btnClose_DCS")) + self.horizontalLayout_6.addWidget(self.btnClose_DCS) + self.pushButton_DCS = QtGui.QPushButton(self.tab_DCS) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.pushButton_DCS.sizePolicy().hasHeightForWidth()) + self.pushButton_DCS.setSizePolicy(sizePolicy) + self.pushButton_DCS.setMinimumSize(QtCore.QSize(190, 40)) font = QtGui.QFont() font.setBold(True) - font.setItalic(True) font.setWeight(75) - self.label_5.setFont(font) - self.label_5.setObjectName(_fromUtf8("label_5")) + self.pushButton_DCS.setFont(font) + self.pushButton_DCS.setLayoutDirection(QtCore.Qt.LeftToRight) + self.pushButton_DCS.setObjectName(_fromUtf8("pushButton_DCS")) + self.horizontalLayout_6.addWidget(self.pushButton_DCS) + self.horizontalLayout_6.setStretch(0, 1) + self.horizontalLayout_6.setStretch(1, 1) + self.verticalLayout_2.addLayout(self.horizontalLayout_6) + self.horizontalLayout_20.addLayout(self.verticalLayout_2) + self.verticalLayout_14.addLayout(self.horizontalLayout_20) self.tabWidget_EOWcsClient2.addTab(self.tab_DCS, _fromUtf8("")) self.tab_GCov = QtGui.QWidget() self.tab_GCov.setEnabled(False) self.tab_GCov.setObjectName(_fromUtf8("tab_GCov")) - self.pushButton_GCov = QtGui.QPushButton(self.tab_GCov) - self.pushButton_GCov.setGeometry(QtCore.QRect(550, 566, 211, 41)) - font = QtGui.QFont() - font.setBold(True) - font.setWeight(75) - self.pushButton_GCov.setFont(font) - self.pushButton_GCov.setObjectName(_fromUtf8("pushButton_GCov")) - self.btnClose_GCov = QtGui.QPushButton(self.tab_GCov) - self.btnClose_GCov.setGeometry(QtCore.QRect(431, 573, 98, 27)) - self.btnClose_GCov.setObjectName(_fromUtf8("btnClose_GCov")) - self.treeWidget_GCov = QtGui.QTreeWidget(self.tab_GCov) - self.treeWidget_GCov.setGeometry(QtCore.QRect(10, 70, 762, 181)) - self.treeWidget_GCov.setSelectionMode(QtGui.QAbstractItemView.MultiSelection) - self.treeWidget_GCov.setColumnCount(1) - self.treeWidget_GCov.setObjectName(_fromUtf8("treeWidget_GCov")) - self.treeWidget_GCov.header().setDefaultSectionSize(200) + self.verticalLayout_27 = QtGui.QVBoxLayout(self.tab_GCov) + self.verticalLayout_27.setObjectName(_fromUtf8("verticalLayout_27")) + self.verticalLayout_26 = QtGui.QVBoxLayout() + self.verticalLayout_26.setObjectName(_fromUtf8("verticalLayout_26")) + self.verticalLayout_24 = QtGui.QVBoxLayout() + self.verticalLayout_24.setObjectName(_fromUtf8("verticalLayout_24")) self.label_GCovInfo1 = QtGui.QLabel(self.tab_GCov) - self.label_GCovInfo1.setGeometry(QtCore.QRect(10, 20, 281, 17)) font = QtGui.QFont() font.setBold(True) font.setWeight(75) self.label_GCovInfo1.setFont(font) self.label_GCovInfo1.setObjectName(_fromUtf8("label_GCovInfo1")) + self.verticalLayout_24.addWidget(self.label_GCovInfo1) self.label_GCOvInfo2 = QtGui.QLabel(self.tab_GCov) - self.label_GCOvInfo2.setGeometry(QtCore.QRect(10, 46, 661, 16)) font = QtGui.QFont() font.setBold(True) font.setItalic(True) font.setWeight(75) self.label_GCOvInfo2.setFont(font) self.label_GCOvInfo2.setObjectName(_fromUtf8("label_GCOvInfo2")) + self.verticalLayout_24.addWidget(self.label_GCOvInfo2) + self.treeWidget_GCov = QtGui.QTreeWidget(self.tab_GCov) + self.treeWidget_GCov.setSelectionMode(QtGui.QAbstractItemView.MultiSelection) + self.treeWidget_GCov.setColumnCount(1) + self.treeWidget_GCov.setObjectName(_fromUtf8("treeWidget_GCov")) + self.treeWidget_GCov.header().setDefaultSectionSize(200) + self.verticalLayout_24.addWidget(self.treeWidget_GCov) + self.verticalLayout_26.addLayout(self.verticalLayout_24) + self.verticalLayout_25 = QtGui.QVBoxLayout() + self.verticalLayout_25.setObjectName(_fromUtf8("verticalLayout_25")) + self.horizontalLayout_16 = QtGui.QHBoxLayout() + self.horizontalLayout_16.setObjectName(_fromUtf8("horizontalLayout_16")) self.groupBox_15 = QtGui.QGroupBox(self.tab_GCov) - self.groupBox_15.setGeometry(QtCore.QRect(7, 260, 401, 361)) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.groupBox_15.sizePolicy().hasHeightForWidth()) + self.groupBox_15.setSizePolicy(sizePolicy) + self.groupBox_15.setMinimumSize(QtCore.QSize(400, 360)) + self.groupBox_15.setBaseSize(QtCore.QSize(400, 360)) font = QtGui.QFont() font.setBold(False) font.setWeight(50) self.groupBox_15.setFont(font) self.groupBox_15.setFlat(False) self.groupBox_15.setObjectName(_fromUtf8("groupBox_15")) + self.gridLayout_7 = QtGui.QGridLayout(self.groupBox_15) + self.gridLayout_7.setObjectName(_fromUtf8("gridLayout_7")) self.groupBox_16 = QtGui.QGroupBox(self.groupBox_15) - self.groupBox_16.setGeometry(QtCore.QRect(10, 23, 381, 151)) self.groupBox_16.setObjectName(_fromUtf8("groupBox_16")) self.label_GCovMinLat = QtGui.QLabel(self.groupBox_16) self.label_GCovMinLat.setGeometry(QtCore.QRect(146, 120, 89, 17)) @@ -655,118 +907,63 @@ def setupUi(self, QgsWcsClient2): sizePolicy.setHeightForWidth(self.lineEdit_GCovMaxLon.sizePolicy().hasHeightForWidth()) self.lineEdit_GCovMaxLon.setSizePolicy(sizePolicy) self.lineEdit_GCovMaxLon.setObjectName(_fromUtf8("lineEdit_GCovMaxLon")) + self.gridLayout_7.addWidget(self.groupBox_16, 0, 0, 1, 1) + self.formLayout = QtGui.QFormLayout() + self.formLayout.setObjectName(_fromUtf8("formLayout")) self.label_GCOvBands = QtGui.QLabel(self.groupBox_15) - self.label_GCOvBands.setGeometry(QtCore.QRect(30, 182, 121, 31)) font = QtGui.QFont() font.setBold(True) font.setWeight(75) self.label_GCOvBands.setFont(font) self.label_GCOvBands.setObjectName(_fromUtf8("label_GCOvBands")) + self.formLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.label_GCOvBands) self.lineEdit_GCovBands = QtGui.QLineEdit(self.groupBox_15) - self.lineEdit_GCovBands.setGeometry(QtCore.QRect(170, 183, 141, 27)) self.lineEdit_GCovBands.setObjectName(_fromUtf8("lineEdit_GCovBands")) + self.formLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.lineEdit_GCovBands) self.label_GCovInterpol = QtGui.QLabel(self.groupBox_15) - self.label_GCovInterpol.setGeometry(QtCore.QRect(30, 230, 111, 17)) font = QtGui.QFont() font.setBold(True) font.setWeight(75) self.label_GCovInterpol.setFont(font) self.label_GCovInterpol.setObjectName(_fromUtf8("label_GCovInterpol")) + self.formLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.label_GCovInterpol) + self.comboBox_GCovInterpol = QtGui.QComboBox(self.groupBox_15) + self.comboBox_GCovInterpol.setObjectName(_fromUtf8("comboBox_GCovInterpol")) + self.comboBox_GCovInterpol.addItem(_fromUtf8("")) + self.comboBox_GCovInterpol.addItem(_fromUtf8("")) + self.comboBox_GCovInterpol.addItem(_fromUtf8("")) + self.formLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.comboBox_GCovInterpol) self.label_GCovOutFormat = QtGui.QLabel(self.groupBox_15) - self.label_GCovOutFormat.setGeometry(QtCore.QRect(28, 279, 141, 20)) font = QtGui.QFont() font.setBold(True) font.setWeight(75) self.label_GCovOutFormat.setFont(font) self.label_GCovOutFormat.setObjectName(_fromUtf8("label_GCovOutFormat")) + self.formLayout.setWidget(2, QtGui.QFormLayout.LabelRole, self.label_GCovOutFormat) self.comboBox_GCOvOutFormat = QtGui.QComboBox(self.groupBox_15) - self.comboBox_GCOvOutFormat.setGeometry(QtCore.QRect(170, 276, 141, 27)) self.comboBox_GCOvOutFormat.setObjectName(_fromUtf8("comboBox_GCOvOutFormat")) - self.comboBox_GCovInterpol = QtGui.QComboBox(self.groupBox_15) - self.comboBox_GCovInterpol.setGeometry(QtCore.QRect(170, 227, 141, 27)) - self.comboBox_GCovInterpol.setObjectName(_fromUtf8("comboBox_GCovInterpol")) - self.comboBox_GCovInterpol.addItem(_fromUtf8("")) - self.comboBox_GCovInterpol.addItem(_fromUtf8("")) - self.comboBox_GCovInterpol.addItem(_fromUtf8("")) - self.comboBox_GCovOutCRS = QtGui.QComboBox(self.groupBox_15) - self.comboBox_GCovOutCRS.setGeometry(QtCore.QRect(171, 321, 141, 27)) - self.comboBox_GCovOutCRS.setObjectName(_fromUtf8("comboBox_GCovOutCRS")) + self.formLayout.setWidget(2, QtGui.QFormLayout.FieldRole, self.comboBox_GCOvOutFormat) self.label_GCovOutCRS = QtGui.QLabel(self.groupBox_15) - self.label_GCovOutCRS.setGeometry(QtCore.QRect(29, 320, 111, 31)) font = QtGui.QFont() font.setBold(True) font.setWeight(75) self.label_GCovOutCRS.setFont(font) self.label_GCovOutCRS.setObjectName(_fromUtf8("label_GCovOutCRS")) - self.groupBox_18 = QtGui.QGroupBox(self.tab_GCov) - self.groupBox_18.setGeometry(QtCore.QRect(400, 369, 361, 191)) - self.groupBox_18.setObjectName(_fromUtf8("groupBox_18")) - self.groupBox_19 = QtGui.QGroupBox(self.groupBox_18) - self.groupBox_19.setGeometry(QtCore.QRect(29, 23, 341, 86)) - self.groupBox_19.setObjectName(_fromUtf8("groupBox_19")) - self.gridLayout_7 = QtGui.QGridLayout(self.groupBox_19) - self.gridLayout_7.setObjectName(_fromUtf8("gridLayout_7")) - self.lineEdit_GCovXAxisLabel = QtGui.QLineEdit(self.groupBox_19) - self.lineEdit_GCovXAxisLabel.setEnabled(False) - self.lineEdit_GCovXAxisLabel.setObjectName(_fromUtf8("lineEdit_GCovXAxisLabel")) - self.gridLayout_7.addWidget(self.lineEdit_GCovXAxisLabel, 1, 1, 2, 1) - self.radioButton_GCovXRes = QtGui.QRadioButton(self.groupBox_19) - self.radioButton_GCovXRes.setAutoExclusive(False) - self.radioButton_GCovXRes.setObjectName(_fromUtf8("radioButton_GCovXRes")) - self.gridLayout_7.addWidget(self.radioButton_GCovXRes, 2, 0, 1, 1) - self.label_GCovXRes = QtGui.QLabel(self.groupBox_19) - self.label_GCovXRes.setAlignment(QtCore.Qt.AlignCenter) - self.label_GCovXRes.setObjectName(_fromUtf8("label_GCovXRes")) - self.gridLayout_7.addWidget(self.label_GCovXRes, 0, 1, 1, 1) - self.radioButton_GCovXSize = QtGui.QRadioButton(self.groupBox_19) - self.radioButton_GCovXSize.setAutoExclusive(False) - self.radioButton_GCovXSize.setObjectName(_fromUtf8("radioButton_GCovXSize")) - self.gridLayout_7.addWidget(self.radioButton_GCovXSize, 0, 0, 1, 1) - self.label_GCovXSize = QtGui.QLabel(self.groupBox_19) - self.label_GCovXSize.setLayoutDirection(QtCore.Qt.LeftToRight) - self.label_GCovXSize.setAlignment(QtCore.Qt.AlignCenter) - self.label_GCovXSize.setObjectName(_fromUtf8("label_GCovXSize")) - self.gridLayout_7.addWidget(self.label_GCovXSize, 0, 2, 1, 1) - self.lineEdit_GCovXSize = QtGui.QLineEdit(self.groupBox_19) - self.lineEdit_GCovXSize.setEnabled(False) - self.lineEdit_GCovXSize.setObjectName(_fromUtf8("lineEdit_GCovXSize")) - self.gridLayout_7.addWidget(self.lineEdit_GCovXSize, 1, 2, 2, 1) - self.groupBox_20 = QtGui.QGroupBox(self.groupBox_18) - self.groupBox_20.setGeometry(QtCore.QRect(30, 100, 341, 86)) - self.groupBox_20.setObjectName(_fromUtf8("groupBox_20")) - self.gridLayout_8 = QtGui.QGridLayout(self.groupBox_20) + self.formLayout.setWidget(3, QtGui.QFormLayout.LabelRole, self.label_GCovOutCRS) + self.comboBox_GCovOutCRS = QtGui.QComboBox(self.groupBox_15) + self.comboBox_GCovOutCRS.setObjectName(_fromUtf8("comboBox_GCovOutCRS")) + self.formLayout.setWidget(3, QtGui.QFormLayout.FieldRole, self.comboBox_GCovOutCRS) + self.gridLayout_7.addLayout(self.formLayout, 1, 0, 1, 1) + self.horizontalLayout_16.addWidget(self.groupBox_15) + self.gridLayout_8 = QtGui.QGridLayout() self.gridLayout_8.setObjectName(_fromUtf8("gridLayout_8")) - self.lineEdit_GCovYAxisLabel = QtGui.QLineEdit(self.groupBox_20) - self.lineEdit_GCovYAxisLabel.setEnabled(False) - self.lineEdit_GCovYAxisLabel.setObjectName(_fromUtf8("lineEdit_GCovYAxisLabel")) - self.gridLayout_8.addWidget(self.lineEdit_GCovYAxisLabel, 1, 1, 2, 1) - self.label_GCovYSize = QtGui.QLabel(self.groupBox_20) - self.label_GCovYSize.setAlignment(QtCore.Qt.AlignCenter) - self.label_GCovYSize.setObjectName(_fromUtf8("label_GCovYSize")) - self.gridLayout_8.addWidget(self.label_GCovYSize, 0, 3, 1, 1) - self.radioButton_GCovYSize = QtGui.QRadioButton(self.groupBox_20) - self.radioButton_GCovYSize.setAutoExclusive(False) - self.radioButton_GCovYSize.setObjectName(_fromUtf8("radioButton_GCovYSize")) - self.gridLayout_8.addWidget(self.radioButton_GCovYSize, 0, 0, 1, 1) - self.label_GCovYAxisLabel = QtGui.QLabel(self.groupBox_20) - self.label_GCovYAxisLabel.setAlignment(QtCore.Qt.AlignCenter) - self.label_GCovYAxisLabel.setObjectName(_fromUtf8("label_GCovYAxisLabel")) - self.gridLayout_8.addWidget(self.label_GCovYAxisLabel, 0, 1, 1, 1) - self.radioButton_GCovYRes = QtGui.QRadioButton(self.groupBox_20) - self.radioButton_GCovYRes.setAutoExclusive(False) - self.radioButton_GCovYRes.setObjectName(_fromUtf8("radioButton_GCovYRes")) - self.gridLayout_8.addWidget(self.radioButton_GCovYRes, 2, 0, 1, 1) - self.lineEdit_GCovYSize = QtGui.QLineEdit(self.groupBox_20) - self.lineEdit_GCovYSize.setEnabled(False) - self.lineEdit_GCovYSize.setObjectName(_fromUtf8("lineEdit_GCovYSize")) - self.gridLayout_8.addWidget(self.lineEdit_GCovYSize, 1, 3, 2, 1) - self.radioButton_GCov_OutSizeOrig = QtGui.QRadioButton(self.groupBox_18) - self.radioButton_GCov_OutSizeOrig.setGeometry(QtCore.QRect(134, 1, 151, 22)) - self.radioButton_GCov_OutSizeOrig.setChecked(True) - self.radioButton_GCov_OutSizeOrig.setAutoExclusive(True) - self.radioButton_GCov_OutSizeOrig.setObjectName(_fromUtf8("radioButton_GCov_OutSizeOrig")) self.groupBox_17 = QtGui.QGroupBox(self.tab_GCov) - self.groupBox_17.setGeometry(QtCore.QRect(390, 262, 371, 101)) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.groupBox_17.sizePolicy().hasHeightForWidth()) + self.groupBox_17.setSizePolicy(sizePolicy) + self.groupBox_17.setMinimumSize(QtCore.QSize(370, 100)) font = QtGui.QFont() font.setPointSize(11) font.setBold(False) @@ -792,25 +989,237 @@ def setupUi(self, QgsWcsClient2): self.label_GCovSubEPSG = QtGui.QLabel(self.groupBox_17) self.label_GCovSubEPSG.setGeometry(QtCore.QRect(187, 51, 66, 17)) self.label_GCovSubEPSG.setObjectName(_fromUtf8("label_GCovSubEPSG")) + self.gridLayout_8.addWidget(self.groupBox_17, 0, 0, 1, 1) + self.groupBox_18 = QtGui.QGroupBox(self.tab_GCov) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.groupBox_18.sizePolicy().hasHeightForWidth()) + self.groupBox_18.setSizePolicy(sizePolicy) + self.groupBox_18.setMinimumSize(QtCore.QSize(360, 190)) + self.groupBox_18.setObjectName(_fromUtf8("groupBox_18")) + self.groupBox_19 = QtGui.QGroupBox(self.groupBox_18) + self.groupBox_19.setGeometry(QtCore.QRect(29, 23, 361, 91)) + self.groupBox_19.setObjectName(_fromUtf8("groupBox_19")) + self.layoutWidget1 = QtGui.QWidget(self.groupBox_19) + self.layoutWidget1.setGeometry(QtCore.QRect(10, 20, 321, 62)) + self.layoutWidget1.setObjectName(_fromUtf8("layoutWidget1")) + self.horizontalLayout_14 = QtGui.QHBoxLayout(self.layoutWidget1) + self.horizontalLayout_14.setMargin(0) + self.horizontalLayout_14.setObjectName(_fromUtf8("horizontalLayout_14")) + self.verticalLayout_21 = QtGui.QVBoxLayout() + self.verticalLayout_21.setObjectName(_fromUtf8("verticalLayout_21")) + self.radioButton_GCovXSize = QtGui.QRadioButton(self.layoutWidget1) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.radioButton_GCovXSize.sizePolicy().hasHeightForWidth()) + self.radioButton_GCovXSize.setSizePolicy(sizePolicy) + self.radioButton_GCovXSize.setMinimumSize(QtCore.QSize(93, 25)) + self.radioButton_GCovXSize.setAutoExclusive(False) + self.radioButton_GCovXSize.setObjectName(_fromUtf8("radioButton_GCovXSize")) + self.verticalLayout_21.addWidget(self.radioButton_GCovXSize) + self.radioButton_GCovXRes = QtGui.QRadioButton(self.layoutWidget1) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.radioButton_GCovXRes.sizePolicy().hasHeightForWidth()) + self.radioButton_GCovXRes.setSizePolicy(sizePolicy) + self.radioButton_GCovXRes.setMinimumSize(QtCore.QSize(112, 25)) + self.radioButton_GCovXRes.setAutoExclusive(False) + self.radioButton_GCovXRes.setObjectName(_fromUtf8("radioButton_GCovXRes")) + self.verticalLayout_21.addWidget(self.radioButton_GCovXRes) + self.horizontalLayout_14.addLayout(self.verticalLayout_21) + self.verticalLayout_22 = QtGui.QVBoxLayout() + self.verticalLayout_22.setObjectName(_fromUtf8("verticalLayout_22")) + self.label_GCovXRes = QtGui.QLabel(self.layoutWidget1) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_GCovXRes.sizePolicy().hasHeightForWidth()) + self.label_GCovXRes.setSizePolicy(sizePolicy) + self.label_GCovXRes.setMinimumSize(QtCore.QSize(93, 25)) + self.label_GCovXRes.setAlignment(QtCore.Qt.AlignCenter) + self.label_GCovXRes.setObjectName(_fromUtf8("label_GCovXRes")) + self.verticalLayout_22.addWidget(self.label_GCovXRes) + self.lineEdit_GCovXAxisLabel = QtGui.QLineEdit(self.layoutWidget1) + self.lineEdit_GCovXAxisLabel.setEnabled(False) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lineEdit_GCovXAxisLabel.sizePolicy().hasHeightForWidth()) + self.lineEdit_GCovXAxisLabel.setSizePolicy(sizePolicy) + self.lineEdit_GCovXAxisLabel.setMinimumSize(QtCore.QSize(93, 25)) + self.lineEdit_GCovXAxisLabel.setObjectName(_fromUtf8("lineEdit_GCovXAxisLabel")) + self.verticalLayout_22.addWidget(self.lineEdit_GCovXAxisLabel) + self.horizontalLayout_14.addLayout(self.verticalLayout_22) + self.verticalLayout_23 = QtGui.QVBoxLayout() + self.verticalLayout_23.setObjectName(_fromUtf8("verticalLayout_23")) + self.label_GCovXSize = QtGui.QLabel(self.layoutWidget1) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_GCovXSize.sizePolicy().hasHeightForWidth()) + self.label_GCovXSize.setSizePolicy(sizePolicy) + self.label_GCovXSize.setMinimumSize(QtCore.QSize(93, 25)) + self.label_GCovXSize.setLayoutDirection(QtCore.Qt.LeftToRight) + self.label_GCovXSize.setAlignment(QtCore.Qt.AlignCenter) + self.label_GCovXSize.setObjectName(_fromUtf8("label_GCovXSize")) + self.verticalLayout_23.addWidget(self.label_GCovXSize) + self.lineEdit_GCovXSize = QtGui.QLineEdit(self.layoutWidget1) + self.lineEdit_GCovXSize.setEnabled(False) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lineEdit_GCovXSize.sizePolicy().hasHeightForWidth()) + self.lineEdit_GCovXSize.setSizePolicy(sizePolicy) + self.lineEdit_GCovXSize.setMinimumSize(QtCore.QSize(93, 25)) + self.lineEdit_GCovXSize.setObjectName(_fromUtf8("lineEdit_GCovXSize")) + self.verticalLayout_23.addWidget(self.lineEdit_GCovXSize) + self.horizontalLayout_14.addLayout(self.verticalLayout_23) + self.groupBox_20 = QtGui.QGroupBox(self.groupBox_18) + self.groupBox_20.setGeometry(QtCore.QRect(30, 100, 351, 91)) + self.groupBox_20.setObjectName(_fromUtf8("groupBox_20")) + self.layoutWidget2 = QtGui.QWidget(self.groupBox_20) + self.layoutWidget2.setGeometry(QtCore.QRect(10, 24, 321, 62)) + self.layoutWidget2.setObjectName(_fromUtf8("layoutWidget2")) + self.horizontalLayout_5 = QtGui.QHBoxLayout(self.layoutWidget2) + self.horizontalLayout_5.setMargin(0) + self.horizontalLayout_5.setObjectName(_fromUtf8("horizontalLayout_5")) + self.verticalLayout_20 = QtGui.QVBoxLayout() + self.verticalLayout_20.setObjectName(_fromUtf8("verticalLayout_20")) + self.radioButton_GCovYSize = QtGui.QRadioButton(self.layoutWidget2) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.radioButton_GCovYSize.sizePolicy().hasHeightForWidth()) + self.radioButton_GCovYSize.setSizePolicy(sizePolicy) + self.radioButton_GCovYSize.setMinimumSize(QtCore.QSize(93, 25)) + self.radioButton_GCovYSize.setAutoExclusive(False) + self.radioButton_GCovYSize.setObjectName(_fromUtf8("radioButton_GCovYSize")) + self.verticalLayout_20.addWidget(self.radioButton_GCovYSize) + self.radioButton_GCovYRes = QtGui.QRadioButton(self.layoutWidget2) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.radioButton_GCovYRes.sizePolicy().hasHeightForWidth()) + self.radioButton_GCovYRes.setSizePolicy(sizePolicy) + self.radioButton_GCovYRes.setMinimumSize(QtCore.QSize(112, 25)) + self.radioButton_GCovYRes.setAutoExclusive(False) + self.radioButton_GCovYRes.setObjectName(_fromUtf8("radioButton_GCovYRes")) + self.verticalLayout_20.addWidget(self.radioButton_GCovYRes) + self.horizontalLayout_5.addLayout(self.verticalLayout_20) + self.verticalLayout_19 = QtGui.QVBoxLayout() + self.verticalLayout_19.setObjectName(_fromUtf8("verticalLayout_19")) + self.label_GCovYAxisLabel = QtGui.QLabel(self.layoutWidget2) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_GCovYAxisLabel.sizePolicy().hasHeightForWidth()) + self.label_GCovYAxisLabel.setSizePolicy(sizePolicy) + self.label_GCovYAxisLabel.setMinimumSize(QtCore.QSize(93, 25)) + self.label_GCovYAxisLabel.setAlignment(QtCore.Qt.AlignCenter) + self.label_GCovYAxisLabel.setObjectName(_fromUtf8("label_GCovYAxisLabel")) + self.verticalLayout_19.addWidget(self.label_GCovYAxisLabel) + self.lineEdit_GCovYAxisLabel = QtGui.QLineEdit(self.layoutWidget2) + self.lineEdit_GCovYAxisLabel.setEnabled(False) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lineEdit_GCovYAxisLabel.sizePolicy().hasHeightForWidth()) + self.lineEdit_GCovYAxisLabel.setSizePolicy(sizePolicy) + self.lineEdit_GCovYAxisLabel.setMinimumSize(QtCore.QSize(93, 25)) + self.lineEdit_GCovYAxisLabel.setObjectName(_fromUtf8("lineEdit_GCovYAxisLabel")) + self.verticalLayout_19.addWidget(self.lineEdit_GCovYAxisLabel) + self.horizontalLayout_5.addLayout(self.verticalLayout_19) + self.verticalLayout_12 = QtGui.QVBoxLayout() + self.verticalLayout_12.setObjectName(_fromUtf8("verticalLayout_12")) + self.label_GCovYSize = QtGui.QLabel(self.layoutWidget2) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_GCovYSize.sizePolicy().hasHeightForWidth()) + self.label_GCovYSize.setSizePolicy(sizePolicy) + self.label_GCovYSize.setMinimumSize(QtCore.QSize(93, 25)) + self.label_GCovYSize.setAlignment(QtCore.Qt.AlignCenter) + self.label_GCovYSize.setObjectName(_fromUtf8("label_GCovYSize")) + self.verticalLayout_12.addWidget(self.label_GCovYSize) + self.lineEdit_GCovYSize = QtGui.QLineEdit(self.layoutWidget2) + self.lineEdit_GCovYSize.setEnabled(False) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lineEdit_GCovYSize.sizePolicy().hasHeightForWidth()) + self.lineEdit_GCovYSize.setSizePolicy(sizePolicy) + self.lineEdit_GCovYSize.setMinimumSize(QtCore.QSize(93, 25)) + self.lineEdit_GCovYSize.setObjectName(_fromUtf8("lineEdit_GCovYSize")) + self.verticalLayout_12.addWidget(self.lineEdit_GCovYSize) + self.horizontalLayout_5.addLayout(self.verticalLayout_12) + self.radioButton_GCov_OutSizeOrig = QtGui.QRadioButton(self.groupBox_18) + self.radioButton_GCov_OutSizeOrig.setGeometry(QtCore.QRect(134, 1, 151, 22)) + self.radioButton_GCov_OutSizeOrig.setChecked(True) + self.radioButton_GCov_OutSizeOrig.setAutoExclusive(True) + self.radioButton_GCov_OutSizeOrig.setObjectName(_fromUtf8("radioButton_GCov_OutSizeOrig")) + self.gridLayout_8.addWidget(self.groupBox_18, 1, 0, 1, 1) + self.horizontalLayout_16.addLayout(self.gridLayout_8) + self.verticalLayout_25.addLayout(self.horizontalLayout_16) + self.horizontalLayout_15 = QtGui.QHBoxLayout() + self.horizontalLayout_15.setObjectName(_fromUtf8("horizontalLayout_15")) + spacerItem17 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.horizontalLayout_15.addItem(spacerItem17) + self.btnClose_GCov = QtGui.QPushButton(self.tab_GCov) + self.btnClose_GCov.setObjectName(_fromUtf8("btnClose_GCov")) + self.horizontalLayout_15.addWidget(self.btnClose_GCov) + self.pushButton_GCov = QtGui.QPushButton(self.tab_GCov) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.pushButton_GCov.sizePolicy().hasHeightForWidth()) + self.pushButton_GCov.setSizePolicy(sizePolicy) + self.pushButton_GCov.setMinimumSize(QtCore.QSize(190, 40)) + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + self.pushButton_GCov.setFont(font) + self.pushButton_GCov.setObjectName(_fromUtf8("pushButton_GCov")) + self.horizontalLayout_15.addWidget(self.pushButton_GCov) + self.verticalLayout_25.addLayout(self.horizontalLayout_15) + self.verticalLayout_26.addLayout(self.verticalLayout_25) + self.verticalLayout_27.addLayout(self.verticalLayout_26) self.tabWidget_EOWcsClient2.addTab(self.tab_GCov, _fromUtf8("")) self.tab_Help = QtGui.QWidget() self.tab_Help.setObjectName(_fromUtf8("tab_Help")) - self.btnClose_Help = QtGui.QPushButton(self.tab_Help) - self.btnClose_Help.setGeometry(QtCore.QRect(650, 582, 98, 27)) - self.btnClose_Help.setObjectName(_fromUtf8("btnClose_Help")) + self.verticalLayout_3 = QtGui.QVBoxLayout(self.tab_Help) + self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3")) self.textEdit = QtGui.QTextEdit(self.tab_Help) - self.textEdit.setGeometry(QtCore.QRect(10, 10, 751, 561)) self.textEdit.setObjectName(_fromUtf8("textEdit")) + self.verticalLayout_3.addWidget(self.textEdit) + self.horizontalLayout_18 = QtGui.QHBoxLayout() + self.horizontalLayout_18.setObjectName(_fromUtf8("horizontalLayout_18")) + spacerItem18 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.horizontalLayout_18.addItem(spacerItem18) + self.btnClose_Help = QtGui.QPushButton(self.tab_Help) + self.btnClose_Help.setObjectName(_fromUtf8("btnClose_Help")) + self.horizontalLayout_18.addWidget(self.btnClose_Help) + self.verticalLayout_3.addLayout(self.horizontalLayout_18) self.tabWidget_EOWcsClient2.addTab(self.tab_Help, _fromUtf8("")) self.tab_About = QtGui.QWidget() self.tab_About.setObjectName(_fromUtf8("tab_About")) - self.btnClose_About = QtGui.QPushButton(self.tab_About) - self.btnClose_About.setGeometry(QtCore.QRect(650, 570, 98, 27)) - self.btnClose_About.setObjectName(_fromUtf8("btnClose_About")) + self.verticalLayout = QtGui.QVBoxLayout(self.tab_About) + self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.textEdit_2 = QtGui.QTextEdit(self.tab_About) - self.textEdit_2.setGeometry(QtCore.QRect(20, 20, 731, 521)) self.textEdit_2.setObjectName(_fromUtf8("textEdit_2")) + self.verticalLayout.addWidget(self.textEdit_2) + self.horizontalLayout_19 = QtGui.QHBoxLayout() + self.horizontalLayout_19.setObjectName(_fromUtf8("horizontalLayout_19")) + spacerItem19 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.horizontalLayout_19.addItem(spacerItem19) + self.btnClose_About = QtGui.QPushButton(self.tab_About) + self.btnClose_About.setObjectName(_fromUtf8("btnClose_About")) + self.horizontalLayout_19.addWidget(self.btnClose_About) + self.verticalLayout.addLayout(self.horizontalLayout_19) self.tabWidget_EOWcsClient2.addTab(self.tab_About, _fromUtf8("")) + self.verticalLayout_6.addWidget(self.tabWidget_EOWcsClient2) self.retranslateUi(QgsWcsClient2) self.tabWidget_EOWcsClient2.setCurrentIndex(0) @@ -830,7 +1239,6 @@ def setupUi(self, QgsWcsClient2): QtCore.QObject.connect(self.btnNew_Serv, QtCore.SIGNAL(_fromUtf8("clicked()")), QgsWcsClient2.newServer) QtCore.QObject.connect(self.pushButton_DCS, QtCore.SIGNAL(_fromUtf8("clicked()")), QgsWcsClient2.exeDescribeEOCoverageSet) QtCore.QObject.connect(self.btnConnectServer_Serv, QtCore.SIGNAL(_fromUtf8("clicked()")), QgsWcsClient2.connectServer) - QtCore.QObject.connect(self.checkBox_DCS_ActiveDate, QtCore.SIGNAL(_fromUtf8("stateChanged(int)")), QgsWcsClient2.enableDCS_ActiveDate) QtCore.QObject.connect(self.checkBox_DCS_ActiveCount, QtCore.SIGNAL(_fromUtf8("stateChanged(int)")), QgsWcsClient2.enableDCS_ActiveCount) QtCore.QObject.connect(self.radioButton_GCovSubOrig, QtCore.SIGNAL(_fromUtf8("clicked()")), QgsWcsClient2.enableGCov_SubOrig) QtCore.QObject.connect(self.radioButton_GCovSubCRS, QtCore.SIGNAL(_fromUtf8("clicked()")), QgsWcsClient2.enableGCov_SubCRS) @@ -841,8 +1249,10 @@ def setupUi(self, QgsWcsClient2): QtCore.QObject.connect(self.radioButton_GCovYRes, QtCore.SIGNAL(_fromUtf8("clicked()")), QgsWcsClient2.enableGCov_YResolution) QtCore.QObject.connect(self.radioButton_GCov_OutSizeOrig, QtCore.SIGNAL(_fromUtf8("clicked()")), QgsWcsClient2.disableGCov_OutSize) QtCore.QObject.connect(self.toolButton_Serv_OutputLoc, QtCore.SIGNAL(_fromUtf8("clicked()")), QgsWcsClient2.get_outputLoc) + QtCore.QObject.connect(self.checkBox_DCS_ActiveDate, QtCore.SIGNAL(_fromUtf8("stateChanged(int)")), QgsWcsClient2.enableDCS_ActiveDate) + QtCore.QObject.connect(self.btnImport_QgsWcsUrls, QtCore.SIGNAL(_fromUtf8("clicked()")), QgsWcsClient2.importQgis_ServList) + QtCore.QObject.connect(self.btnSort_Serv, QtCore.SIGNAL(_fromUtf8("clicked()")), QgsWcsClient2.sortServerListing) QtCore.QMetaObject.connectSlotsByName(QgsWcsClient2) - QgsWcsClient2.setTabOrder(self.tabWidget_EOWcsClient2, self.btnNew_Serv) QgsWcsClient2.setTabOrder(self.btnNew_Serv, self.btnEdit_Serv) QgsWcsClient2.setTabOrder(self.btnEdit_Serv, self.btnConnectServer_Serv) QgsWcsClient2.setTabOrder(self.btnConnectServer_Serv, self.cmbConnections_Serv) @@ -864,29 +1274,20 @@ def setupUi(self, QgsWcsClient2): QgsWcsClient2.setTabOrder(self.checkBox_GCa_ActiveDate, self.pushButton_GCa) QgsWcsClient2.setTabOrder(self.pushButton_GCa, self.btnClose_GCa) QgsWcsClient2.setTabOrder(self.btnClose_GCa, self.treeWidget_GCa) - QgsWcsClient2.setTabOrder(self.treeWidget_GCa, self.dateEdit_GCaDocUpdate) - QgsWcsClient2.setTabOrder(self.dateEdit_GCaDocUpdate, self.treeWidget_DC) + QgsWcsClient2.setTabOrder(self.treeWidget_GCa, self.treeWidget_DC) QgsWcsClient2.setTabOrder(self.treeWidget_DC, self.pushButton_DC) QgsWcsClient2.setTabOrder(self.pushButton_DC, self.btnClose_DC) QgsWcsClient2.setTabOrder(self.btnClose_DC, self.pushButton_DCS) QgsWcsClient2.setTabOrder(self.pushButton_DCS, self.treeWidget_DCS) QgsWcsClient2.setTabOrder(self.treeWidget_DCS, self.btnClose_DCS) - QgsWcsClient2.setTabOrder(self.btnClose_DCS, self.lineEdit_DCSMaxLat) - QgsWcsClient2.setTabOrder(self.lineEdit_DCSMaxLat, self.lineEdit_DCSMinLon) - QgsWcsClient2.setTabOrder(self.lineEdit_DCSMinLon, self.lineEdit_DCSMaxLon) - QgsWcsClient2.setTabOrder(self.lineEdit_DCSMaxLon, self.lineEdit_DCSMinLat) - QgsWcsClient2.setTabOrder(self.lineEdit_DCSMinLat, self.dateTimeEdit_DCSBegin) - QgsWcsClient2.setTabOrder(self.dateTimeEdit_DCSBegin, self.dateTimeEdit_DCSEnd) - QgsWcsClient2.setTabOrder(self.dateTimeEdit_DCSEnd, self.checkBox_DCS_ActiveDate) - QgsWcsClient2.setTabOrder(self.checkBox_DCS_ActiveDate, self.radioButton_ContOver) + QgsWcsClient2.setTabOrder(self.btnClose_DCS, self.radioButton_ContOver) QgsWcsClient2.setTabOrder(self.radioButton_ContOver, self.radioButton_ContCont) QgsWcsClient2.setTabOrder(self.radioButton_ContCont, self.spinBox_DCSCount) QgsWcsClient2.setTabOrder(self.spinBox_DCSCount, self.checkBox_DCS_ActiveCount) QgsWcsClient2.setTabOrder(self.checkBox_DCS_ActiveCount, self.checkBox_DCSAll) QgsWcsClient2.setTabOrder(self.checkBox_DCSAll, self.checkBox_DCSDatSerSum) QgsWcsClient2.setTabOrder(self.checkBox_DCSDatSerSum, self.checkBox_DCSCovSum) - QgsWcsClient2.setTabOrder(self.checkBox_DCSCovSum, self.checkBox_DCSIDonly) - QgsWcsClient2.setTabOrder(self.checkBox_DCSIDonly, self.pushButton_GCov) + QgsWcsClient2.setTabOrder(self.checkBox_DCSCovSum, self.pushButton_GCov) QgsWcsClient2.setTabOrder(self.pushButton_GCov, self.btnClose_GCov) QgsWcsClient2.setTabOrder(self.btnClose_GCov, self.treeWidget_GCov) QgsWcsClient2.setTabOrder(self.treeWidget_GCov, self.lineEdit_GCovMaxLat) @@ -916,17 +1317,20 @@ def setupUi(self, QgsWcsClient2): def retranslateUi(self, QgsWcsClient2): QgsWcsClient2.setWindowTitle(_translate("QgsWcsClient2", "QgsWcsClient2", None)) self.GroupBox_9.setTitle(_translate("QgsWcsClient2", "Server Connections:", None)) - self.btnDelete_Serv.setText(_translate("QgsWcsClient2", "&Delete", None)) - self.btnEdit_Serv.setText(_translate("QgsWcsClient2", "&Edit", None)) - self.btnNew_Serv.setText(_translate("QgsWcsClient2", "&New", None)) - self.btnConnectServer_Serv.setText(_translate("QgsWcsClient2", "&Connect to Server", None)) self.label_6.setText(_translate("QgsWcsClient2", "Server", None)) - self.btnClose_Serv.setText(_translate("QgsWcsClient2", "Close", None)) + self.btnConnectServer_Serv.setText(_translate("QgsWcsClient2", "&Connect to Server", None)) + self.btnNew_Serv.setText(_translate("QgsWcsClient2", "&New", None)) + self.btnEdit_Serv.setText(_translate("QgsWcsClient2", "&Edit", None)) + self.btnDelete_Serv.setText(_translate("QgsWcsClient2", "&Delete", None)) + self.btnSort_Serv.setText(_translate("QgsWcsClient2", "Sort List", None)) + self.btnImport_QgsWcsUrls.setText(_translate("QgsWcsClient2", "&Import Qgs WCS", None)) self.label_2.setText(_translate("QgsWcsClient2", "General Information / Errors / etc.", None)) self.groupBox.setTitle(_translate("QgsWcsClient2", "Local Storage Path (only required for downloading with GetCoverage): ", None)) self.toolButton_Serv_OutputLoc.setText(_translate("QgsWcsClient2", "...", None)) + self.btnClose_Serv.setText(_translate("QgsWcsClient2", "Close", None)) self.tabWidget_EOWcsClient2.setTabText(self.tabWidget_EOWcsClient2.indexOf(self.tab_Serv), _translate("QgsWcsClient2", "Server / Storage", None)) self.GroupBox_4.setTitle(_translate("QgsWcsClient2", "Capabilities Document - Select Sections:", None)) + self.label.setText(_translate("QgsWcsClient2", "( Note: some WCS Servers might not respect these section parameters )", None)) self.checkBox_GCaDaSerSum.setText(_translate("QgsWcsClient2", "DatasetSeriesSummary", None)) self.checkBox_GCaCovSum.setText(_translate("QgsWcsClient2", "CoverageSummary", None)) self.checkBox_GCaServProv.setText(_translate("QgsWcsClient2", "ServiceProvider", None)) @@ -936,65 +1340,68 @@ def retranslateUi(self, QgsWcsClient2): self.checkBox_GCaCont.setText(_translate("QgsWcsClient2", "Contents", None)) self.checkBox_GCaOpMeta.setText(_translate("QgsWcsClient2", "OperationsMetadata", None)) self.checkBox_GCaServMeta.setText(_translate("QgsWcsClient2", "ServiceMetadata", None)) - self.label.setText(_translate("QgsWcsClient2", "( Note: some WCS Servers might not respect these section parameters )", None)) self.label_GCaInfo1.setText(_translate("QgsWcsClient2", "Document UpdateSequence - \n" "only update when newer then:", None)) - self.pushButton_GCa.setText(_translate("QgsWcsClient2", "GetCapabilities", None)) - self.btnClose_GCa.setText(_translate("QgsWcsClient2", "Close", None)) + self.dateEdit_GCaDocUpdate.setSpecialValueText(_translate("QgsWcsClient2", "1970-01-01", None)) + self.dateEdit_GCaDocUpdate.setDisplayFormat(_translate("QgsWcsClient2", "yyyy-MM-dd", None)) + self.label_3.setText(_translate("QgsWcsClient2", "Results of GetCapabilities Request: Select one or more items for further usage: ", None)) + self.label_7.setText(_translate("QgsWcsClient2", "[C] - Coverage / [S] - DatasetSeries", None)) self.treeWidget_GCa.setSortingEnabled(True) self.treeWidget_GCa.headerItem().setText(0, _translate("QgsWcsClient2", "CoverageID/DataSetSeriesID", None)) self.treeWidget_GCa.headerItem().setText(1, _translate("QgsWcsClient2", "BeginTime", None)) self.treeWidget_GCa.headerItem().setText(2, _translate("QgsWcsClient2", "EndTime", None)) - self.treeWidget_GCa.headerItem().setText(3, _translate("QgsWcsClient2", "[C]overage/[S]eries", None)) - self.dateEdit_GCaDocUpdate.setSpecialValueText(_translate("QgsWcsClient2", "1970-01-01", None)) - self.dateEdit_GCaDocUpdate.setDisplayFormat(_translate("QgsWcsClient2", "yyyy-MM-dd", None)) - self.label_3.setText(_translate("QgsWcsClient2", "Results of GetCapabilities Request: Select one or more items for further usage:", None)) + self.treeWidget_GCa.headerItem().setText(3, _translate("QgsWcsClient2", "UpperCorner [WGS84]", None)) + self.treeWidget_GCa.headerItem().setText(4, _translate("QgsWcsClient2", "LowerCorner [WGS84]", None)) + self.treeWidget_GCa.headerItem().setText(5, _translate("QgsWcsClient2", "[C]/[S]", None)) + self.checkBox_GCaFull.setText(_translate("QgsWcsClient2", "View GetCapabilities XML ", None)) + self.btnClose_GCa.setText(_translate("QgsWcsClient2", "Close", None)) + self.pushButton_GCa.setText(_translate("QgsWcsClient2", "GetCapabilities", None)) self.tabWidget_EOWcsClient2.setTabText(self.tabWidget_EOWcsClient2.indexOf(self.tab_GCa), _translate("QgsWcsClient2", "GetCapabilities", None)) - self.treeWidget_DC.setSortingEnabled(True) - self.treeWidget_DC.headerItem().setText(0, _translate("QgsWcsClient2", "CoverageIDs", None)) self.label_DCInfo1.setText(_translate("QgsWcsClient2", "Describe a Coverage or a Stitched Mosaic:", None)) self.label_DCInfo2.setText(_translate("QgsWcsClient2", "Select the CoverageID\'s of interest, then press the DescribeCoverage button.", None)) - self.pushButton_DC.setText(_translate("QgsWcsClient2", "DescribeCoverage", None)) - self.btnClose_DC.setText(_translate("QgsWcsClient2", "Close", None)) self.label_4.setText(_translate("QgsWcsClient2", "Selections from GetCapabilities Result: Select one item to be used in a DescribeCoverage Requests:", None)) + self.treeWidget_DC.setSortingEnabled(True) + self.treeWidget_DC.headerItem().setText(0, _translate("QgsWcsClient2", "CoverageIDs", None)) + self.btnClose_DC.setText(_translate("QgsWcsClient2", "Close", None)) + self.pushButton_DC.setText(_translate("QgsWcsClient2", "DescribeCoverage", None)) self.tabWidget_EOWcsClient2.setTabText(self.tabWidget_EOWcsClient2.indexOf(self.tab_DC), _translate("QgsWcsClient2", "DescribeCoverage", None)) - self.pushButton_DCS.setText(_translate("QgsWcsClient2", "DescribeEOCoverageSet", None)) - self.label_DCSInfo2.setText(_translate("QgsWcsClient2", "Select the ID of interest, choose optional AOI and TOI, then press the DescribeEOCoverageSet button.", None)) self.label_DCSInfo1.setText(_translate("QgsWcsClient2", "Describe a DatsetSeries, a Coverage, or a Stitched Mosaic:", None)) + self.label_DCSInfo2.setText(_translate("QgsWcsClient2", " Select the ID of interest, choose optional AOI and TOI, then press the DescribeEOCoverageSet button.", None)) + self.label_5.setText(_translate("QgsWcsClient2", "Selections from GetCapabilities Result: Select item(s) for further usage:", None)) self.treeWidget_DCS.setSortingEnabled(True) - self.treeWidget_DCS.headerItem().setText(0, _translate("QgsWcsClient2", "CoverageID/DataSeriesID", None)) + self.treeWidget_DCS.headerItem().setText(0, _translate("QgsWcsClient2", "DataSeriesID", None)) self.treeWidget_DCS.headerItem().setText(1, _translate("QgsWcsClient2", "BeginTime", None)) self.treeWidget_DCS.headerItem().setText(2, _translate("QgsWcsClient2", "EndTime", None)) - self.btnClose_DCS.setText(_translate("QgsWcsClient2", "Close", None)) - self.groupBox_11.setTitle(_translate("QgsWcsClient2", "Area of Interest (AOI in WGS-84):", None)) + self.treeWidget_DCS.headerItem().setText(3, _translate("QgsWcsClient2", "UpperCorner [WGS84]", None)) + self.treeWidget_DCS.headerItem().setText(4, _translate("QgsWcsClient2", "LowerCorner [WGS84]", None)) + self.GroupBox_10.setTitle(_translate("QgsWcsClient2", "EOCoverageSet Document - Select Sections:", None)) + self.checkBox_DCSAll.setText(_translate("QgsWcsClient2", "All", None)) + self.checkBox_DCSDatSerSum.setText(_translate("QgsWcsClient2", "DatasetSeriesSummary", None)) + self.checkBox_DCSCovSum.setText(_translate("QgsWcsClient2", "CoverageSummary", None)) + self.groupBox_21.setTitle(_translate("QgsWcsClient2", "Area of Interest (AOI in WGS-84):", None)) + self.label_DCSMaxLat.setText(_translate("QgsWcsClient2", "Max. Latitude", None)) + self.label_DCSMinLon.setText(_translate("QgsWcsClient2", "Min. \n" +"Longitude", None)) self.label_DCSMaxLon.setText(_translate("QgsWcsClient2", "Max. \n" "Longitude", None)) self.label_DCSMinLat.setText(_translate("QgsWcsClient2", "Min. Latitude", None)) - self.label_DCSMinLon.setText(_translate("QgsWcsClient2", "Min. \n" -"Longitude", None)) - self.label_DCSMaxLat.setText(_translate("QgsWcsClient2", "Max. Latitude", None)) self.groupBox_12.setTitle(_translate("QgsWcsClient2", "Time of Interrest (TOI):", None)) - self.dateTimeEdit_DCSBegin.setDisplayFormat(_translate("QgsWcsClient2", "yyyy-MM-ddThh:mm ", None)) self.dateTimeEdit_DCSEnd.setDisplayFormat(_translate("QgsWcsClient2", "yyyy-MM-ddThh:mm ", None)) - self.label_DCSBegin.setText(_translate("QgsWcsClient2", "Begin Time:", None)) + self.dateTimeEdit_DCSBegin.setDisplayFormat(_translate("QgsWcsClient2", "yyyy-MM-ddThh:mm ", None)) self.label_DCSEnd.setText(_translate("QgsWcsClient2", "End Time:", None)) + self.label_DCSBegin.setText(_translate("QgsWcsClient2", "Begin Time:", None)) + self.groupBox_14.setTitle(_translate("QgsWcsClient2", "Hits Count: ", None)) self.groupBox_13.setTitle(_translate("QgsWcsClient2", "Containment:", None)) self.radioButton_ContOver.setText(_translate("QgsWcsClient2", "overlaps", None)) self.radioButton_ContCont.setText(_translate("QgsWcsClient2", "contains", None)) - self.groupBox_14.setTitle(_translate("QgsWcsClient2", "Hits Count: ", None)) - self.GroupBox_10.setTitle(_translate("QgsWcsClient2", "EOCoverageSet Document - Select Sections:", None)) - self.checkBox_DCSAll.setText(_translate("QgsWcsClient2", "All", None)) - self.checkBox_DCSDatSerSum.setText(_translate("QgsWcsClient2", "DatasetSeriesSummary", None)) - self.checkBox_DCSCovSum.setText(_translate("QgsWcsClient2", "CoverageSummary", None)) - self.checkBox_DCSIDonly.setText(_translate("QgsWcsClient2", "Coverage IDs only", None)) - self.label_5.setText(_translate("QgsWcsClient2", "Selections from GetCapabilities Result: Select item(s) for further usage:", None)) + self.checkBox_DCSFull.setText(_translate("QgsWcsClient2", "View DescribeEOCoverageSet XML ", None)) + self.btnClose_DCS.setText(_translate("QgsWcsClient2", "Close", None)) + self.pushButton_DCS.setText(_translate("QgsWcsClient2", "DescribeEOCoverageSet", None)) self.tabWidget_EOWcsClient2.setTabText(self.tabWidget_EOWcsClient2.indexOf(self.tab_DCS), _translate("QgsWcsClient2", "DescribeEOCoverageSet", None)) - self.pushButton_GCov.setText(_translate("QgsWcsClient2", "GetCoverage", None)) - self.btnClose_GCov.setText(_translate("QgsWcsClient2", "Close", None)) - self.treeWidget_GCov.setSortingEnabled(True) - self.treeWidget_GCov.headerItem().setText(0, _translate("QgsWcsClient2", "CoverageID", None)) self.label_GCovInfo1.setText(_translate("QgsWcsClient2", "GetCoverage: download a Coverage ", None)) self.label_GCOvInfo2.setText(_translate("QgsWcsClient2", "Select the ID\'s of interest (and choose optional parameters), then press the GetCoverage button", None)) + self.treeWidget_GCov.setSortingEnabled(True) + self.treeWidget_GCov.headerItem().setText(0, _translate("QgsWcsClient2", "CoverageID", None)) self.groupBox_15.setTitle(_translate("QgsWcsClient2", "Output Subset:", None)) self.groupBox_16.setTitle(_translate("QgsWcsClient2", " Coordinates:", None)) self.label_GCovMinLat.setText(_translate("QgsWcsClient2", "Min. Latitude", None)) @@ -1005,50 +1412,52 @@ def retranslateUi(self, QgsWcsClient2): "Longitude", None)) self.label_GCOvBands.setText(_translate("QgsWcsClient2", "List of Band No.:", None)) self.label_GCovInterpol.setText(_translate("QgsWcsClient2", "Interpolation: ", None)) - self.label_GCovOutFormat.setText(_translate("QgsWcsClient2", "Output Format:", None)) self.comboBox_GCovInterpol.setItemText(0, _translate("QgsWcsClient2", "nearest (default)", None)) self.comboBox_GCovInterpol.setItemText(1, _translate("QgsWcsClient2", "bilinear", None)) self.comboBox_GCovInterpol.setItemText(2, _translate("QgsWcsClient2", "average (slow)", None)) + self.label_GCovOutFormat.setText(_translate("QgsWcsClient2", "Output Format:", None)) self.label_GCovOutCRS.setText(_translate("QgsWcsClient2", "Output CRS\n" " (EPSG):", None)) + self.groupBox_17.setTitle(_translate("QgsWcsClient2", " Type of Subsetting:", None)) + self.radioButton_GCovSubOrig.setText(_translate("QgsWcsClient2", "Original", None)) + self.radioButton_GCovSubCRS.setText(_translate("QgsWcsClient2", "CRS", None)) + self.radioButton_GCovSubPixel.setText(_translate("QgsWcsClient2", "Pixel", None)) + self.label_GCovSubEPSG.setText(_translate("QgsWcsClient2", "EPSG No.:", None)) self.groupBox_18.setTitle(_translate("QgsWcsClient2", "Output SIze:", None)) self.groupBox_19.setTitle(_translate("QgsWcsClient2", "X-Dimension", None)) + self.radioButton_GCovXSize.setText(_translate("QgsWcsClient2", "X-Size", None)) self.radioButton_GCovXRes.setText(_translate("QgsWcsClient2", "X-Resolution", None)) self.label_GCovXRes.setText(_translate("QgsWcsClient2", "X-Axis Label:", None)) - self.radioButton_GCovXSize.setText(_translate("QgsWcsClient2", "X-Size", None)) self.label_GCovXSize.setText(_translate("QgsWcsClient2", "Size: ", None)) self.groupBox_20.setTitle(_translate("QgsWcsClient2", "Y-Dimension", None)) - self.label_GCovYSize.setText(_translate("QgsWcsClient2", "Size: ", None)) self.radioButton_GCovYSize.setText(_translate("QgsWcsClient2", "Y-Size", None)) - self.label_GCovYAxisLabel.setText(_translate("QgsWcsClient2", "Y-Axis Label:", None)) self.radioButton_GCovYRes.setText(_translate("QgsWcsClient2", "Y-Resolution", None)) + self.label_GCovYAxisLabel.setText(_translate("QgsWcsClient2", "Y-Axis Label:", None)) + self.label_GCovYSize.setText(_translate("QgsWcsClient2", "Size: ", None)) self.radioButton_GCov_OutSizeOrig.setText(_translate("QgsWcsClient2", "Original Outsize:", None)) - self.groupBox_17.setTitle(_translate("QgsWcsClient2", " Type of Subsetting:", None)) - self.radioButton_GCovSubOrig.setText(_translate("QgsWcsClient2", "Original", None)) - self.radioButton_GCovSubCRS.setText(_translate("QgsWcsClient2", "CRS", None)) - self.radioButton_GCovSubPixel.setText(_translate("QgsWcsClient2", "Pixel", None)) - self.label_GCovSubEPSG.setText(_translate("QgsWcsClient2", "EPSG No.:", None)) + self.btnClose_GCov.setText(_translate("QgsWcsClient2", "Close", None)) + self.pushButton_GCov.setText(_translate("QgsWcsClient2", "GetCoverage", None)) self.tabWidget_EOWcsClient2.setTabText(self.tabWidget_EOWcsClient2.indexOf(self.tab_GCov), _translate("QgsWcsClient2", "GetCoverage", None)) - self.btnClose_Help.setText(_translate("QgsWcsClient2", "Close", None)) self.textEdit.setHtml(_translate("QgsWcsClient2", "\n" "\n" "

QgsWcsClient2

\n" -"

A OGC WCS 2.0/EO-WCS Client

\n" -"

Author:   Christian Schiller

\n" -"

Copyright:   EOX IT Services GmbH, Vienna, Austria, 2014

\n" +"

A OGC WCS 2.0/EO-WCS Client (v0.3)

\n" +"

Author: Christian Schiller

\n" +"

Copyright: EOX IT Services GmbH, Vienna, Austria, 2014

\n" "
\n" -"

Help - QgsWcsClient2:   Instructions and Hints

\n" +"

Help - QgsWcsClient2: Instructions and Hints

\n" +"

A listing of New Features and Bug-Fixes can be found at GitHub: https://github.com/EOX-A/QgsWcsClient2

\n" "

Content:

\n" -"
  • Introduction:   What the QgsWcsClient2 plugin is about
  • \n" -"
  • Getting Started:   Initiating the QgsWcsClient2 plugin
  • \n" -"
  • How To:   A detailed description of the available functionalities and settings
  • \n" +"\n" "

    Introduction:

    \n" -"

    This WCS 2.0/EO-WCS client is intended to be used to access/download single Coverages, StitchedMosaics and DatasetSeries (which are offered by OGC WCS 2.0/EO-WCS conformant servers) in a convenient way from within QGis (>2.0). Downloaded datasets are stored locally and loaded directly into QGis for further usage.
    This client provides the possibility to send OGC
    GetCapabilities, DescribeCoverage, DescribeEOCoverageSet, and GetCoverage requests to a selected WCS 2.0/EO-WCS server. The respective request results are received and either shown completely or the relevant information is extracted and provided in the GUI for further usage within the client.
    The GUI provides tabs for each request, allowing to select optional parameters (e.g. sub-setting in space and/or time) to be sent with the request. However, not all servers may honor all optional parameters. So if you receive an error message or no answser at all try it with different optional settings. See also the \'How To\' section for further details and the \'Hint - Erroneous behaviour\' section.

    \n" +"

    This WCS 2.0/EO-WCS client is intended to be used to access/download single Coverages, StitchedMosaics and DatasetSeries (which are offered by OGC WCS 2.0/EO-WCS conformant servers) in a convenient way from within QGis (>2.0). It does not work for WCS v. 1.0 or v1.1 protocol (use the QGis native WCS-client for those). Downloaded datasets are stored locally and loaded directly into QGis for further usage. Multiple GetCoverage request can be issued (e.g. to receive a time-series) by a single click.
    This client provides the possibility to send OGC
    GetCapabilities, DescribeCoverage, DescribeEOCoverageSet, and GetCoverage requests to a selected WCS 2.0/EO-WCS server. The respective request results are received and either shown completely or the relevant information is extracted and provided in the GUI for further usage within the client.
    The GUI provides tabs for each request, allowing to select optional parameters (e.g. sub-setting in space and/or time) to be sent with the request. However, not all servers may honor all optional parameters. So if you receive an error message or no answser at all try it with different optional settings. See also the \'How To\' section for further details and the \'Hint - Erroneous behaviour\' section.

    \n" "

    Getting Started:

    \n" "
    • The first thing which needs to be done is to define at least one server in the "Server/Storage" tab. Press the "New" button, and enter a (personal) "Server Name" and the WCS Access "Server URL". Press "OK" when done. All server entries are stored in the QgsWcsClient2 plugin installation directory.
    • \n" "
    • Make sure the provided WCS Access "Server URL" complies to OGC OWS (e.g. usually OGC-Service Access-URls end with a "?").
    • \n" @@ -1064,72 +1473,83 @@ def retranslateUi(self, QgsWcsClient2): "
    • When the connection is established successfully, the line "Response: Server OK" is printed in the "General Information / Errors / etc." field.
    • \n" "
    • If you want to access/download a Coverage, you need to supply a "Local Storage Path". Either type the path into the "Local Storage Path" field or use the "..." button for the path selection.
    • \n" "
    • When the server connection is established click on the "GetCapabilities" tab.
    \n" +"
    • NEW: You may now also import WCS Server names/Urls from the QGis native settings (but be aware that QgsWcsClient2 is only for WCS <2.0.
    • \n" +"
    • NEW: You may sort your Server list aphabetically
    • \n" +"
    • NEW: If a server-redirection is encountered a warning message with the relevant information is presented. So if xou ancounter this,please update the server Url. An automatic redirection has not been implemented due to security concerns.
    \n" "

    GetCapabilities tab

    \n" "
    • The section parameters allows you to limit the amount and type of information retrieved from the WCS server. The following GetCapabilities section parameters are available:
    • \n" "


      \n" -"
      • All:   Requests full information (equals to no selections)
      • \n" -"
      • DatasetSeriesSummary:   Summary about offered DatasetSeries
      • \n" -"
      • CoverageSummary:   Summary about offered Coverages
      • \n" -"
      • ServiceIdentification:   Information about available Service Profiles
      • \n" -"
      • ServiceProvider:   Information about the Service Provider
      • \n" -"
      • ServiceMetadata:   Information about offered File Formats, offered CRSs, etc.
      • \n" -"
      • OperationsMetadata:   Metadata about available Service Operations (e.g. enabled requests)
      • \n" -"
      • Contents:   Overview of offered Content (i.e. list of CoverageIDs and basic DatasetSeries information)
      • \n" -"
      • Languages:   Offered Languages (if available)
      \n" +"
      • All: Requests full information (equals to no selections)
      • \n" +"
      • DatasetSeriesSummary: Summary about offered DatasetSeries
      • \n" +"
      • CoverageSummary: Summary about offered Coverages
      • \n" +"
      • ServiceIdentification: Information about available Service Profiles
      • \n" +"
      • ServiceProvider: Information about the Service Provider
      • \n" +"
      • ServiceMetadata: Information about offered File Formats, offered CRSs, etc.
      • \n" +"
      • OperationsMetadata: Metadata about available Service Operations (e.g. enabled requests)
      • \n" +"
      • Contents: Overview of offered Content (i.e. list of CoverageIDs and basic DatasetSeries information)
      • \n" +"
      • Languages: Offered Languages (if available)
      \n" "


      \n" "
    • You may select requesting only sections (subsets) of the full GetCapabilities document. The default settings used have been chosen for fast and efficient usage (some WCS servers may return huge results and therefore take quite some time to respond).
    • \n" -"
    • If you use the same server frequently you are probably not interested in \'older\' information. If you want to limit the returned information to \'newer\' offers only activate the "Document Update Sequence" check-box and provide a \'Cutoff Date\', i.e. only newer information shall be provided.
    • \n" +"
    • If you use the same server frequently you are probably not interested in \'older\' information. If you want to limit the returned information to \'newer\' offers only activate the "Document Update Sequence" check-box and provide a \'Cutoff Date\', i.e. only newer information shall be provided. However, there is no gurantee that the respective server support this feature.
    • \n" "
    • When the desired options are chosen press the "GetCapabilities" button.
    • \n" "
    • The returned results will be shown in the "Results of GetCapabilities Request" field. There you will see the the following columns:
    • \n" "
      • CoverageID/DatasetSeriesID
      • \n" "
      • BeginTime
      • \n" "
      • EndTime
      • \n" +"
      • UpperCorner [WGS84]
      • \n" +"
        • LowerCorner [WGS84]
        \n" "
      • [C]overage/[S]eries
      \n" -"

      In the first column either a CoverageID or a DatasetSeriesID is provided. The type of ID can be seen in the last column ([C] indicates a Coverage, [S] indicates a DatasetSerie). The two time columns are assumed to be self-explanatory.

      \n" -"
    • When the GetCapabilities results are listed you have to choose at least one CoverageID or DatasetSeriesID. However, the selection of multiple IDs is possible.
      The selected items will automatically show up in the "DescribeCoverage" tab and in the "GetCapabilities" tab (if a Coverage has been selected) or only the "DescribeEOCoverageSet" tab (if a DatasetSeries has been selected).
    • \n" -"
    • Now continue, changing either to the "DescribeCoverage" tab or to the "DescribeEOCoverageSet" tab. If you have chosen only CoverageIDs you may also switch directly to the "GetCapabilities" tab.
    \n" +"


    \n" +"
    • In the first column, either a CoverageID or a DatasetSeriesID is provided. The type of ID can be seen in the last column ([C] indicates a Coverage, [S] indicates a DatasetSerie). The two time columns are assumed to be self-explanatory.
    \n" +"
  • When the GetCapabilities results are listed you have to choose at least one CoverageID or DatasetSeriesID. However, the selection of multiple IDs is possible.
  • \n" +"
    • The selected items will automatically show up in the "DescribeCoverage" tab and in the "GetCapabilities" tab (if a Coverage has been selected) or only the "DescribeEOCoverageSet" tab (if a DatasetSeries has been selected).
    \n" +"
  • Now continue, changing either to the "DescribeCoverage" tab or to the "DescribeEOCoverageSet" tab. If you have chosen only CoverageIDs you may also switch directly to the "GetCapabilities" tab.
  • \n" +"
  • NEW: By selecting the "View GetCapabilities XML" checkbox (at the lower left) you can look at the actual XML returned. If you want to save it, please simply use copy/paste (Hint: Ctrl-A selects all the text) to do so.
\n" "

DescribeCoverage tab

\n" "
  • If one or more CoverageIDs have been selected in the "Results of GetCapabilities Request" field they will be shown in the "Selections from the GetCapabilities Results" field. You need to select a single CoverageID to send a DescribeCoverage request to the server. The full results of this request will be shown in a separate window. No optional parameters are available for a DescribeCoverage request.
  • \n" -"
  • The provided information, however, may later be useful e.g. for specification of the Area of Interest (AOI).
\n" +"
  • The provided information, however, may later be useful e.g. for specification of the Area of Interest (AOI).
  • \n" +"
  • Furthermore, also some of the information required for subsetting (e.g. axis names, projection) is only availbale via a dedicated DescribeCoverage request. It therefroe highly recommended to issue DescribeCoverage before you continue to access a Coverage.
  • \n" "

    DescribeEOCoverageSet tab

    \n" "
    • If one or more DatasetSeriesIDs have been selected in the "Results of GetCapabilities Request" field they will be shown in the "Selections from the GetCapabilities Results" field.
    • \n" "
    • For the DescribeEOCoverageSet response document the following section restrictions are available:
    • \n" "


      \n" -"
      • All:   Requests full information (equals to no selections)
      • \n" -"
      • DatasetSeriesSummary:   Summary about offered DatasetSeries
      • \n" -"
      • Coverage Summary:   Summary about offered Coverages
      \n" +"
      • All: Requests full information (equals to no selections)
      • \n" +"
      • DatasetSeriesSummary: Summary about offered DatasetSeries
      • \n" +"
      • Coverage Summary: Summary about offered Coverages
      \n" "


      \n" "
    • The DescribeEoCoverageSet request can be limited to a user provided Area of Interest (AOI). Here, the AOI always has to be provided in WGS84 !! coordinates (i.e. long/lat in degrees). To use an AOI just enter the desired coordinate values.
    • \n" "
    • The DescribeEoCoverageSet request can also be limited to a user provided Time of Interest(TOI). The TOI has to be provided in ISO-Format. To activate the use of TOI click the respective check-box and choose the desired Date-Time values. You may modify the /DateTime values also manually. Providing a TOI will limit the returned results to the respective time period.
    • \n" -"
    • Containment:   This parameter allows to limit the hits according to:
    • \n" +"
    • Containment: This parameter allows to limit the hits according to:
    • \n" "


      \n" -"
      • overlaps:   Coverages may just touch AOI
      • \n" -"
      • contains:   Coverages must be fully inside AOI
      \n" +"
      • overlaps: Coverages may just touch AOI
      • \n" +"
      • contains: Coverages must be fully inside AOI
      \n" "


      \n" -"
    • Hits Count:   Limits the number of the returned results.
    • \n" -"
    • Coverage IDs only:   This setting (non-standard) is not part of the request. It represents a \'convenience\' function which extracts the received CoverageIDs to be immediately used in the GetCoverage request. Not checking this check-box will result in the DescribeEoCoverageSet result document to be displayed in a separate window. If it is checked the resulting CoverageIDs will be extracted and listed in the "GetCoverage" tab to which the GUI will automatically change.
    • \n" +"
    • Hits Count: Limits the number of the returned results.
    • \n" +"
    • NEW: Actually not really, but now made more clear. The "View DescribeEOCoveragSet" checkbox will enable to view the returned XML document.
      (In the previous versions this functionality was hidden behind the "Coverage IDs only" checkbox). If you want to save the returned XML document, please simply use copy/paste (Hint: Ctrl-A selects all the text) to do so.
    • \n" +"
    • NEW: Now also the UperCorner [WGS84] and LowerCorner [WGS84] coordinates are provided in the listing.
    • \n" "
    • You need to select one or more items befor sending a DescribeEOCoverageSet request.
    \n" "

    GetCoverage tab

    \n" "
    • The CoverageIDs returned by the DescribeEOCoverageSet request or selected in the "Results of GetCapabilities Request" field are shown in the "GetCoverage: download a Coverage" field.
    • \n" "
    • Select one or more CoverageIDs which you want to download and access in QGis.
    • \n" "
    • The following optional parameters, to limit and configure the resulting downloaded Coverages, are provided:
    • \n" "


      \n" -"
      • AOI:   At the "GetCoverage" tab the AOI values will subset the delivered Coverages to the limits provided by the AOI. The coordinate values to be supplied depend on the setting provided in the "Type of Subsetting" section. See below.
      • \n" -"
      • Type of Subsetting:   These settings influence the coordinate values of the AOI. The default setting is "Original", i.e. the coordinate values have to correspond to the CRS of the offered Coverages. The list of server supported CRSs (which is gathered during the "Connect to Server" initialisation process) is provided via the the "Output CRS" selection button. However, the "Original" CRS (which corresponds to the CRS of the offered Coverage) is only gathered during a DescribeCoverage or a DescribeEOCoverageSet request (together with the axisLabels). Thereafter the "Output CRS" selection button will be set to show the "Original CRS" as an indication. I.e. if you don\'t issue a DescribeCoverage or a DescribeEOCoverageSet request you have to know by yourself (e.g. by other means) the CRS of the offered/selected Coverage ("Original CRS"). If you like to provide the coordinates of the AOI in a different CRS you can select the "CRS" radio button and provide the desired EPSG-Code in the designated "EPSG-No." field (e.g. this method can be used if you don\'t know the "Original CRS"). Attention: when you use this option you might also need to change the "X-Axis & Y-Axis Label" i.e. if you use e.g. EPSG:4326 for the CRS of the "Type of Subsetting" you need to change the labels to \'long\' and \'lat\', respectively. If want to provide pixel coordinates you can select the "Pixel" radio button and provide the AOI in pixel coordinates.
        (Note: Not all servers will respect the later two options, so you might get a server error here. See also the Hint - Erroneous behaviour section of this manual for additional information).
      • \n" -"
      • List of Band Numbers:   Here you may provide a comma-separated list of the desired bands (and their order). The delivered Coverages will be subsetted to contain only the provided bands in the provided order.
      • \n" -"
      • Interpolation:   The method of interpolation applied during subsetting and especially for resizing of the delivered Coverages. Here either the values provided in the Caopabilities document are set or some default values are provided (nearest, bilinear, average). (Note: Not all possibilities might be supported by all WCS servers. The defaults have been chosen on the MapServer\'s capabilities).
      • \n" -"
      • Output Format:   You may choose one of the supported "Output Formats" (file formats) in which the Coverages shall be delivered. The listing of the server side supported "Output Formats" is gathered during the "Connect to Server" initialisation process.
      • \n" -"
      • Output CRS:   Independent of the original CRS, you may choose to reproject the delivered Coverages to another CRS offered by the WCS server. The list of offered CRS\'s is provided as a selection button. The listing of server side offered CRS\'s is gathered during the "Connect to Server" initialisation process. As soon as a DescribeCoverage or a DescribeEOCoverageSet request has been issue the value shown correspond to the "Original" CRS of the Coverages.
      • \n" -"
      • Output Size:   This section allows you to resize/rescale the delivered Coverages, independently of the AOI. You may choose either to provide absolute sizes for the "x-" and the "y-dimension" (pixel/line numbers) of the resulting Coverage or you provide the desired resolution (dimension of a pixel according to "Output CRS") for each of the axis. In either case you may need to run a DescribeCoverage or a DescribeEOCoverageSet request first, in order to gather the correct "Axis-Labels" (if you know them already you may skip this step and provide the "Axis-Labels" manually). To return to the original outsize select the respective "Original Outsize" radio button.
      \n" +"
      • AOI: At the "GetCoverage" tab the AOI values will subset the delivered Coverages to the limits provided by the AOI. The coordinate values to be supplied depend on the setting provided in the "Type of Subsetting" section. See below.
      • \n" +"
      • Type of Subsetting: These settings influence the coordinate values of the AOI. The default setting is "Original", i.e. the coordinate values have to correspond to the CRS of the offered Coverages. The list of server supported CRSs (which is gathered during the "Connect to Server" initialisation process) is provided via the the "Output CRS" selection button. However, the "Original" CRS (which corresponds to the CRS of the offered Coverage) is only gathered during a DescribeCoverage or a DescribeEOCoverageSet request (together with the axisLabels). Thereafter the "Output CRS" selection button will be set to show the "Original CRS" as an indication. I.e. if you don\'t issue a DescribeCoverage or a DescribeEOCoverageSet request you have to know by yourself (e.g. by other means) the CRS of the offered/selected Coverage ("Original CRS").
        If you like to provide the coordinates of the AOI in a different CRS you can select the "CRS" radio button and provide the desired EPSG-Code in the designated "EPSG-No." field (e.g. this method can be used if you don\'t know the "Original CRS"). Attention: when you use this option you might also need to change the "X-Axis & Y-Axis Label" i.e. if you use e.g. EPSG:4326 for the CRS of the "Type of Subsetting" you need to change the labels to \'long\' and \'lat\', respectively.
        If want to provide pixel coordinates you can select the "Pixel" radio button and provide the AOI in pixel coordinates.
        (Note: Not all servers will respect the later two options, so you might get a server error here. See also the Hint - Erroneous behaviour section of this manual for additional information).
      • \n" +"
      • List of Band Numbers: Here you may provide a comma-separated list of the desired bands (and their order). The delivered Coverages will be subsetted to contain only the provided bands in the provided order.
      • \n" +"
      • Interpolation: The method of interpolation applied during subsetting and especially for resizing of the delivered Coverages. Here either the values provided in the Caopabilities document are set or some default values are provided (nearest, bilinear, average). (Note: Not all possibilities might be supported by all WCS servers. The defaults have been chosen on the MapServer\'s capabilities. These are usually overwritten by the values received from the GetCapabilities request).
      • \n" +"
      • Output Format: You may choose one of the supported "Output Formats" (file formats) in which the Coverages shall be delivered. The listing of the server side supported "Output Formats" is gathered during the "Connect to Server" initialisation process.
      • \n" +"
      • Output CRS: Independent of the original CRS, you may choose to reproject the delivered Coverages to another CRS offered by the WCS server. The list of offered CRS\'s is provided as a selection button. The listing of server side offered CRS\'s is gathered during the "Connect to Server" initialisation process. As soon as a DescribeCoverage or a DescribeEOCoverageSet request has been issue the value shown correspond to the "Original" CRS of the Coverages.
      • \n" +"
      • Output Size: This section allows you to resize/rescale the delivered Coverages, independently of the AOI. You may choose either to provide absolute sizes for the "x-" and the "y-dimension" (pixel/line numbers) of the resulting Coverage or you provide the desired resolution (dimension of a pixel according to "Output CRS") for each of the axis. In either case you may need to run a DescribeCoverage or a DescribeEOCoverageSet request first, in order to gather the correct "Axis-Labels" (if you know them already you may skip this step and provide the "Axis-Labels" manually). To return to the original outsize select the respective "Original Outsize" radio button.
      \n" "


      \n" "
    • Once you have set all desired \'Output Parameters\', select the "GetCoverage" button to start the download.
    • \n" "
    • This may take some time (according to the number of selected Coverages and their requested size). Please be patient.
    • \n" -"
    • The Coverages will be downloaded and stored in the provided location sequentially and will concurrently be shown in the QGis Layers list. (Note: currently all coverages available in the provided location will be loaded and shown).
    \n" +"
  • The Coverages will be downloaded and stored in the provided location sequentially and will concurrently be shown in the QGis Layers list. .
  • \n" "

    Hint - Erroneous behaviour

    \n" "
    • In case you encounter an error (except server errors) or other strange behaviour, please close the QgsWcsClient2 plugin, restart QGis, activate the \'Python Console\' from within QGis (Menu: Plugins -> Python Console), reload the QgsWcsClient2 plugin and repeat your previous actions. (Note: in case you have the \'Plugin Reloader\' plugin installed you just need to close the QgsWcsClient2 plugin, open the \'Python Console\' and reload the QgsWcsClient2 plugin, before repeating your previous actions).
    • \n" -"
    • You should then get some additional information about the requests sent and error encountered. Please include this output in an error report to us.
    • \n" +"
    • You should then get some additional information about the requests sent and errors encountered. Please include this output in an error report to us.
    • \n" "
    • This output also shows the requests sent to the servers. Please copy these requests and try them in a regular browser and check if they work there and also check the error messages returned from the server, before sending error reports.
    • \n" -"
    • In most cases problems will be due to server errors e.g. an optional parameter is not supported. Unfortunately some servers do not indicate this directly but just issue a general server error. So please try the request with differernt parameter settings before sending error reports.
    \n" +"
  • In most cases problems will be due to server errors e.g. an optional parameter is not supported. Unfortunately some servers do not indicate this directly but just issue a general server error. So please try the request with differernt parameter settings before sending error reports.
  • \n" +"
  • NEW: I tried to anticipate the most common error issues and provide direct infomation and hints to the user. But I certainly haven\'t covered all possibilities.
  • \n" "

    Quick How To:

    \n" "
    1. Select a WCS server from the "Server" list and press the "Connect to Server" button
    2. \n" "
    3. Provide a "Local Storage Path" where downloaded Coverages shall be stored
    4. \n" @@ -1138,23 +1558,24 @@ def retranslateUi(self, QgsWcsClient2): "
    5. If Coverages have been selected, switch to the "DescribeCoverage" tab
    6. \n" "
      1. Issue a DescribeCoverage request
      2. \n" "
      3. check the returned DescribeCoverage result and close it
      4. \n" -"
      5. switch to the "GetCapabilities" tab
      \n" +"
    7. switch to the "GetCoverage" tab
    \n" "
  • If DatasetSeries have ben selected, switch to the "DescribeEOCoverageSet" tab
  • \n" -"
    1. Provide an AOI and maybe a TOI to which the search for DatasetSeries shall be limited (don\'t turn off the "Coverage IDs only" check-box!)
    2. \n" +"
      1. Maybe provide an AOI and maybe a TOI to which the search for coverages in the respective DatasetSeries shall be limited.
      2. \n" "
      3. Select one or more CoveragesIDs and/or DataSeriesIDs of interest
      4. \n" "
      5. Press the "DescribeEOCoverageSet" button
      6. \n" -"
      7. The returned results will be automatically shown in the "GetCoverage" tab
      \n" -"
    3. Optional:    Provide an AOI to which the Coverages shall be subsetted (pay attention to the "Type of Subsetting"; see the \'How To\' for details). You may also provide a comma-separated list of "Bands" considering their order
    4. \n" -"
    5. Check for the desired "Output Format" and the "Output CRS" !
    6. \n" +"
    7. The received results will be automatically shown in the "GetCoverage" tab
    \n" +"
  • Optional: Provide an AOI to which the Coverages shall be subsetted (pay attention to the "Type of Subsetting"; see the \'How To\' for details). You may also provide a comma-separated list of "Bands" considering their order
  • \n" +"
  • Check for the desired "Output Format" and the "Output CRS" ! Only images can be incorporated into QGis i.e. a download in gml will result in an error.
  • \n" "
  • Press "GetCoverage" button to start the download
  • \n" -"
  • The Coverages will be downloaded and stored in the provided location ("Local Storage Path") sequentially and will concurrently be shown in the QGis Layers list. (Note: currently all coverages available in the provided location will be loaded and shown).
  • \n" +"
  • The Coverages will be downloaded and stored in the provided location ("Local Storage Path") sequentially and will concurrently be shown in the QGis Layers list.
  • \n" "
  • Please be patient. This may take some time (according to the number of selected Coverages and their requested size)
  • \n" "

    Other Stuff:

    \n" "

    About

    \n" -"

    General Information about:   Author / Company / Contact / Copyright / Acknowledgements / License.
    Please see the separate "About" tab.

    \n" -"

     

    ", None)) +"

    General Information about: Author / Company / Contact / Copyright / Acknowledgements / License.
    Please see the separate "About" tab.

    \n" +"

    Extra information (e.g. about recent bug-fixes, etc. can be found at GitHub: https://github.com/EOX-A/QgsWcsClient2

    \n" +"


    ", None)) + self.btnClose_Help.setText(_translate("QgsWcsClient2", "Close", None)) self.tabWidget_EOWcsClient2.setTabText(self.tabWidget_EOWcsClient2.indexOf(self.tab_Help), _translate("QgsWcsClient2", "Help", None)) - self.btnClose_About.setText(_translate("QgsWcsClient2", "Close", None)) self.textEdit_2.setHtml(_translate("QgsWcsClient2", "\n" "