实现思路:
1.通过mapControl加载本地地图;
2.传参map给LayoutControl;
3.制图页面对地图进行展示;
可能遇到的问题:
在这个过程中最容易出现问题的是对地图的展示,明明设置了地图名称,为什么就是展示不出来呢,有可能地图的名称设置的不对,为如何防止此类事情的发生?
解决方式:
(1)将地图转成xml添加到工作空间中;
(2)再加载地图;
核心代码如下:
//m_workspace 工作空间
m_workspace.Maps.Add("tem", m_map.ToXML());
InitializeLayout("tem");//对地图初始化,在下面能找到具体的实现方式
附送工程的github地址:https://github.com/voyagexiang/MapControl2LayoutControl.git
下面是整个思路的实现:
1.打开地图
using SuperMap.Data;
using SuperMap.UI;
using System;
using System.Diagnostics;
using System.Windows.Forms;
namespace MapTLayout
{
public partial class mainForm : Form
{
private Workspace m_workspace;
private MapControl m_mapControl;
public mainForm()
{
try
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;
this.m_workspace = new Workspace(this.components);
this.m_mapControl = new MapControl();
m_mapControl.Dock = DockStyle.Fill;
m_mapControl.Map.Workspace = m_workspace;
Initialize();
base.Controls.Add(m_mapControl);
base.Controls.SetChildIndex(m_mapControl, 0);
m_mapControl.Map.ViewEntire();
}
catch (Exception ex)
{
Trace.WriteLine(ex.Message);
}
}
/// <summary>
/// 打开需要的工作空间文件及地图
/// Open the workspace and the map
/// </summary>
private void Initialize()
{
try
{
// 打开工作空间及地图
// Open the workspace and the map
String filePath = "D:\\SampleData\\ThematicMaps\\Thematicmaps.smwu";
WorkspaceConnectionInfo conInfo = new WorkspaceConnectionInfo(filePath);
m_workspace.Open(conInfo);
if (SuperMap.Data.Environment.CurrentCulture != "zh-CN")
{
m_mapControl.Map.Open("Beijing-Tianjin Area Division Map");
}
else
{
m_mapControl.Map.Open("京津地区地图");
}
// 调整mapControl的状态
// Adjust the condition of mapControl
m_mapControl.Action = SuperMap.UI.Action.Pan;
m_mapControl.IsWaitCursorEnabled = false;
}
catch (Exception ex)
{
Trace.WriteLine(ex.Message);
}
}
private void buttonLayout_Click(object sender, EventArgs e)
{
FormLayout formLayout = new FormLayout(m_mapControl.Map);
formLayout.ShowDialog();
}
}
}
2.制图页面展示地图
using SuperMap.Data;
using SuperMap.Layout;
using SuperMap.Mapping;
using SuperMap.UI;
using System;
using System.Diagnostics;
using System.Windows.Forms;
namespace MapTLayout
{
public partial class FormLayout : Form
{
private Workspace m_workspace;
private Map m_map;
private int m_mapID;
public FormLayout(Map map)
{
InitializeComponent();
m_workspace = map.Workspace;
m_map = map;
m_mapLayoutControl = new MapLayoutControl();
base.Controls.Add(m_mapLayoutControl);
base.Controls.SetChildIndex(m_mapLayoutControl, 0);
m_mapLayoutControl.Dock = DockStyle.Fill;
m_mapLayoutControl.MapLayout.Workspace = m_workspace;
m_mapLayoutControl.IsHorizontalScrollbarVisible = false;
m_mapLayoutControl.IsVerticalScrollbarVisible = false;
}
private void FormLayout_Load(object sender, EventArgs e)
{
try
{
//初始化展示地图
//这种也可以
//string mapName = m_workspace.Maps[0];
//InitializeLayout(mapName);
//但这种最保险
m_workspace.Maps.Add("tem", m_map.ToXML());
InitializeLayout("tem");
m_mapLayoutControl.ElementAdded += new ElementEventHandler(m_mapLayoutControl_ElementAdded);
m_mapLayoutControl.TrackMode = TrackMode.Edit;
m_mapLayoutControl.MapLayout.Zoom(4);
}
catch (Exception ex)
{
Trace.WriteLine(ex.Message);
}
}
public void InitializeLayout(string mapName)
{
try
{
LayoutElements elements = m_mapLayoutControl.MapLayout.Elements;
// 构造GeoMap
GeoMap geoMap = new GeoMap();
//设置地图名称,在工作空间内的地图
geoMap.MapName = mapName;
// 设置GeoMap对象的外切矩形
Rectangle2D rect = new Rectangle2D(new Point2D(1000, 1300), new Size2D(1500, 1500));
GeoRectangle geoRect = new GeoRectangle(rect, 0);
geoMap.Shape = geoRect;
elements.AddNew(geoMap);
m_mapID = elements.GetID();
}
catch (Exception ex)
{
Trace.WriteLine(ex.Message);
}
}
/// <summary>
/// 对象添加事件
/// Maplayout tracked eventhandle
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void m_mapLayoutControl_ElementAdded(object sender, ElementEventArgs e)
{
try
{
LayoutElements elements = m_mapLayoutControl.MapLayout.Elements;
if (elements.SeekID(e.ID))
{
Geometry gemetry = elements.GetGeometry();
if (gemetry != null)
{
GeoNorthArrow northArrow = gemetry as GeoNorthArrow;
if (northArrow != null)
{
northArrow.BindingGeoMapID = m_mapID;
}
GeoMapScale mapScale = gemetry as GeoMapScale;
if (mapScale != null)
{
mapScale.BindingGeoMapID = m_mapID;
}
elements.SetGeometry(gemetry);
elements.Refresh();
m_mapLayoutControl.MapLayout.Refresh();
}
}
}
catch (Exception ex)
{
Trace.WriteLine(ex.Message);
}
}
}
}