Google maps 计算静态谷歌地图图像的边界框

Google maps 计算静态谷歌地图图像的边界框,google-maps,google-maps-api-3,google-static-maps,map-projections,Google Maps,Google Maps Api 3,Google Static Maps,Map Projections,假设我从google静态地图API请求此图像 我得到了一张以52.591370,-2.110748为中心的600px x 600px图像。给定中心、图像大小和缩放级别,如何计算图像在lat lng坐标中的边界框。更具体地说,我如何计算左下角和右上角的lat/lng 我做了一些研究,看了墨卡托投影,但文章不断提到瓷砖尺寸,这与本例无关 有人能帮忙吗?我可以解释如何使用Maps JavaScript API计算边界框的东北点和西南点 您有一个中心位置,并且知道从中心到东北和西南的距离在两个轴上都是

假设我从google静态地图API请求此图像

我得到了一张以52.591370,-2.110748为中心的600px x 600px图像。给定中心、图像大小和缩放级别,如何计算图像在lat lng坐标中的边界框。更具体地说,我如何计算左下角和右上角的lat/lng

我做了一些研究,看了墨卡托投影,但文章不断提到瓷砖尺寸,这与本例无关


有人能帮忙吗?

我可以解释如何使用Maps JavaScript API计算边界框的东北点和西南点

您有一个中心位置,并且知道从中心到东北和西南的距离在两个轴上都是300像素

查看以下计算东北和西南点的代码

var映射;
函数initMap(){
var latLng=新的google.maps.latLng(52.591370,-2.110748);
map=new google.maps.map(document.getElementById('map'){
中心:拉特林,
缩放:18,
mapTypeId:google.maps.mapTypeId.SATELLITE
});
var marker=new google.maps.marker({
位置:latLng,
地图:地图
});
google.maps.event.addListener(映射,“空闲”,函数(){
//距中心的真实和水平距离(以像素为单位)
var h=300;
var w=300;
var centerpoixel=map.getProjection().fromLatLngToPoint(latLng);
var pixelSize=Math.pow(2,-map.getZoom());
var nePoint=new google.maps.Point(centerPixel.x+w*pixelSize,centerPixel.y-h*pixelSize);
var swPoint=new google.maps.Point(centerPixel.x-w*pixelSize,centerPixel.y+h*pixelSize);
var ne=map.getProjection().frompointtolatng(nePoint);
var sw=map.getProjection().fromPointToLatLng(swPoint);
var neMarker=new google.maps.Marker({
位置:东北,
地图:地图,
标题:“NE:+NE.toString()
});
var swMarker=new google.maps.Marker({
位置:西南,
地图:地图,
标题:“SW:+SW.toString()
});
var polygon=新建google.maps.polygon({
路径:[ne,new google.maps.LatLng(ne.lat(),sw.lng()),sw,new google.maps.LatLng(sw.lat(),ne.lng())],
地图:地图,
strokeColor:“绿色”
});
log(“NE:+NE.toString());
log(“SW:+SW.toString());
});
}
#地图{
身高:100%;
}
/*可选:使示例页面填充窗口*/
html,正文{
身高:100%;
保证金:0;
填充:0;
}

此解决方案不需要包含Google地图客户端地图。见示例:

const _C = { x: 128, y: 128 };
const _J = 256 / 360;
const _L = 256 / (2 * Math.PI);

function tb(a) {
    return 180 * a / Math.PI
}

function sb(a) {
    return a * Math.PI / 180
}

function bounds(a, b, c) {
    null != b && (a = Math.max(a, b));
    null != c && (a = Math.min(a, c));
    return a
}

function latlonToPt(ll) {
  a = bounds(Math.sin(sb(ll[0])), -(1 - 1E-15), 1 - 1E-15);
  return {
    x: _C.x + ll[1] * _J,
    y: _C.y + 0.5 * Math.log((1 + a) / (1 - a)) * - _L
  }
}

function ptToLatlon(pt) {
    return [tb(2 * Math.atan(Math.exp((pt.y - _C.y) / -_L)) - Math.PI / 2),(pt.x - _C.x) / _J]
}


function calculateBbox(ll, zoom, sizeX, sizeY) {
    const cp = latlonToPt(ll);
    const pixelSize = Math.pow(2, -(zoom+1));
    const pwX = sizeX*pixelSize;
    const pwY = sizeY*pixelSize;

    return {
      ne: ptToLatlon({x: cp.x + pwX, y: cp.y - pwY}),
      sw: ptToLatlon({x: cp.x - pwX, y: cp.y + pwY})
    }
}