opengis: compute bbox according to opengis 1.3 rules (#33458)

This commit is contained in:
Frédéric Péters 2019-05-28 08:03:52 +02:00
parent 0c431e3557
commit 61bb06b143
2 changed files with 18 additions and 20 deletions

View File

@ -201,6 +201,16 @@ class OpenGIS(BaseResource):
lon, lat = pyproj.transform(wgs84, target_projection, lon, lat)
return lon, lat
def get_bbox(self, lon1, lat1, lon2, lat2):
if self.projection == 'EPSG:4326':
# send as is but invert coordinates
return '%s,%s,%s,%s' % (lat1, lon1, lat2, lon2)
wgs84 = pyproj.Proj(init='EPSG:4326')
target_projection = pyproj.Proj(init=self.projection)
x1, y1 = pyproj.transform(wgs84, target_projection, lon1, lat1)
x2, y2 = pyproj.transform(wgs84, target_projection, lon2, lat2)
return '%s,%s,%s,%s' % (x1, y1, x2, y2)
@endpoint(perm='can_access',
description=_('Get feature info'),
parameters={
@ -209,12 +219,7 @@ class OpenGIS(BaseResource):
})
def feature_info(self, request, lat, lon):
lon_b, lat_b = float(lon) + 0.002, float(lat) + 0.002
if self.projection != 'EPSG:4326':
wgs84 = pyproj.Proj(init='EPSG:4326')
target_projection = pyproj.Proj(init=self.projection)
lon_b, lat_b = pyproj.transform(wgs84, target_projection, lon_b, lat_b)
lon, lat = pyproj.transform(wgs84, target_projection, lon, lat)
bbox = '%s,%s,%s,%s' % (lat, lon, lat_b, lon_b)
bbox = self.get_bbox(lon, lat, lon_b, lat_b)
params = {
'VERSION': '1.3.0',
'SERVICE': 'WMS',
@ -261,17 +266,10 @@ class OpenGIS(BaseResource):
# upper right
ur_lon, ur_lat = num2deg(tile_x+1, tile_y, zoom)
# convert only when projection system is other than WGS84
if self.projection != 'EPSG:4326':
wgs84 = pyproj.Proj(init='EPSG:4326')
target_projection = pyproj.Proj(init=self.projection)
ll_lon, ll_lat = pyproj.transform(wgs84, target_projection, ll_lon, ll_lat)
ur_lon, ur_lat = pyproj.transform(wgs84, target_projection, ur_lon, ur_lat)
bbox = '%s,%s,%s,%s' % (ll_lon, ll_lat, ur_lon, ur_lat)
bbox = self.get_bbox(ll_lon, ll_lat, ur_lon, ur_lat)
params = {
'VERSION': '1.1.1',
'VERSION': '1.3.0',
'SERVICE': 'WMS',
'REQUEST': 'GetMap',
'LAYERS': self.query_layer,
@ -280,7 +278,7 @@ class OpenGIS(BaseResource):
'TRANSPARENT': 'false',
'HEIGHT': '256',
'WIDTH': '256',
'SRS': self.projection,
'CRS': self.projection,
'BBOX': bbox,
}
response = self.requests.get(

View File

@ -246,7 +246,7 @@ def test_feature_info(mocked_get, app, connector):
assert endpoint == '/opengis/test/feature_info'
mocked_get.return_value = utils.FakedResponse(content=FAKE_FEATURE_INFO, status_code=200)
resp = app.get(endpoint, params={'lat': '45.796890', 'lon': '4.784140'})
assert mocked_get.call_args[1]['params']['BBOX'] == '5747860.22776,532568.028684,5748179.56467,532790.667665'
assert mocked_get.call_args[1]['params']['BBOX'] == '532568.028684,5747860.22776,532790.667665,5748179.56467'
assert mocked_get.call_args[1]['params']['CRS'] == 'EPSG:3857'
assert (resp.json['data']
['cad_cadastrecadparcelle_layer']
@ -266,13 +266,13 @@ def test_tile(mocked_get, app, connector):
assert endpoint == '/opengis/test/tile'
mocked_get.return_value = utils.FakedResponse(content='\x89PNG\r\n\x1a\n\x00\x00...', status_code=200)
resp = app.get(endpoint + '/16/33650/23378.png')
assert mocked_get.call_args[1]['params']['SRS'] == 'EPSG:3857'
assert mocked_get.call_args[1]['params']['CRS'] == 'EPSG:3857'
assert mocked_get.call_args[1]['params']['BBOX'] == '539339.67158,5741338.06856,539951.167806,5741949.56478'
connector.projection = 'EPSG:4326'
connector.save()
resp = app.get(endpoint + '/16/33650/23378.png')
assert mocked_get.call_args[1]['params']['SRS'] == 'EPSG:4326'
assert mocked_get.call_args[1]['params']['BBOX'] == '4.84497070312,45.7560261559,4.85046386719,45.7598586879'
assert mocked_get.call_args[1]['params']['CRS'] == 'EPSG:4326'
assert mocked_get.call_args[1]['params']['BBOX'] == '45.7560261559,4.84497070312,45.7598586879,4.85046386719'
assert resp.content == '\x89PNG\r\n\x1a\n\x00\x00...'