在地图上用鼠标点击某处,可以得到其在数据库的信息,并将其显示出来.我自定义的工具按钮消息,m_CurrentOperation表示当前执行哪项操作,这里我取150,可以随便取,只要能标记就行.
if(m_CurrentOperation==150&&Button==1)
{
CMoLayers layers(m_map.GetLayers()); ///获得所有图层
for(short i=0;i<layers.GetCount();i++)
{
CMoMapLayer layer;
layer.AttachDispatch(layers.Item(COleVariant(i)));//获得某个图层
CMoPoint pt(m_map.ToMapPoint((float)X,(float)Y));//将屏幕坐标转换成地图坐标
//以下几行为获得所点击点为中心的矩形
CMoRectangle select_Rect;
if(!select_Rect.CreateDispatch("MapObjects2.Rectangle"))
return ;
double x=pt.GetX();
double y=pt.GetY();
CMoRectangle rect_Extent(m_map.GetExtent());
double X_Scale,Y_Scale;
X_Scale=rect_Extent.GetHeight()/m_map.GetFullExtent().GetHeight();
Y_Scale=rect_Extent.GetWidth()/m_map.GetFullExtent().GetWidth();
double m_Scale=X_Scale;
if(X_Scale>Y_Scale)
m_Scale=Y_Scale;
//以下系数中0.01可能根据地图比例自己调,我以前不知这是什么意思
//弄了好半天才明白,这个系数可以确定范围
select_Rect.SetBottom(y-0.01*m_Scale);
select_Rect.SetTop(y+0.01*m_Scale);
select_Rect.SetLeft(x-0.01*m_Scale);
select_Rect.SetRight(x+0.01*m_Scale);
//由查询范围选取目标,下面有个数字6,改成5能用,改成其它不能用,不知为什么
CMoRecordset m_SelectedRecSet=layer.SearchShape(select_Rect,6,"");
m_SelectedRecSet.MoveFirst();
//得到选取目标的属性信息
CMoTableDesc tableDesc(m_SelectedRecSet.GetTableDesc());
CMoFields ShapFields(m_SelectedRecSet.GetFields());//获取数据域
CMoField ShapeField;
CString resultStr;
//将些数据域中所有信息显示出来
for(int j=0;j<tableDesc.GetFieldCount();j++)
{
CString name=tableDesc.GetFieldName(j);
ShapeField=ShapFields.Item(COleVariant(TEXT(name)));
CString value=ShapeField.GetValueAsString();
resultStr=resultStr+name+":"+value+"/n";
}
MessageBox(resultStr);
}