Как рассчитать масштаб и масштаб для Google Static map Images - PullRequest
4 голосов
/ 13 сентября 2011

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

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Вы можете попробовать это:

public static int GetWebMercatorZoomLevelFromMapScale(double currentMapScale)
{
    var scales = Enumerable.Range(1, 25)
        .Select(x => 591657550.500000 / Math.Pow(2, x - 1))
        .ToArray();

    int zoomLevel = Array.IndexOf(scales, scales.OrderBy(number => Math.Abs(number - currentMapScale)).First());

    return zoomLevel;
}
0 голосов
/ 22 июня 2016

Как указано в Документация Google Maps :

Поскольку базовая плитка Mercator Google Maps имеет размер 256 x 256 пикселей.
Также обратите внимание, что на каждом уровне масштабирования карта имеет 2 n плиток.

Это означает, что на zoomLevel 2 пиксели в любом направлении карты равны = 256 * 2² = 1024px.

Принимая во внимание, что периметр Земли составляет ~ 40000 км, с увеличением 0, каждый пиксель ~ = 40000 км / 256 = 156,25 км
При увеличении 9 пиксели составляют 131072: 1 пиксель = 40000 км / 131072 = 0,305 км ... и так далее.

Если мы хотим, чтобы 400 пикселей = 1 км, мы должны выбрать максимально возможное приближение, поэтому: 1 пиксель = 1 км / 400 = 0,0025 км

Я попробовал увеличить масштаб = 15 и получить 1px = 0,00478 и увеличить = 16, что дало мне 1px = 0,00238 км

Это означает, что вы должны использовать zoom = 16, и у вас будет 0,955 км каждые 400 пикселей в линии экватора и только для x координат .

По мере того, как вы идете на север или юг по широте, периметр с каждым разом уменьшается, что приводит к изменению расстояния. И, конечно, это также меняет корреляцию по оси y , так как проекция сферы сложна.
Если вы хотите рассчитать с помощью функции точное расстояние, вы должны использовать тот, который предоставлен Google на их документации :

// Describe the Gall-Peters projection used by these tiles.
  gallPetersMapType.projection = {
    fromLatLngToPoint: function(latLng) {
      var latRadians = latLng.lat() * Math.PI / 180;
      return new google.maps.Point(
          GALL_PETERS_RANGE_X * (0.5 + latLng.lng() / 360),
          GALL_PETERS_RANGE_Y * (0.5 - 0.5 * Math.sin(latRadians)));
    },
    fromPointToLatLng: function(point, noWrap) {
      var x = point.x / GALL_PETERS_RANGE_X;
      var y = Math.max(0, Math.min(1, point.y / GALL_PETERS_RANGE_Y));

      return new google.maps.LatLng(
          Math.asin(1 - 2 * y) * 180 / Math.PI,
          -180 + 360 * x,
          noWrap);
    }
  };
...