Projet

Général

Profil

0001-opengis-make-query_layer-config-parameter-optional-4.patch

Valentin Deniaud, 07 avril 2020 11:39

Télécharger (6,05 ko)

Voir les différences:

Subject: [PATCH] opengis: make query_layer config parameter optional (#41414)

 passerelle/apps/opengis/models.py | 41 ++++++++++++++++++++++---------
 1 file changed, 29 insertions(+), 12 deletions(-)
passerelle/apps/opengis/models.py
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
-