全图
public void Extend(PictureBox m_PictureBox)
{
try
{
String m_sDataFrame = map.DefaultMapName;
ESRI.ArcGIS.Carto.IMapServerInfo mapi = map.GetServerInfo(m_sDataFrame);
ESRI.ArcGIS.Carto.IMapDescription pMapDescription;
pMapDescription = mapi.DefaultMapDescription;
IMapArea ma = pMapDescription.MapArea;
IMapExtent pMapExtent = ma as IMapExtent;
pMapExtent.Extent = mapi.FullExtent ;
pMapDescription.MapArea = ma;
// save the map description and draw the map
m_sMapDesc = pMapDescription;
drawMap(ref pMapDescription, m_PictureBox);
}
catch (Exception exception)
{
MessageBox.Show(exception.Message, "An error has occurred");
}
}
放大操作的基本原理是取得mapserver服务器该地图的FullExtent,然后将其转换提交服务器,取得图形进行显示。
鹰眼操作
由于在实际使用过程中。有很多针对地图的操作需要在鹰眼上来实现,所以在本实例中添加了鹰眼点击漫游的功能:具体实现代码如下:
待加
图层操作
以下是针对图层设置其是否显示的代码,这些代码可以结合treeview控件来实现对地图图层的整体控制功能:
public void setLayerVisible(int LayerId, PictureBox PictureBox, Boolean m_bVisible)
{
String m_sDataFrame = map.DefaultMapName;
ESRI.ArcGIS.Carto.IMapDescription pMapDescription;
ESRI.ArcGIS.Carto.IMapServerInfo mapi = map.GetServerInfo(m_sDataFrame);
pMapDescription = m_sMapDesc;
int m_layerCount = mapi.MapLayerInfos.Count;
for (int i = 0; i < m_layerCount; i++)
{
if (pMapDescription.LayerDescriptions.get_Element(i).ID == LayerId)
{
pMapDescription.LayerDescriptions.get_Element(i).Visible = m_bVisible;
i = m_layerCount;
}
}
m_sMapDesc = pMapDescription;
drawMap(ref pMapDescription, PictureBox);
}
public void setLayerVisible(String LayerName, PictureBox PictureBox, Boolean m_bVisible)
{
String m_sDataFrame = map.DefaultMapName;
ESRI.ArcGIS.Carto.IMapDescription pMapDescription;
ESRI.ArcGIS.Carto.IMapServerInfo mapi = map.GetServerInfo(m_sDataFrame);
pMapDescription = m_sMapDesc;
int m_layerCount = mapi.MapLayerInfos.Count;
for (int i = 0; i < m_layerCount; i++)
{
if (mapi.MapLayerInfos.get_Element(i).Name == LayerName)
{
pMapDescription.LayerDescriptions.get_Element(i).Visible = m_bVisible;
i = m_layerCount;
}
}
m_sMapDesc = pMapDescription;
drawMap(ref pMapDescription, PictureBox);
}
查询
待加
查询定位
待加
ArcGis Engine
环境需要
ArcGis Engine开发方式主要是使用ArcGis Engine 提供的各类空间来实现功能,因此需要有在开发机上需要安装Visual Studio 2005软件开发平台和ArcGis Engine开发支持库。
流程描述
ArcGis Engine的基本开发方式是首先在窗体上添加一个ArcGis控件AxMapControl。在程序中控制AxMapControl控件打开mxd文件,从而根据该文件内数据来源设置获取GIS空间数据,并在控件中显示。该AxMapControl控件中包含了Gis空间数据的众多设置,包括有多少个图层、图层的名称,放大、缩小操作接口等等。如果需要对矢量数据进行操作和浏览的时候,只需要针对AxMapControl控件内的相关内容进行设置并刷新便可以实现。
开发步骤
打开VS2005,新建一个工程。在工程建立完毕以后,为窗体添加一个AxMapControl控件,如下图:
控件添加完成以后,由于arcGis需要对Engine开发的lisence进行验证,所以必须在工程中添加LicenseControl控件。在添加完认证控件后,需要设置控件读取的地图数据。
点击AxMapControl控件,然后选择属性框中的属性页,系统会弹出控件的属性设置:
点击Layers上的 ,为控件添加初始图层。
选择Server后,添加新的ArcGis Server。选择Local Server或Internet Server,根据服务器的配置进行输入、添加。Server添加成功以后会看到
选择服务器发布的某个地图服务,然后选择Open就完成了设置。
如果需要得到读取的Gis数据有多少个图层,并想使用treeview控件显示出来,可以使用一下代码:
treeView1.Nodes.Clear();
for (int i = 0; i <= axMapControl1.LayerCount - 1; i++)
{
treeView1.Nodes.Add(axMapControl1.get_Layer(i).Name);
treeView1.Nodes[i].Checked = true;
}
这样在程序运行的时候点击打开菜单就能打开一个GIS数据源并进行浏览。
以上只是实现了数据的浏览,如果要对地图实现放大、缩小、平移等操作还需要在代码中进行设置。
ArcGis Engine提供了丰富的地图操作控件能够方便的实现以上基本的地图操作,例如ToolBarControl便能方便的在工具栏中添加ArcGis预设置的多个控件。在这里我将对如何使用代码来实现简单的地图操作进行介绍。
在工具栏的放大按钮代码中添加以下代码便能按比例的实现地图的放大:
ESRI.ArcGIS.Geometry.IEnvelope pEnvelope = axMapControl1.Extent;
double eWidth = Math.Abs(pEnvelope.XMax - pEnvelope.XMin);
double eHeight = Math.Abs(pEnvelope.YMax - pEnvelope.YMin);
double xFactor = (eWidth - (eWidth * 0.75)) / 2;
double yFactor = (eHeight - (eHeight * 0.75)) / 2;
pEnvelope.XMax = pEnvelope.XMax - xFactor;
pEnvelope.XMin = pEnvelope.XMin + xFactor;
pEnvelope.YMax = pEnvelope.YMax - yFactor;
pEnvelope.YMin = pEnvelope.YMin + yFactor;
axMapControl1.Extent = pEnvelope;
缩小:
ESRI.ArcGIS.Geometry.IEnvelope pEnvelope = axMapControl1.Extent;
double eWidth = Math.Abs(pEnvelope.XMax - pEnvelope.XMin);
double eHeight = Math.Abs(pEnvelope.YMax - pEnvelope.YMin);
double xFactor = ((eWidth * 1.25) - eWidth) / 2;
double yFactor = ((eHeight * 1.25) - eHeight) / 2;
pEnvelope.XMax = pEnvelope.XMax + xFactor;
pEnvelope.XMin = pEnvelope.XMin - xFactor;
pEnvelope.YMax = pEnvelope.YMax + yFactor;
pEnvelope.YMin = pEnvelope.YMin - yFactor;
axMapControl1.Extent = pEnvelope;
平移操作:
axMapControl1.Pan();
全图:
axMapControl1.Extent = axMapControl1.FullExtent;
图层操作:
private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
if ((e.Node.Checked == false)&&(axMapControl1.get_Layer(e.Node.Index).Visible==true ))
{
axMapControl1.get_Layer(e.Node.Index).Visible=false ;
axMapControl1.Refresh();
// axMapControl1.
}
if ((e.Node.Checked ==true ) && (axMapControl1.get_Layer(e.Node.Index).Visible==false ))
{
axMapControl1.get_Layer(e.Node.Index).Visible = true ;
axMapControl1.Refresh();
}
}