如何在地图范围中包含绘图图层

时间:2014-02-04 14:50:29

标签: c# .net dotspatial

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

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

我已经尝试确定所需的总范围,并将ViewExtents映射到此值,但它似乎不起作用:

         var mapsMaxExtent = _mapControl.GetMaxExtent();

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

        _mapControl.ViewExtents = mapsMaxExtent;

2 个答案:

答案 0 :(得分:1)

将图层添加到普通图层(如建议的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();
        }
    }
}

答案 1 :(得分: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);