Мы хотим отобразить несколько маркеров на статической карте и рассчитать оптимальный уровень масштабирования, как это делают Карты Google. Мы уже вычислили ограничивающий прямоугольник и центральную точку карты, но теперь нам сложно вычислить правильный уровень масштабирования для отображения всего ограничивающего прямоугольника. Может кто-нибудь, пожалуйста, укажите нам правильное направление?
google-maps
openstreetmap
tiles
extents
Тобиас Шварц
источник
источник
Ответы:
Чтобы получить уровень масштабирования, вам необходимо знать размеры вашей карты в пикселях. Вы также должны будете сделать свою математику в сферических координатах Меркатора.
источник
Это код C #, который я использую в Maperitive :
mapArea
: ограничивающий прямоугольник в координатах long / lat (x = long, y = lat)paddingFactor
: это может быть использовано для получения эффекта "120%", на который ссылается ThomM. Значение 1,2 даст вам 120%.Обратите внимание, что в моем случае
zoom
может быть действительным числом. В случае веб-карт вам нужно целочисленное значение масштабирования, поэтому вы должны использовать что-то вроде(int)Math.Floor(zoom)
этого.Конечно, этот код относится только к проекции Web Mercator.
источник
GeometryUtils
просто используется здесь для преобразования градусов в радианы и обратно, это простая математическая формула.Bounds2
в основном просто прямоугольная структура. Этот код был предоставлен скорее как псевдокод, а не как что-то непосредственно копируемое.Если вы используете OpenLayers, то
Map.getZoomForExtent
рассчитаете максимальный уровень масштабирования, который может соответствовать всему экстенту на карте. Вextent
потребности быть в проекции карты. Вы также можете использовать,fill_factor
чтобы избежать отображения точек на краю карты иmax_zoom
ограничить возможное увеличение:источник