Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions docs/source/usage.rst
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,21 @@ Result:
:height: 250px
:alt: WMS GetMap generated by OWSLib

To fetch the image with another HTTP client (an asynchronous one, for example), build the
request URL without sending it. ``buildGetMapURL`` takes the same parameters as ``getmap``, and
``buildGetFeatureInfoURL`` does the same for ``getfeatureinfo``:

.. code-block:: python

>>> url = wms.buildGetMapURL(layers=['goes_west_ir'],
size=(300, 250),
bbox=(-126, 24, -66, 50),
srs='EPSG:4326',
format='image/png')

If a capabilities document has already been fetched the same way, pass it to the constructor
with ``xml=`` and OWSLib will parse it instead of requesting it.

Comment thread
michaeldavie marked this conversation as resolved.
Resolved

WFS
---
Expand Down
125 changes: 99 additions & 26 deletions owslib/map/wms111.py
Original file line number Diff line number Diff line change
Expand Up @@ -237,11 +237,7 @@ def getmap(self, layers=None, styles=None, srs=None, bbox=None,
out.close()

"""
try:
base_url = next((m.get('url') for m in self.getOperationByName('GetMap').methods
if m.get('type').lower() == method.lower()))
except StopIteration:
base_url = self.url
base_url = self._operation_url('GetMap', method)
request = {'version': self.version, 'request': 'GetMap'}

request = self.__build_getmap_request(
Expand Down Expand Up @@ -271,6 +267,48 @@ def getmap(self, layers=None, styles=None, srs=None, bbox=None,
raise ServiceException(err_message)
return u

def buildGetMapURL(self, layers=None, styles=None, srs=None, bbox=None,
format=None, size=None, time=None, transparent=False,
bgcolor='#FFFFFF',
exceptions='application/vnd.ogc.se_xml',
**kwargs
):
"""Return the URL of a GetMap request without sending it.

Takes the same parameters as getmap() and returns the URL that
getmap(method='Get') would request. Useful for fetching the image
with another HTTP client, such as an asynchronous one.
"""
request = self.__build_getmap_request(
layers=layers,
styles=styles,
srs=srs,
bbox=bbox,
format=format,
size=size,
time=time,
transparent=transparent,
bgcolor=bgcolor,
exceptions=exceptions,
**kwargs)

return bind_url(self._operation_url('GetMap', 'Get')) + urlencode(request)

def __build_getfeatureinfo_request(self, query_layers=None, xy=None, info_format=None,
feature_count=20, **kwargs):

# GetMap-Request
request = self.__build_getmap_request(**kwargs)

# extend to GetFeatureInfo-Request
request['request'] = 'GetFeatureInfo'
request['query_layers'] = ','.join(query_layers or kwargs['layers'])
request['x'] = str(xy[0])
request['y'] = str(xy[1])
request['info_format'] = info_format
request['feature_count'] = str(feature_count)
return request

def getfeatureinfo(self,
layers=None,
styles=None,
Expand All @@ -290,14 +328,9 @@ def getfeatureinfo(self,
timeout=None,
**kwargs
):
try:
base_url = next((m.get('url') for m in self.getOperationByName('GetFeatureInfo').methods
if m.get('type').lower() == method.lower()))
except StopIteration:
base_url = self.url
base_url = self._operation_url('GetFeatureInfo', method)

# GetMap-Request
request = self.__build_getmap_request(
request = self.__build_getfeatureinfo_request(
layers=layers,
styles=styles,
srs=srs,
Expand All @@ -308,22 +341,12 @@ def getfeatureinfo(self,
transparent=transparent,
bgcolor=bgcolor,
exceptions=exceptions,
query_layers=query_layers,
xy=xy,
info_format=info_format,
feature_count=feature_count,
**kwargs)

# extend to GetFeatureInfo-Request
request['request'] = 'GetFeatureInfo'

if not query_layers:
__str_query_layers = ','.join(layers)
else:
__str_query_layers = ','.join(query_layers)

request['query_layers'] = __str_query_layers
request['x'] = str(xy[0])
request['y'] = str(xy[1])
request['info_format'] = info_format
request['feature_count'] = str(feature_count)

data = urlencode(request)

self.request = bind_url(base_url) + data
Expand All @@ -338,6 +361,47 @@ def getfeatureinfo(self,
raise ServiceException(err_message)
return u

def buildGetFeatureInfoURL(self,
layers=None,
styles=None,
srs=None,
bbox=None,
format=None,
size=None,
time=None,
transparent=False,
bgcolor='#FFFFFF',
exceptions='application/vnd.ogc.se_xml',
query_layers=None,
xy=None,
info_format=None,
feature_count=20,
**kwargs
):
"""Return the URL of a GetFeatureInfo request without sending it.

Takes the same parameters as getfeatureinfo() and returns the URL
that getfeatureinfo(method='Get') would request.
"""
request = self.__build_getfeatureinfo_request(
layers=layers,
styles=styles,
srs=srs,
bbox=bbox,
format=format,
size=size,
time=time,
transparent=transparent,
bgcolor=bgcolor,
exceptions=exceptions,
query_layers=query_layers,
xy=xy,
info_format=info_format,
feature_count=feature_count,
**kwargs)

return bind_url(self._operation_url('GetFeatureInfo', 'Get')) + urlencode(request)

def getServiceXML(self):
xml = None
if self._capabilities is not None:
Expand All @@ -351,6 +415,15 @@ def getOperationByName(self, name):
return item
raise KeyError("No operation named %s" % name)

def _operation_url(self, name, method):
"""Return the URL advertised for an operation and HTTP DCP method,
or the service URL if none is advertised."""
try:
return next((m.get('url') for m in self.getOperationByName(name).methods
if m.get('type').lower() == method.lower()))
except StopIteration:
return self.url


class ServiceIdentification(object):
''' Implements IServiceIdentificationMetadata '''
Expand Down
139 changes: 113 additions & 26 deletions owslib/map/wms130.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,15 @@ def getOperationByName(self, name):
return item
raise KeyError("No operation named %s" % name)

def _operation_url(self, name, method):
"""Return the URL advertised for an operation and HTTP DCP method,
or the service URL if none is advertised."""
try:
return next((m.get('url') for m in self.getOperationByName(name).methods
if m.get('type').lower() == method.lower()))
except StopIteration:
return self.url

def __build_getmap_request(self, layers=None, styles=None, srs=None, bbox=None,
format=None, size=None, time=None, dimensions={},
elevation=None, transparent=False,
Expand Down Expand Up @@ -282,12 +291,7 @@ def getmap(self, layers=None,

"""

try:
base_url = next((m.get('url') for m in
self.getOperationByName('GetMap').methods if
m.get('type').lower() == method.lower()))
except StopIteration:
base_url = self.url
base_url = self._operation_url('GetMap', method)

request = self.__build_getmap_request(
layers=layers,
Expand Down Expand Up @@ -323,7 +327,7 @@ def getmap(self, layers=None,
raise ServiceException(err_message)
return u

def getfeatureinfo(self, layers=None,
def buildGetMapURL(self, layers=None,
styles=None,
srs=None,
bbox=None,
Expand All @@ -335,21 +339,15 @@ def getfeatureinfo(self, layers=None,
transparent=False,
bgcolor='#FFFFFF',
exceptions='XML',
query_layers=None,
xy=None,
info_format=None,
feature_count=20,
method='Get',
timeout=None,
**kwargs
):
try:
base_url = next((m.get('url') for m in self.getOperationByName('GetFeatureInfo').methods
if m.get('type').lower() == method.lower()))
except StopIteration:
base_url = self.url
"""Return the URL of a GetMap request without sending it.

Takes the same parameters as getmap() and returns the URL that
getmap(method='Get') would request. Useful for fetching the image
with another HTTP client, such as an asynchronous one.
"""

# GetMap-Request
request = self.__build_getmap_request(
layers=layers,
styles=styles,
Expand All @@ -365,19 +363,63 @@ def getfeatureinfo(self, layers=None,
exceptions=exceptions,
**kwargs)

# extend to GetFeatureInfo-Request
request['request'] = 'GetFeatureInfo'
return bind_url(self._operation_url('GetMap', 'Get')) + urlencode(request)

if not query_layers:
__str_query_layers = ','.join(layers)
else:
__str_query_layers = ','.join(query_layers)
def __build_getfeatureinfo_request(self, query_layers=None, xy=None, info_format=None,
feature_count=20, **kwargs):

request['query_layers'] = __str_query_layers
# GetMap-Request
request = self.__build_getmap_request(**kwargs)

# extend to GetFeatureInfo-Request
request['request'] = 'GetFeatureInfo'
request['query_layers'] = ','.join(query_layers or kwargs['layers'])
request['i'] = str(xy[0])
request['j'] = str(xy[1])
request['info_format'] = info_format
request['feature_count'] = str(feature_count)
return request

def getfeatureinfo(self, layers=None,
styles=None,
srs=None,
bbox=None,
format=None,
size=None,
time=None,
elevation=None,
dimensions={},
transparent=False,
bgcolor='#FFFFFF',
exceptions='XML',
query_layers=None,
xy=None,
info_format=None,
feature_count=20,
method='Get',
timeout=None,
**kwargs
):
base_url = self._operation_url('GetFeatureInfo', method)

request = self.__build_getfeatureinfo_request(
layers=layers,
styles=styles,
srs=srs,
bbox=bbox,
dimensions=dimensions,
elevation=elevation,
format=format,
size=size,
time=time,
transparent=transparent,
bgcolor=bgcolor,
exceptions=exceptions,
query_layers=query_layers,
xy=xy,
info_format=info_format,
feature_count=feature_count,
**kwargs)

data = urlencode(request)

Expand All @@ -393,6 +435,51 @@ def getfeatureinfo(self, layers=None,
raise ServiceException(err_message)
return u

def buildGetFeatureInfoURL(self, layers=None,
styles=None,
srs=None,
bbox=None,
format=None,
size=None,
time=None,
elevation=None,
dimensions={},
transparent=False,
bgcolor='#FFFFFF',
exceptions='XML',
query_layers=None,
xy=None,
info_format=None,
feature_count=20,
**kwargs
):
"""Return the URL of a GetFeatureInfo request without sending it.

Takes the same parameters as getfeatureinfo() and returns the URL
that getfeatureinfo(method='Get') would request.
"""

request = self.__build_getfeatureinfo_request(
layers=layers,
styles=styles,
srs=srs,
bbox=bbox,
dimensions=dimensions,
elevation=elevation,
format=format,
size=size,
time=time,
transparent=transparent,
bgcolor=bgcolor,
exceptions=exceptions,
query_layers=query_layers,
xy=xy,
info_format=info_format,
feature_count=feature_count,
**kwargs)

return bind_url(self._operation_url('GetFeatureInfo', 'Get')) + urlencode(request)


class ServiceIdentification(object):
def __init__(self, infoset, version):
Expand Down
Loading
Loading