MapObject控件使用之图层制作
作者:张松伟
有些时候将一些固定的数据制作成图层,可以提高程序的速度,而且使用方便。下面我就将对图层的制作方法进行一下简单的说明。
假设我们要将一些经纬度坐标用点的方式画在地图上,那么我们首先要有保存经纬度坐标的数组:m_LonArray, m_LatArray,均为CArray<float,float>型。然后我们在CMyView中增加一些成员变量:
CmoDataConnection pMoCon;
CMoTableDesc desc;
CMoMapLayer layer;
CMoPoint m_point;
好了,是为创建新图层增加一个函数的时候了,在视图类中增加函数:CreateNewLayer()。
BOOL CMyView:: CreateNewLayer ()
{
if (!pMoCon.CreateDispatch(TEXT("MapObjects2.DataConnection")))
return FALSE;
if(!desc.CreateDispatch("MapObjects2.TableDesc"))
return FALSE;
VARIANT vt;
vt.vt = VT_BOOL;
vt.boolVal = VARIANT_FALSE;
pMoCon.SetDatabase((LPCTSTR)"E:\\Demo\\经纬度层"); //设置图层保存目录
if(!pMoCon.Connect())
return FALSE;
//设置图层的字段个数及属性,这里设置两个,一个为Number,一个为Name。表示点的号码及名称。
desc.SetFieldCount(2);
desc.SetFieldType(0,moString);
desc.SetFieldName(0,"Number");
desc.SetFieldLength(0,10);
desc.SetFieldType(1,moString);
desc.SetFieldName(1, "Name");
desc.SetFieldLength(1, 10);
//创建新图层,设置名称、类型及字段。
CmoGeoDataSet geoDataset(pMoCon.AddGeoDataset(“经纬度层”, moShapeTypePoint,
(LPDISPATCH)desc, vt, vt);
if (!layer.CreateDispatch(TEXT("MapObjects2.MapLayer")))
return FALSE;
//设置图层的记录集
layer.SetGeoDataset(geoDataset);
CMoRecordset recs(layer.GetRecords());
CMoFields fields(recs.GetFields());
for(int i=0; i<m_LonArray.GetSize(); i++)
{
recs.AddNew();
m_point.SetX(m_ LonArray.GetAt(i));
m_point.SetY(m_ LatArray.GetAt(i));
SetValue(fields, "Shape",m_point);
SetValue(fields, "Number",m_Number.GetAt(i));//需定义CStringArray m_Number
SetValue(fields, "Name", m_Chname.GetAt(i));//需定义CStrignArray m_Name
recs.Update();
}
//设置点的颜色,并加入地图。
layer.GetSymbol().SetColor(moLightYellow);
CMoLayers layers(m_map.GetLayers());
layers.Add(layer);
return TRUE;
}
好了,调用一下试试效果吧。
本人水平用限,欢迎大家批评指正。