У меня есть набор точек, которые я хочу нанести на встроенную карту Google (API v3). Я бы хотел, чтобы границы вмещали все точки, если уровень масштабирования не слишком низкий (т. Е. Слишком сильно уменьшен). Мой подход был такой:
var bounds = new google.maps.LatLngBounds();
// extend bounds with each point
gmap.fitBounds(bounds);
gmap.setZoom( Math.max(6, gmap.getZoom()) );
Это не работает Последняя строка "gmap.setZoom ()" не меняет уровень масштабирования карты, если вызывается непосредственно после fitBounds.
Есть ли способ получить уровень масштабирования границ, не применяя его к карте? Другие идеи, чтобы решить это?
Ответы:
Изменить : см. Комментарий Мэтта Даймонда ниже.
Понял! Попробуй это:
Изменить в соответствии с вашими потребностями.
источник
Я решил похожую проблему в одном из моих приложений. Меня немного смутило ваше описание проблемы, но я думаю, что у вас та же цель, что и у меня ...
В моем приложении я хотел нанести один или несколько маркеров и убедиться, что на карте их все показано. Проблема заключалась в том, что если бы я полагался исключительно на метод fitBounds, то при увеличении одной точки уровень масштабирования был бы максимальным, что было бесполезно.
Решение состояло в том, чтобы использовать fitBounds, когда было много точек, и setCenter + setZoom, когда была только одна точка.
источник
Я заходил на эту страницу несколько раз, чтобы получить ответ, и хотя все существующие ответы были очень полезными, они не решили мою проблему точно.
По сути, я обнаружил, что событие zoom_changed предотвращает «пропуск» пользовательского интерфейса карты, что произошло, когда я ждал события «idle».
Надеюсь, это кому-нибудь поможет!
источник
fitBounds()
при использованииzoom_changed
bounds_changed
, потомуzoom_changed
что не нужно запускать в случае, когдаfitBounds
держит уровень масштабирования. Моя попытка jsfiddle.net/rHeMp/10 не подтверждает это, но не следует полагаться на неопределенное поведение.Я только что исправил это, предварительно установив maxZoom, а затем удалив его. Например:
источник
Если я не ошибаюсь, я предполагаю, что вы хотите, чтобы все ваши точки были видны на карте с максимально возможным уровнем масштабирования. Я достиг этого, установив уровень масштабирования карты до 16 (не уверен, что это самый высокий уровень масштабирования на V3).
Затем, после этого, я сделал что-то новое:
Результат: успех!
источник
Я использую:
При этом будет использоваться меньшее из 24 и необходимый уровень масштабирования в соответствии с вашим кодом, однако в любом случае он, вероятно, изменит масштаб и не будет заботиться о том, насколько вы уменьшите масштаб.
источник
Пожалуйста, попробуйте это:
источник
У меня была та же проблема, и я смог решить ее, используя следующий код. Это
google.maps.addListenerOnce()
событие listener ( ) будет запущено только один раз, сразу послеmap.fitBounds()
выполнения. Таким образом, нет необходимостиidle
.Первоначально он устанавливает соответствующий уровень масштабирования и позволяет пользователю увеличивать и уменьшать масштаб после начального уровня масштабирования, поскольку срок действия прослушивателя событий истек. Например, если только
google.maps.addListener()
вызывается, то пользователь никогда не сможет увеличить масштаб до указанного уровня масштабирования (в данном случае 4). Поскольку мы реализовалиgoogle.maps.addListenerOnce()
, пользователь сможет масштабировать до любого уровня, который он / она выбирает.источник
Была такая же проблема, нужно было разместить много маркеров на карте. Это решило мой случай:
bounds.extend(objLatLng)
)Выполнить подгонку после того, как карта завершена:
источник
Я нашел решение, которое делает проверку перед звонком,
fitBounds
чтобы вы не увеличивали и не уменьшалиВам придется немного поиграться с переменной minLatSpan, чтобы получить ее там, где вы хотите. Он будет варьироваться в зависимости от уровня масштабирования и размеров холста карты.
Вы также можете использовать долготу вместо широты
источник
Я видел много неправильных или слишком сложных решений, поэтому решил опубликовать рабочее, элегантное решение .
Причина
setZoom()
не работает, как вы ожидаете, в том, чтоfitBounds()
она асинхронная, поэтому она не дает гарантии, что она немедленно обновит масштаб, но ваш вызовsetZoom()
полагается на это.То, что вы могли бы рассмотреть, это установить параметр
minZoom
карты перед вызовом,fitBounds()
а затем очистить его после его завершения (чтобы пользователи могли по-прежнему уменьшать масштаб вручную, если захотят):Кроме того, если вы хотите ограничить максимальное увеличение, вы можете применить тот же трюк с
maxZoom
свойством.Смотрите документы MapOptions .
источник
Я использую это, чтобы гарантировать, что уровень масштабирования не превышает установленный уровень, так что я знаю, что спутниковые изображения будут доступны.
Добавьте слушателя к
zoom_changed
событию. Это дает дополнительное преимущество, заключающееся в управлении масштабированием в пользовательском интерфейсе.Выполняется только
setZoom
при необходимости, поэтомуif
оператор предпочтительнееMath.max
илиMath.min
Чтобы предотвратить слишком большое уменьшение:
источник
В этой функции вам нужно динамически добавлять метаданные для хранения типа геометрии только потому, что функция принимает любую геометрию.
«fitGeometries» - это функция JSON, расширяющая объект карты.
«Геометрия» - это общий массив JavaScript, а не MVCArray ().
источник
эта работа для меня с API v3, но с установкой фиксированного увеличения:
источник
Как и я, если вы не хотите играть со слушателями, я пришел к простому решению: добавить метод на карту, который работает в строгом соответствии с вашими требованиями, например:
тогда вы можете вызвать
map.fitLmtdBounds(bounds)
вместо того,map.fitBounds(bounds)
чтобы установить границы в определенном диапазоне масштабирования ... илиmap.fitLmtdBounds(bounds,3,5)
переопределить диапазон масштабирования.источник
Пожалуйста, попробуйте это.
Если это будет полезно для вас.
Всего наилучшего
источник
После расчета границ вы можете проверить расстояние между верхним левым и правым нижним углом; тогда вы можете понять уровень масштабирования, проверив расстояние (если расстояние слишком велико, уровень масштабирования будет низким), тогда вы можете выбрать режим, используя метод setbound или setZoom.
источник
Я не люблю предлагать это, но если вы должны попробовать - сначала позвоните
gmap.fitBounds(bounds);
Затем создайте новый Thread / AsyncTask, оставьте его спать на 20-50 мс или около того, а затем вызовите
gmap.setZoom( Math.max(6, gmap.getZoom()) );
из потока пользовательского интерфейса (используйте обработчик или
onPostExecute
метод AsyncTask).Я не знаю, работает ли это, просто предложение. Кроме этого вам нужно как-то самостоятельно рассчитать уровень масштабирования по вашим точкам, проверить, не слишком ли он низкий, исправить его, а затем просто позвонить.
gmap.setZoom(correctedZoom)
источник
Если «bounds_changed» не запускается корректно (иногда Google, похоже, не совсем правильно принимает координаты), вместо этого рассмотрите возможность использования «center_changed».
Событие center_changed срабатывает каждый раз, когда вызывается fitBounds (), хотя оно запускается сразу и не обязательно после перемещения карты.
В обычных случаях 'idle' по-прежнему лучший слушатель событий, но это может помочь паре людей, сталкивающихся со странными проблемами с их вызовами fitBounds ().
Смотрите Google Maps FitBounds обратный вызов
источник
Чтобы присоединиться к другому решению - я обнаружил, что подход «прослушать событие bounds_changed и затем установить новый масштаб» не работает для меня надежно. Я думаю, что я иногда звонил
fitBounds
до того, как карта была полностью инициализирована, и инициализация вызывала событие bounds_changed, которое использовало бы слушателя доfitBounds
изменения границ и уровня масштабирования. Я закончил с этим кодом, который, кажется, работает до сих пор:источник
Для меня самым простым решением было следующее:
источник
источник
Все, что я сделал, это:
И это работает на V3 API.
источник