问题描述
我需要根据数据库的更新来刷新地图上点的位置,之前跌跌撞撞的也算是实现了点的显示,但现在又搞不下去了。因为一直没搞懂DataSets和BindLayer怎么用,所以只能是通过Layers.CreateLayer和Layers._item().AddFeature()来实现点的描绘。现在需要比对数据库,将位置发生变化的点画在新位置,并删掉旧位置上的点。我设置了一个Refresh按钮,代码如下:void_fastcallTForm1::Button6Click(TObject*Sender){double*tmp_long=newdouble[1000];double*tmp_lat=newdouble[1000];longinttmp_ID=0;inti,j;ADODataSet1->Active=false;ADODataSet1->CommandText="select*fromMyTab";ADODataSet1->Active=true;ADODataSet1->First();CMapXFeature*fNewSymbol;CMapXPointDisppt;CMapXStyleDispstyle;pt.Bind(StrignToOleStr("MapX.Point.5"));style.Bind(StrignToOleStr("MapX.Style.5"));style=Map1->DefaultStyle;fNewSymbol=NULL;fNewSymaol=Map1->FeatureFactory->CreatSymbol(EmptyParam,EmptyParam);for(i=0;i<count;i++)//count为数据库中的记录条数,全局变量{tmp_ID=ADODataSet1->FieldByName("ID")->AsInteger;tmp_long[i]=ADODataSet1->FieldByName("longitude")->AsFloat;tmp_lat[i]=ADODataSet1->FieldByName("latitude")->AsFloat;ADODataSet1->Next();for(j=0;j<count;j++){if(ID[j]==tmp_ID)//以下的ID,longitude[],latitude[]为数据库发生变化前的值,均为//全局变量我想通过ID来比对同一个点是否发生位置变化{if((longitude[j]!=tmp_long[i])||(latitude[j]!=tmp_lat[i])){pt->Set(longitude[j],latitude[j]);fNewSymbol->Set_Point(pt);fNewSymbol->Set_Style(style);AnsiStringstr=fNewSymbol->FeatureKey;Map1->Layers->_Item(Variant(1))->DeleteFeature(Variant(str));//_Item()为Layers.CreateLayer的一个临时图层,我想通过重新指定点//然后删除,可是运行时这里会报错。(编译已通过)pt->Set(tmp_long[i],tmp_lat[i]);fNewSymbol->Set_Point(pt);fNewSymbol->Set_Style(style);AnsiStringstr=fNewSymbol->FeatureKey;Map1->Layers->_Item(Variant(1))->AddFeature(Variant(str));}}}}}纯粹赶鸭子上架,BCB下的MapX编程确实用得人比较少,不过和其他语言的思路应该都一样,请熟悉的人教教,感谢。另外,当点比较多的时候画点比较慢,有什么办法可以提高速度