0

我已将 MapPointLayer 添加到 DotSpatial 地图,以便我可以通过更新其功能集中的单个功能在地图上绘制车辆位置。

当用户随后添加另一个图层(例如形状文件)时,我会重置地图并缩放至其完整范围。我遇到的问题是,发生这种情况时似乎没有考虑到绘图图层,如果绘图图层功能位于加载图层之外,则它不会显示在屏幕上。

我试图确定所需的总范围并将地图 ViewExtents 设置为此值,但它似乎不起作用:

         var mapsMaxExtent = _mapControl.GetMaxExtent();

        _mapControl.MapFrame.DrawingLayers.ForEach(layer => mapsMaxExtent.ExpandToInclude(layer.Extent));

        _mapControl.ViewExtents = mapsMaxExtent;
4

2 回答 2

2

像 gouldos 建议的那样将图层添加到普通图层也会​​使图层出现在图例中,这可能是您不想要的,并且将其添加到绘图图层也不是一个好主意,因为现在您要绘制两次。

您可能希望采用简单计算组合范围的方法,使用 ExpandToInclude 方法扩展图层范围以包含新点。下面的示例代码对我有用。这实际上是一个技巧,而不是看起来像地图的 ViewExtent 的简单设置。例如,如果您只是抓取地图的范围或定义自定义范围,这将不起作用。请注意,我非常特别地抓住了图层的范围,而不是创建副本或任何东西。当我调用 ExpandToInclude 时,我实际上使图层的范围更大。通过这种方式,之后地图很乐意接受缩放到包含您的新点的视图。不利的一面是,如果您将来尝试缩放到该图层,您将获得组合范围。

可能最好的解决方案是添加一个可以覆盖整个范围的背景层​​。它甚至可以是设置为您需要的全部范围的白色图像图层,或者是您添加到 MapLayer 的点图层,它仅具有最小和最大点或其他内容。但这也可能有点奇怪。

至于为什么不能缩放到加载图层范围之外的点,我不知道。这一定是最近添加的一些功能的结果,因为它曾经没有这个问题。可能可以禁用此“功能”,但我不确定如何禁用。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using DotSpatial.Controls;
using DotSpatial.Data;
using DotSpatial.Topology;

namespace WindowsFormsApplication4
{
    public partial class Form1 : Form
    {
        private Extent env;
        IMapLayer layer;
        public Form1()
        {
            InitializeComponent();
        }

        private void buttonOpen_Click(object sender, EventArgs e)
        {
            layer = map1.AddLayer();
        }

        private void buttonZoomToPoints_Click(object sender, EventArgs e)
        {
            Extent ext = layer.Extent;
            ext.ExpandToInclude(env);
            map1.ViewExtents = ext;
        }

        private void addLayer_Click(object sender, EventArgs e)
        {
            // Add
            Coordinate c = new Coordinate(1, 1);
            Coordinate c1 = new Coordinate(2, 2);
            FeatureSet fs = new FeatureSet(FeatureType.Point);
            fs.AddFeature(new DotSpatial.Topology.Point(c));
            fs.AddFeature(new DotSpatial.Topology.Point(c1));
            env = fs.Extent;
            MapPointLayer layer = new MapPointLayer(fs);
            map1.MapFrame.DrawingLayers.Add(layer);
            map1.Refresh();
        }
    }
}
于 2014-02-07T23:33:31.967 回答
0

不确定这是否是应该使用的预期方式,但通过将绘图层添加到地图主层集合中,这似乎主要解决了这个问题。唯一的另一个问题是,当图层没有数据时,它似乎默认为不理想的最大尺寸。

  var featureSet = new FeatureSet(FeatureType.Point);

  var mapLayer = new MapPointLayer(_featureSet) {Projection = _mapControl.Projection};

  // add to drawing layers so is superimposed on top of all other layers
  _mapControl.MapFrame.DrawingLayers.Add(_mapLayer );

  // need to add to main layer collection too so that it gets taken into account when zooming to full extent
  _mapControl.Layers.Add(_mapLayer);
于 2014-02-05T09:47:09.733 回答