像 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();
}
}
}