在MAXP应用程序开发中,最基本的一个功能是在地图上显示一个目标,这个目标一般用一个符号表示,在地图上表示为一个图标。
CMapXFeatureFactory FeaFac;
CMapXLayer Layer;
CMapXFeature Feature;
CMapXStyle Style;
double centerX,centerY; //得到地图的中心
centerX = m_ctrlMapX.GetCenterX();
centerY = m_ctrlMapX.GetCenterY();
// 判断是否存在tempLayer图层
CMapXLayers layers=m_ctrlMapX.GetLayers();
BOOL Flag = FALSE;
for(int i=0;i<layers.GetCount();i++)
{
Layer=layers.Item(i+1);
if(Layer.GetName()=="tempLayer")
{
Flag=true;
break;
}
}
//没有tempLayer图层,就新建
if (Flag==false)
{
CMapXLayer lyr=m_ctrlMapX.GetLayers().CreateLayer("tempLayer");
m_ctrlMapX.GetLayers().SetAnimationLayer(lyr); //设为动态图层
}
Layer=m_ctrlMapX.GetLayers().Item("tempLayer");
FeaFac=m_ctrlMapX.GetFeatureFactory();
//加点
centerX = ((long)centerX + rand() % 20)%90;
centerY = ((long)centerY + rand() % 20)%90;
//判断边界,如果超出范围,则移动
if ((m_pRect.GetXMax() < centerX )
|| (m_pRect.GetXMin() > centerX )
|| (m_pRect.GetYMax() < centerY )
|| (m_pRect.GetYMax() < centerY ))
{
m_ctrlMapX.ZoomTo(m_dCurZoom, centerX, centerY);
ATLTRACE("移动位置\n");
}
//
try
{
Feature = FeaFac.CreateSymbol(); //添加符号
Style=Feature.GetStyle();
Style.SetSymbolType(miSymbolTypeBitmap);
Style.SetSymbolBitmapName("CAUT1-32.BMP");
Style.SetSymbolBitmapSize(16);
Style.SetSymbolBitmapTransparent(TRUE);
Feature.SetStyle(Style.m_lpDispatch);
Feature.GetPoint().Set(centerX, centerY);
iCount = Layer.AllFeatures().GetCount();
for (int i = 0; i < Layer.AllFeatures().GetCount(); i++)
{
Layer.DeleteFeature(Layer.AllFeatures().Item(Layer.AllFeatures().GetCount()).GetFeatureID());
iCount = Layer.AllFeatures().GetCount();
}
Layer.AddFeature(Feature); //加入Feature
Layer.Refresh(); //更新图层
}
在地图视图位置改变时,会触发一个事件,我们通过该事件,获取目前边界范围
BOOL CMapView::OnMapViewChanged()
{
m_dPrevZoom = m_dCurZoom;
m_dPrevX = m_dCurX;
m_dPrevY = m_dCurY;
try
{
m_dCurZoom = m_ctrlMapX.GetZoom();
m_dCurX = m_ctrlMapX.GetCenterX();
m_dCurY = m_ctrlMapX.GetCenterY();
m_pRect = m_ctrlMapX.GetBounds(); //获取边界
}
catch (COleDispatchException *e) {
e->ReportError();
e->Delete();
}
catch (COleException *e) {
e->ReportError();
e->Delete();
}
return TRUE;
}
在设置符号的时候,判断坐标的位置,是否在边界内,如果在边界内,就直接显示符号,否则,我们要移动地图的位置,以便能在可视范围内看见图标。