Получите изображения для прямоугольника в Google Static Maps API - PullRequest
4 голосов
/ 24 ноября 2010

У меня есть две точки LatLong: верхняя левая и нижняя правая точки прямоугольника, и я хотел бы, используя API Карт Google, получить спутниковые изображения для этого прямоугольника.

Я понимаю, что, поскольку уровень масштабирования является целым числом, я не смог бы получить этот точный прямоугольник, но нет проблем, если я получу большее растровое изображение, пока я могу рассчитать ограничивающий прямоугольник для растрового изображения в длинных координатах .

Поскольку размер растрового изображения фиксирован (скажем, 640x640), и у меня есть его центр, как найти соответствующий уровень масштабирования и рассчитать ограничивающий прямоугольник для растрового изображения?

1 Ответ

2 голосов
/ 24 ноября 2010

Найдена ссылка на Python, ссылка на которую есть в старом блоге API Карт Google, который предоставляет функцию CalculateBoundsZoomLevel.

Исходный файл здесь .

  def CalculateBoundsZoomLevel(self, bounds, view_size):
    """Given lat/lng bounds, returns map zoom level.

    This method is used to take in a bounding box (southwest and northeast 
    bounds of the map view we want) and a map size and it will return us a zoom 
    level for our map.  We use this because if we take the bottom left and 
    upper right on the map we want to show, and calculate what pixels they 
    would be on the map for a given zoom level, then we can see how many pixels 
    it will take to display the map at this zoom level.  If our map size is 
    within this many pixels, then we have the right zoom level.

    Args:
      bounds: A list of length 2, each holding a list of length 2. It holds
        the southwest and northeast lat/lng bounds of a map.  It should look 
        like this: [[southwestLat, southwestLat], [northeastLat, northeastLng]]
      view_size: A list containing the width/height in pixels of the map.

    Returns:
      An int zoom level.
    """
    zmax = 18
    zmin = 0
    bottom_left = bounds[0]
    top_right = bounds[1]
    backwards_range = range(zmin, zmax)
    backwards_range.reverse()
    for z in backwards_range:
      bottom_left_pixel = self.FromLatLngToPixel(bottom_left, z)
      top_right_pixel = self.FromLatLngToPixel(top_right, z)
      if bottom_left_pixel.x > top_right_pixel.x :
        bottom_left_pixel.x -= self.CalcWrapWidth(z)
      if abs(top_right_pixel.x - bottom_left_pixel.x) <= view_size[0] \
          and abs(top_right_pixel.y - bottom_left_pixel.y) <= view_size[1] :
        return z
    return 0
...