Предел arcgis .net SDK 100.1 уровней масштабирования
Я использую ArcGIS Runtime SDK 100.1.0 для.NET. У меня есть векторная карта пакета мобильной карты (.mmpk), и я хочу ограничить максимальное и минимальное увеличение в MapView. Я попытался отследить свойство MapScale и установить его:
((INotifyPropertyChanged)MyMapView).PropertyChanged += (sender, args) =>
{
args.PropertyName;
var s = MyMapView.MapScale;
if(s < 500)
MyMapView.SetViewpointScaleAsync(700);
if (s > 16500000)
MyMapView.SetViewpointScaleAsync(16500000);
};
Это работает, но карта дергается при низких / высоких уровнях масштабирования, потому что она пытается сгладить масштабирование, и я не могу понять, как остановить активную задачу масштабирования. Как правильно это сделать?
2 ответа
Легкий способ
Если вы просто хотите установить минимальный масштаб и максимальный масштаб, Map
класс имеет MinScale
а также MaxScale
свойства. Замените ваш код следующим:
MyMapView.Map.MaxScale = 700;
MyMapView.Map.MinScale = 16500000;
Трудный путь
Вам, вероятно, это не нужно! Используйте простой способ, указанный выше, если у вас нет веских причин делать что-то более сложное!
Если вместо этого по какой-то причине вы действительно хотите отслеживать изменения масштаба, а затем изменять масштаб самостоятельно, вам следует сделать это по-другому. В настоящее время вы слушаете PropertyChanged
, который слишком широк. Одним из эффектов является то, что при изменении масштаба запускается ваш обработчик событий, который выполняет асинхронное масштабирование, которое генерирует изменение масштаба до его завершения, который вызывает ваш обработчик событий, который выполняет асинхронное масштабирование, которое генерирует изменение масштаба до его завершения, который вызывает ваш обработчик событий, который... я мог бы продолжать и продолжать. В прямом смысле. Как и ваша программа, если вы не внесете некоторые изменения.
Вот один из способов сделать это:
// Save a variable so you can invoke the EventHandler elsewhere
EventHandler navigationCompletedHandler = (sender, args) =>
{
var s = MyMapView.MapScale;
if (s < 500)
MyMapView.SetViewpointScaleAsync(700);
if (s > 16500000)
MyMapView.SetViewpointScaleAsync(16500000);
};
MyMapView.NavigationCompleted += navigationCompletedHandler;
// Invoke the above handler one time when the map first loads
EventHandler firstViewpointChangeHandler = null;
firstViewpointChangeHandler = (sender, args) =>
{
if (!double.IsNaN(MyMapView.MapScale))
{
MyMapView.ViewpointChanged -= firstViewpointChangeHandler;
navigationCompletedHandler.Invoke(null, null);
}
};
MyMapView.ViewpointChanged += firstViewpointChangeHandler;
Вы можете просто установить уровни масштабирования на любые интервалы, которые вы хотите в ArcMap для своего файла карты, когда вы создаете пакет карты или публикуете его в сервисе, ArcMap, кажется, соблюдает его (по крайней мере, для меня).
Раскрывающийся масштаб карты -> Настроить этот список -> Стандартные весы -> Установите флажок "Отображать только эти масштабы при масштабировании"
Сохраняет необходимость писать пользовательский обработчик событий mapscale.