Navigation Menu

Skip to content

Commit

Permalink
Added experimental WMTS support #132
Browse files Browse the repository at this point in the history
  • Loading branch information
carolinux committed Jul 9, 2015
1 parent 9f0d54d commit dd72c30
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 15 deletions.
40 changes: 26 additions & 14 deletions raster/wmstlayer.py
Expand Up @@ -14,44 +14,56 @@ class WMSTRasterLayer(TimeRasterLayer):
def __init__(self, settings, iface=None):
TimeLayer.__init__(self,settings.layer, settings.isEnabled)

self.fromTimeAttribute = "From WMST time attribute"
self.toTimeAttribute = self.fromTimeAttribute
self.timeFormat = "%Y-%m-%dT%H:%M:%SZ"
self.fromTimeAttribute = settings.startTimeAttribute
self.toTimeAttribute = settings.endTimeAttribute
self.timeFormat = self.determine_format(settings.startTimeAttribute, settings.timeFormat)
self.offset = int(settings.offset)
self.originalUri = self.layer.dataProvider().dataSourceUri()
try:
self.getTimeExtents()
except NotATimeAttributeError, e:
raise InvalidTimeLayerError(e)

def _get_wmts_layer_name():
return self.layer.subLayers(0)

def _get_time_extents_from_uri(self):
# url = http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r-t.cgi?&SERVICE=WMS&REQUEST=GetCapabilities
pass
# TODO get url from original uri
url = "http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r-t.cgi?&SERVICE=WMS&REQUEST=GetCapabilities"
# TODO get extents from the xml somehow
import urllib2
raw_xml = urllib2.urlopen(url).read()
name = self._get_wmts_layer_name()
return None,None

def getTimeExtents(self):
p = self.layer.dataProvider()

startTime = # ??? how to get minimum and maximum time from wmst?
endTime = # ???
startTime, endTime =time_util.str_to_datetime(self.fromTimeAttribute, self.timeFormat),\
time_util.str_to_datetime(self.toTimeAttribute, self.timeFormat)
startTime += timedelta(seconds=self.offset)
endTime += timedelta(seconds=self.offset)
return (startTime,endTime)

def addUrlMark(self):
if "?" in self.originalUri:
return "&"
else:
return "?"

def setTimeRestriction(self,timePosition,timeFrame):
"""Constructs the query, including the original subset"""
if not self.timeEnabled:
self.deleteTimeRestriction()
return
startTime = timePosition + timedelta(seconds=self.offset)
endTime = timePosition + timeFrame + timedelta(seconds=self.offset) # end time is ignored here, what else to do?
# the ? could be a problem
self.layer.dataProvider().setDataSourceUri(IGNORE_PREFIX+\
self.originalUri+"?&TIME%3D{}".format(time_util.datetime_to_str(startTime,self.timeFormat)))
endTime = timePosition + timeFrame + timedelta(seconds=self.offset)
self.layer.dataProvider().setDataSourceUri(self.IGNORE_PREFIX+\
self.originalUri + self.addUrlMark() + "TIME={}/{}"\
.format(time_util.datetime_to_str(startTime,self.timeFormat),time_util.datetime_to_str(endTime,self.timeFormat)))
self.layer.dataProvider().reloadData()

def deleteTimeRestriction(self):
"""The layer is removed from Time Manager and is therefore always shown"""
self.layer.dataProvider().setDataSourceUri(self.originalUri)
self.layer.dataProvider().reloadData()
#self.layer.triggerRepaint()
self.layer.triggerRepaint()

4 changes: 3 additions & 1 deletion time_util.py
Expand Up @@ -118,6 +118,7 @@ def generate_all_timezones(fmt):
"%Y-%m-%d %H:%M",
"%Y-%m-%dT%H:%M:%S",
"%Y-%m-%dT%H:%M:%SZ",
"%Y-%m-%dT%HZ",
"%Y-%m-%d",
"%Y/%m/%d %H:%M:%S.%f",
"%Y/%m/%d %H:%M:%S",
Expand All @@ -137,8 +138,9 @@ def generate_all_timezones(fmt):
DMY_SUPPORTED_FORMATS = map(lambda x: _str_switch(x,"%Y","%d"), YMD_SUPPORTED_FORMATS)
MDY_SUPPORTED_FORMATS = map(lambda x: _str_switch(x,"%m","%d"), DMY_SUPPORTED_FORMATS)

OTHER_FORMATS = ["%Y-%m"]

SUPPORTED_FORMATS = list(YMD_SUPPORTED_FORMATS + MDY_SUPPORTED_FORMATS + DMY_SUPPORTED_FORMATS)
SUPPORTED_FORMATS = list(YMD_SUPPORTED_FORMATS + MDY_SUPPORTED_FORMATS + DMY_SUPPORTED_FORMATS + OTHER_FORMATS)

def is_date_object(val):
return isinstance(val, datetime) or isinstance(val, bcdate_util.BCDate)
Expand Down
3 changes: 3 additions & 0 deletions timelayerfactory.py
Expand Up @@ -6,6 +6,7 @@
from timerasterlayer import TimeRasterLayer
from timevectorinterpolatedlayer import TimeVectorInterpolatedLayer
from raster.cdflayer import CDFRasterLayer
from raster.wmstlayer import WMSTRasterLayer
import time_util


Expand All @@ -21,6 +22,8 @@ def get_timelayer_class_from_settings(cls, settings):
elif type(layer) == QgsVectorLayer and interpolate:
return TimeVectorInterpolatedLayer
elif type(layer) == QgsRasterLayer:
if "Web Map Service" in layer.dataProvider().description():
return WMSTRasterLayer
if isNetCDF:
return CDFRasterLayer
else:
Expand Down

0 comments on commit dd72c30

Please sign in to comment.