58 |
58 |
category = _('Geographic information system')
|
59 |
59 |
wms_service_url = models.URLField(_('Web Map Service (WMS) URL'), max_length=256, blank=True)
|
60 |
60 |
wfs_service_url = models.URLField(_('Web Feature Service (WFS) URL'), max_length=256, blank=True)
|
61 |
|
query_layer = models.CharField(_('Query Layer'), max_length=256)
|
|
61 |
query_layer = models.CharField(
|
|
62 |
_('Query Layer'),
|
|
63 |
max_length=256,
|
|
64 |
help_text=_('Corresponds to a WMS layer name and/or a WFS feature type.'),
|
|
65 |
blank=True,
|
|
66 |
)
|
62 |
67 |
projection = models.CharField(_('GIS projection'), choices=PROJECTIONS,
|
63 |
68 |
default='EPSG:3857', max_length=16)
|
64 |
69 |
search_radius = models.IntegerField(_('Radius for point search'), default=5)
|
... | ... | |
148 |
153 |
'version': self.get_wfs_service_version(),
|
149 |
154 |
'service': 'WFS',
|
150 |
155 |
'request': 'GetFeature',
|
151 |
|
self.get_typename_label(): typename,
|
|
156 |
self.get_typename_label(): typename or self.query_layer,
|
152 |
157 |
'propertyName': property_name,
|
153 |
158 |
'outputFormat': self.get_output_format(),
|
154 |
159 |
}
|
... | ... | |
159 |
164 |
@endpoint(perm='can_access', description='Get features',
|
160 |
165 |
parameters={
|
161 |
166 |
'type_names': {
|
162 |
|
'description': _('Type of feature to query'),
|
|
167 |
'description': _('Type of feature to query. Defaults to globally defined '
|
|
168 |
'query layer'),
|
163 |
169 |
'example_value': 'feature'
|
164 |
170 |
},
|
165 |
171 |
'property_name': {
|
... | ... | |
183 |
189 |
'example_value': 'true'
|
184 |
190 |
}
|
185 |
191 |
})
|
186 |
|
def features(self, request, type_names, property_name, cql_filter=None,
|
|
192 |
def features(self, request, property_name, type_names=None, cql_filter=None,
|
187 |
193 |
filter_property_name=None, q=None, **kwargs):
|
188 |
194 |
if cql_filter:
|
189 |
195 |
if filter_property_name and q:
|
... | ... | |
253 |
259 |
parameters={
|
254 |
260 |
'lat': {'description': _('Latitude'), 'example_value': '45.79689'},
|
255 |
261 |
'lon': {'description': _('Longitude'), 'example_value': '4.78414'},
|
|
262 |
'query_layer': {'description': _('Defaults to globally defined query layer')},
|
256 |
263 |
})
|
257 |
|
def feature_info(self, request, lat, lon):
|
|
264 |
def feature_info(self, request, lat, lon, query_layer=None):
|
258 |
265 |
try:
|
259 |
266 |
lat, lon = float(lat), float(lon)
|
260 |
267 |
except ValueError:
|
... | ... | |
269 |
276 |
'i': '24', 'J': '24', # pixel in the middle of
|
270 |
277 |
'height': '50', 'WIDTH': '50', # a 50x50 square
|
271 |
278 |
'crs': self.projection,
|
272 |
|
'layers': self.query_layer,
|
273 |
|
'query_layers': self.query_layer,
|
|
279 |
'layers': query_layer or self.query_layer,
|
|
280 |
'query_layers': query_layer or self.query_layer,
|
274 |
281 |
'bbox': bbox,
|
275 |
282 |
}
|
276 |
283 |
response = self.requests.get(self.wms_service_url, params=params)
|
... | ... | |
284 |
291 |
'zoom': {'description': _('Zoom Level'), 'example_value': '16'},
|
285 |
292 |
'tile_x': {'description': _('X Coordinate'), 'example_value': '33650'},
|
286 |
293 |
'tile_y': {'description': _('Y Coordinate'), 'example_value': '23378'},
|
|
294 |
'query_layer': {'description': _('Defaults to globally defined query layer')},
|
287 |
295 |
})
|
288 |
|
def tile(self, request, zoom, tile_x, tile_y):
|
|
296 |
def tile(self, request, zoom, tile_x, tile_y, query_layer=None):
|
289 |
297 |
zoom = int(zoom)
|
290 |
298 |
|
291 |
299 |
tile_x = int(tile_x)
|
... | ... | |
302 |
310 |
'version': '1.3.0',
|
303 |
311 |
'service': 'wMS',
|
304 |
312 |
'request': 'getMap',
|
305 |
|
'layers': self.query_layer,
|
|
313 |
'layers': query_layer or self.query_layer,
|
306 |
314 |
'styles': '',
|
307 |
315 |
'format': 'image/png',
|
308 |
316 |
'transparent': 'false',
|
... | ... | |
317 |
325 |
cache_duration=300)
|
318 |
326 |
return HttpResponse(response.content, content_type='image/png')
|
319 |
327 |
|
320 |
|
@endpoint(perm='can_access', description=_('Get feature info'))
|
321 |
|
def reverse(self, request, lat, lon, **kwargs):
|
|
328 |
@endpoint(perm='can_access', description=_('Get feature info'),
|
|
329 |
parameters={
|
|
330 |
'lat': {'description': _('Latitude'), 'example_value': '45.79689'},
|
|
331 |
'lon': {'description': _('Longitude'), 'example_value': '4.78414'},
|
|
332 |
'type_names': {
|
|
333 |
'description': _('Type of feature to query. Defaults to globally defined '
|
|
334 |
'query layer'),
|
|
335 |
'example_value': 'feature'
|
|
336 |
},
|
|
337 |
})
|
|
338 |
def reverse(self, request, lat, lon, type_names=None):
|
322 |
339 |
lon, lat = self.convert_coordinates(lon, lat)
|
323 |
340 |
|
324 |
341 |
cql_filter = 'DWITHIN(the_geom,Point(%.6f %.6f),%s,meters)' % (lon, lat, self.search_radius)
|
325 |
|
params = self.build_get_features_params(typename=self.query_layer, cql_filter=cql_filter)
|
|
342 |
params = self.build_get_features_params(typename=type_names, cql_filter=cql_filter)
|
326 |
343 |
response = self.requests.get(self.wfs_service_url, params=params)
|
327 |
344 |
if not response.ok:
|
328 |
345 |
raise APIError('Webservice returned status code %s' % response.status_code)
|
329 |
|
-
|