限制 arcgis .net SDK 100.1 缩放级别
Limit arcgis .net SDK 100.1 zoom levels
我正在使用 ArcGIS Runtime SDK 100.1.0 for .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);
};
这有效,但地图在 low/high 缩放级别时会出现抖动,因为它试图平滑缩放,但我不知道如何停止活动的缩放任务。正确的做法是什么?
简单的方法
如果您只想设置最小比例和最大比例,Map
class has MinScale
and 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 中想要的地图文件的任何间隔。 =10=]
地图比例下拉 -> 自定义此列表 -> 标准比例 -> 勾选方框 "Only display these scales when zooming"
不必编写自定义地图比例事件处理程序。
我正在使用 ArcGIS Runtime SDK 100.1.0 for .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);
};
这有效,但地图在 low/high 缩放级别时会出现抖动,因为它试图平滑缩放,但我不知道如何停止活动的缩放任务。正确的做法是什么?
简单的方法
如果您只想设置最小比例和最大比例,Map
class has MinScale
and 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 中想要的地图文件的任何间隔。 =10=]
地图比例下拉 -> 自定义此列表 -> 标准比例 -> 勾选方框 "Only display these scales when zooming"
不必编写自定义地图比例事件处理程序。