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 提供的各類空間來實現功能,因此需要有在開發機上需要安裝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();
}
}