一、前言
使用geoserver发布的服务图层预览的时候点击路线,或者要素的时候是会直接显示要素的属性信息,根据请求来看,其中有个bbox参数找不到计算的方式,经过多番研究终于知道这个参数是怎么计算的了。
二、正文
BBOX 参数示例
bbox: 103.30821990966797,25.63594135892577,103.37757110595703,25.705292555214832
其实他是两个坐标,我们使用止点经度坐标减去起点经度可以得到一个差值如下:
103.37757110595703 - 103.30821990966797 = 0.0693511962890625
然后起点经度和止点加上该差值除以2其实就是用户实际点击的位置
计算如下:
103.37757110595703 + (0.0693511962890625/2) = 103.41224670410156
这个是缩放级别为10 的差值,缩放级别的不同,这个差值也会不同,一下是我使用Excel整理的对应表:
缩放级别 | 差值 | 用户坐标差 |
0 | 142.03125000 | 71.01562500 |
1 | 71.01562500 | 35.50781250 |
2 | 35.50781250 | 17.75390625 |
3 | 17.75390625 | 8.87695313 |
4 | 8.87695313 | 4.43847656 |
5 | 4.43847656 | 2.21923828 |
6 | 2.21923828 | 1.10961914 |
7 | 1.10961914 | 0.55480957 |
8 | 0.55480957 | 0.27740479 |
9 | 0.27740479 | 0.13870239 |
10 | 0.13870239 | 0.06935120 |
11 | 0.06935120 | 0.03467560 |
12 | 0.03467560 | 0.01733780 |
由此可以推断出bbox参数的计算方式:
/**
*计算用户坐标应该减去的差值
*/
function getZoomBbox(zoom){
let level0 = 142.03125
let box = level0 / Math.pow(2,zoom)
box = box / 2
return box
}
/**
*根据用户点击的坐标计算 bbox参数
*/
function bbox(latlng,zoom) {
let box = this.getZoomBbox(zoom)
let boxMin = {
lat: latlng.lat - box,
lng: latlng.lng - box
}
let boxMax = {
lat: latlng.lat + box,
lng: latlng.lng + box
}
// console.table({zoom,box,latlng,boxMin, boxMax })
return `${boxMin.lng},${boxMin.lat},${boxMax.lng},${boxMax.lat}`
}
以上代码亲自校验实践过,可直接使用,至于其他的参数,可以直接写死,下面给一个参数示例。
let query = {
service: 'wms',
version: '1.1.1',
request: 'getfeatureinfo',
format: 'image/png',
transparent: true,
query_layers: 'test:lineInfo',
layers: 'test:lineInfo',
exceptions: 'application/vnd.ogc.se_inimage',
info_format: 'application/json',
feature_count: 50,
x: 50,
y: 50,
srs: 'epsg:4326',
width: 101,
height: 101,
bbox:103.30821990966797,25.63594135892577,103.37757110595703,25.705292555214832
}
感谢你的查阅,希望能帮到你,NND CSDN标签页创建不了。