首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从Google和缩放参数中获得纬度和经度界

如何从Google和缩放参数中获得纬度和经度界
EN

Stack Overflow用户
提问于 2014-05-04 15:20:02
回答 3查看 9K关注 0票数 6

我看到了一些类似标题的问题,但它们似乎指的是xy像素坐标。

我在询问Google的xy的实际瓷砖号,getTile()函数:

为了澄清这个问题。

给定getTile()函数中的x、y和缩放参数,如何找到平铺的纬度和经度界限?

代码语言:javascript
运行
复制
CoordMapType.prototype.getTile = function(coord, zoom, ownerDocument) {

    var x = coord.x,
    y = coord.y,
    url = "http://mt1.google.com/vt/lyrs=y&x="+x+"&y="+y+"&z="+zoom;
    //other stuff   
}

我现在需要的唯一原因是我想要确定这个瓷砖投影的最大缩放级别。从这个链接:最大缩放,它声明,为了找到最大缩放,我将需要一个纬度和经度值使用getMaxZoomAtLatLng()。因此,如果我能得到边界,那么我可以使用边界内的任何纬度和经度点来找到我的最大缩放。

我想到的替代方案是创建一个映像,并检查src url是否有错误(对我来说,这似乎是一个糟糕的主意,因为我会提出许多糟糕的请求,只是为了检查图像是否存在)。

代码语言:javascript
运行
复制
var img = new Image;
img.onload = function() {/*imagery exists*/ }
img.onerror = function() {/*past maximum zoom*/ }
img.src = url;

编辑:

经过进一步研究后,我意识到getMaxZoomAtLatLng()函数使用的是ajax调用,它将不适合我的计划。但是,我仍然感兴趣的是如何找到给定瓷砖的纬度和经度边界(这对于其他应用程序可能很有用)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-05 00:39:47

假设使用mercator-投影和tileSize为256x256的基本谷歌地图:

每个(x轴和y轴)上的瓷砖数是Math.pow(2,zoom),因此在缩放0地图上使用1块,在缩放1 4块上,在缩放2 16块上等等。

首先计算瓷砖的西南/东北点。

瓷砖的大小(以点为单位)是256/Math.pow(2,zoom)

西南点:

代码语言:javascript
运行
复制
x = tile.x * tileSizeInPoints
y = (tile.y * tileSizeInPoints) + tileSizeInPoints

东北点:

代码语言:javascript
运行
复制
x = (tile.x * tileSizeInPoints) + tileSizeInPoints
y = tile.y * tileSizeInPoints

必须将这些点转换为LatLngs。当您使用地图时,您可以使用映射投影的方法fromLatLngToPoint

对于自定义实现,请看一看https://developers.google.com/maps/documentation/javascript/examples/map-coordinates

一个可能的API独立实现:

代码语言:javascript
运行
复制
MERCATOR={

  fromLatLngToPoint:function(latLng){
     var siny =  Math.min(Math.max(Math.sin(latLng.lat* (Math.PI / 180)), 
                                   -.9999),
                          .9999);
     return {
      x: 128 + latLng.lng * (256/360),
      y: 128 + 0.5 * Math.log((1 + siny) / (1 - siny)) * -(256 / (2 * Math.PI))
     };
  },

  fromPointToLatLng: function(point){

     return {
      lat: (2 * Math.atan(Math.exp((point.y - 128) / -(256 / (2 * Math.PI)))) -
             Math.PI / 2)/ (Math.PI / 180),
      lng:  (point.x - 128) / (256 / 360)
     };

  },

  getTileAtLatLng:function(latLng,zoom){
    var t=Math.pow(2,zoom),
        s=256/t,
        p=this.fromLatLngToPoint(latLng);
        return {x:Math.floor(p.x/s),y:Math.floor(p.y/s),z:zoom};
  },

  getTileBounds:function(tile){
    tile=this.normalizeTile(tile);
    var t=Math.pow(2,tile.z),
        s=256/t,
        sw={x:tile.x*s,
            y:(tile.y*s)+s},
        ne={x:tile.x*s+s,
            y:(tile.y*s)};
        return{sw:this.fromPointToLatLng(sw),
               ne:this.fromPointToLatLng(ne)
              }
  },
  normalizeTile:function(tile){
    var t=Math.pow(2,tile.z);
    tile.x=((tile.x%t)+t)%t;
    tile.y=((tile.y%t)+t)%t;
    return tile;
  }

}

通过提供单个对象作为参数调用MERCATOR.getTileBounds(),其格式如下:

代码语言:javascript
运行
复制
{
 x:tileIndexX,
 y:tileIndexY,
 z:zoom 
}

演示:http://jsfiddle.net/doktormolle/55Nke/

票数 17
EN

Stack Overflow用户

发布于 2014-05-04 22:26:44

我认为Google地图贴图系统类似于Bings地图贴图系统。这些瓷砖从右下角的左上角开始,每个瓷砖为256x256:http://msdn.microsoft.com/en-us/library/bb259689.aspx

票数 0
EN

Stack Overflow用户

发布于 2022-09-16 01:00:39

不确定这是否完全有助于边界,但为了方便地显示瓷砖坐标,我在这里进行了如下操作:

https://developers.google.com/maps/documentation/javascript/examples/map-coordinates

和行上的打字稿:

代码语言:javascript
运行
复制
  const chicago = new google.maps.LatLng(-33.76781028848151, 150.73644505329204
);

把lat/long换成你想要的任何地方..。他们有一个很好的UI来计算变焦上的所有变化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23457916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档