Projet

Général

Profil

0001-opengis-compute-bbox-according-to-opengis-1.3-rules-.patch

Frédéric Péters, 28 mai 2019 08:15

Télécharger (5,06 ko)

Voir les différences:

Subject: [PATCH] opengis: compute bbox according to opengis 1.3 rules (#33458)

 passerelle/apps/opengis/models.py | 30 ++++++++++++++----------------
 tests/test_opengis.py             |  8 ++++----
 2 files changed, 18 insertions(+), 20 deletions(-)
passerelle/apps/opengis/models.py
201 201
                lon, lat = pyproj.transform(wgs84, target_projection, lon, lat)
202 202
        return lon, lat
203 203

  
204
    def get_bbox(self, lon1, lat1, lon2, lat2):
205
        if self.projection == 'EPSG:4326':
206
            # send as is but invert coordinates
207
            return '%s,%s,%s,%s' % (lat1, lon1, lat2, lon2)
208
        wgs84 = pyproj.Proj(init='EPSG:4326')
209
        target_projection = pyproj.Proj(init=self.projection)
210
        x1, y1 = pyproj.transform(wgs84, target_projection, lon1, lat1)
211
        x2, y2 = pyproj.transform(wgs84, target_projection, lon2, lat2)
212
        return '%s,%s,%s,%s' % (x1, y1, x2, y2)
213

  
204 214
    @endpoint(perm='can_access',
205 215
              description=_('Get feature info'),
206 216
              parameters={
......
209 219
              })
210 220
    def feature_info(self, request, lat, lon):
211 221
        lon_b, lat_b = float(lon) + 0.002, float(lat) + 0.002
212
        if self.projection != 'EPSG:4326':
213
            wgs84 = pyproj.Proj(init='EPSG:4326')
214
            target_projection = pyproj.Proj(init=self.projection)
215
            lon_b, lat_b = pyproj.transform(wgs84, target_projection, lon_b, lat_b)
216
            lon, lat = pyproj.transform(wgs84, target_projection, lon, lat)
217
        bbox = '%s,%s,%s,%s' % (lat, lon, lat_b, lon_b)
222
        bbox = self.get_bbox(lon, lat, lon_b, lat_b)
218 223
        params = {
219 224
            'VERSION': '1.3.0',
220 225
            'SERVICE': 'WMS',
......
261 266
        # upper right
262 267
        ur_lon, ur_lat = num2deg(tile_x+1, tile_y, zoom)
263 268

  
264
        # convert only when projection system is other than WGS84
265
        if self.projection != 'EPSG:4326':
266
            wgs84 = pyproj.Proj(init='EPSG:4326')
267
            target_projection = pyproj.Proj(init=self.projection)
268
            ll_lon, ll_lat = pyproj.transform(wgs84, target_projection, ll_lon, ll_lat)
269
            ur_lon, ur_lat = pyproj.transform(wgs84, target_projection, ur_lon, ur_lat)
270

  
271
        bbox = '%s,%s,%s,%s' % (ll_lon, ll_lat, ur_lon, ur_lat)
269
        bbox = self.get_bbox(ll_lon, ll_lat, ur_lon, ur_lat)
272 270

  
273 271
        params = {
274
            'VERSION': '1.1.1',
272
            'VERSION': '1.3.0',
275 273
            'SERVICE': 'WMS',
276 274
            'REQUEST': 'GetMap',
277 275
            'LAYERS': self.query_layer,
......
280 278
            'TRANSPARENT': 'false',
281 279
            'HEIGHT': '256',
282 280
            'WIDTH': '256',
283
            'SRS': self.projection,
281
            'CRS': self.projection,
284 282
            'BBOX': bbox,
285 283
        }
286 284
        response = self.requests.get(
tests/test_opengis.py
246 246
    assert endpoint == '/opengis/test/feature_info'
247 247
    mocked_get.return_value = utils.FakedResponse(content=FAKE_FEATURE_INFO, status_code=200)
248 248
    resp = app.get(endpoint, params={'lat': '45.796890', 'lon': '4.784140'})
249
    assert mocked_get.call_args[1]['params']['BBOX'] == '5747860.22776,532568.028684,5748179.56467,532790.667665'
249
    assert mocked_get.call_args[1]['params']['BBOX'] == '532568.028684,5747860.22776,532790.667665,5748179.56467'
250 250
    assert mocked_get.call_args[1]['params']['CRS'] == 'EPSG:3857'
251 251
    assert (resp.json['data']
252 252
                     ['cad_cadastrecadparcelle_layer']
......
266 266
    assert endpoint == '/opengis/test/tile'
267 267
    mocked_get.return_value = utils.FakedResponse(content='\x89PNG\r\n\x1a\n\x00\x00...', status_code=200)
268 268
    resp = app.get(endpoint + '/16/33650/23378.png')
269
    assert mocked_get.call_args[1]['params']['SRS'] == 'EPSG:3857'
269
    assert mocked_get.call_args[1]['params']['CRS'] == 'EPSG:3857'
270 270
    assert mocked_get.call_args[1]['params']['BBOX'] == '539339.67158,5741338.06856,539951.167806,5741949.56478'
271 271
    connector.projection = 'EPSG:4326'
272 272
    connector.save()
273 273
    resp = app.get(endpoint + '/16/33650/23378.png')
274
    assert mocked_get.call_args[1]['params']['SRS'] == 'EPSG:4326'
275
    assert mocked_get.call_args[1]['params']['BBOX'] == '4.84497070312,45.7560261559,4.85046386719,45.7598586879'
274
    assert mocked_get.call_args[1]['params']['CRS'] == 'EPSG:4326'
275
    assert mocked_get.call_args[1]['params']['BBOX'] == '45.7560261559,4.84497070312,45.7598586879,4.85046386719'
276 276
    assert resp.content == '\x89PNG\r\n\x1a\n\x00\x00...'
277 277

  
278 278

  
279
-