首页 / 浏览问题 / 组件GIS / 问题详情
跟踪层刷新内存增加
56EXP 2020年12月29日
我使用超图自带的例子,在跟踪层用100ms的定时器画十个点,在重画新点时,我会删除旧点,而且在界面上也能看到只显示最新点,但是内存就是一直增加,不知道是啥原因

1个回答

用过的对象有及时的释放掉吗,几何对象不用的时候需要dispose释放掉
4,620EXP 2020年12月30日
我new了的对象都delete了,不用的对象我是通过removetag函数删掉的
你将代码贴出来看一下

void MainWindow::test()
{
    QMap<int,UGString>::iterator it;
    for(it=m_Trackstr.begin();it!=m_Trackstr.end();)
    {
        qMapControl->GetMap()->m_TrackingLayer.RemoveTag(it.value());
     //   m_qMapControl->GetMap()->m_TrackingLayer.Remove(it.value());
        it++;
    }
    m_Trackstr.clear();
    UGPoint2D trackGeograph;//地图坐标
    double m_RabarB=30.563;
    double m_RararL=103.479;
    transBLtoGeOGraphic(m_RabarB,m_RararL,trackGeograph);
    UGPoint2D Target2D;
    double R,A;


    UGStyle* pStyle = new UGStyle();
    pStyle->SetMarkerSize(1);//点大小,5
    pStyle->SetLineColor(UGRGB(0,255,0));//设置点颜色为红色
    pStyle->SetMarkerHeight(2);      // 设置符号高度
    pStyle->SetMarkerWidth(1);      // 设置符号宽
    pStyle->SetMarkerSize(2);
    UGGeoPoint *pt = new UGGeoPoint();
    int ilen=10;
    for(int j=0;j<ilen;j++)
    {
        R=30000-incdo*200;
        if(R<0)
        {
            R=30000;
            incdo=0;
        }
        A=45+j*20;
        QString str=QString::number(j+1);//取出批号
        Target2D.x=trackGeograph.x+R*sin(A*(PITD/180));
        Target2D.y=trackGeograph.y+R*cos(A*(PITD/180));
        pt->SetPoint(Target2D);
        UGString Tracktag=Translator::QStr2UGStr("Tracktag"+str);
        m_Trackstr.insert(j+1,Tracktag);
        UGPoint2D qpt1,qpt2,qpt3,qpt4;
        double detal=R/30000.0;
        qpt1=Target2D+UGPoint2D(100*detal,0);
        qpt2=Target2D+UGPoint2D(-100*detal,0);
        qpt3=Target2D+UGPoint2D(0,100*detal);
        qpt4=Target2D+UGPoint2D(0,-100*detal);
        UGGeoLine *pLine =new UGGeoLine();
        UGPoint2Ds *pts1 = new UGPoint2Ds();
        pts1->Add(qpt1);
        pts1->Add(qpt2);
        pLine->AddSub(pts1->GetData(),2);
        pLine->SetStyle(pStyle);
        qMapControl->GetMap()->m_TrackingLayer.Add(pLine, Tracktag);//画点十字
        pts1->RemoveAll();
        pLine->Clear();
        pts1->Add(qpt3);
        pts1->Add(qpt4);
        pLine->AddSub(pts1->GetData(),2);
        pLine->SetStyle(pStyle);
        qMapControl->GetMap()->m_TrackingLayer.Add(pLine, Tracktag);//画点
        delete  pLine;
        pLine=NULL;
        delete  pts1;
        pts1=NULL;

    }
    delete pt;
    pt=NULL;
    delete pStyle;
    pStyle=NULL;
    qMapControl->refreshDynamicLayer();
    incdo++;
}这个函数是用100ms的定时器在调用

void MainWindow::transBLtoGeOGraphic(double B, double L, UGPoint2D &pt)
{
    const UGPrjCoordSys& pSrcPrj= qMapControl->GetMap()->GetPrjCoordSys();
    UGPrjCoordSys* pTargetPrj = new UGPrjCoordSys(4326);//WSG84
    UGRefTranslator* pUGRefTranslator = new UGRefTranslator();

    pUGRefTranslator->SetPrjCoordSysSrc(pSrcPrj);         // 被转换点的坐标系
    pUGRefTranslator->SetPrjCoordSysDes(*pTargetPrj);     // 转换后点的坐标系
    pUGRefTranslator->SetGeoTransMethod(EmGeoTransMethod::MTH_GEOCENTRIC_TRANSLATION); // 转换方法:三参数

    // 转换参数,根据设置的转换方法,有旋转,平移等时设置对应参数,没有需要就创建空对象
    UGGeoTransParams* pTempParams = new UGGeoTransParams();
    pUGRefTranslator->SetGeoTransParams(*pTempParams);
    delete pTempParams;
    pTempParams = NULL;

    // 构造点串, pt为一个屏幕上的点
    UGPoint2D p1;
    p1.x=L;
    p1.y=B;
    UGArray<UGPoint2D> ugArray;
    ugArray.Add(p1);


    int count = ugArray.GetSize();
    UGPoint2D p;
    bool result = pUGRefTranslator->Translate(ugArray.GetData(), 1,false);//监视是否转换成功

    p=ugArray.GetAt(0);
    pt.x=p.x;
    pt.y=p.y;
    delete pTargetPrj;
    pTargetPrj=nullptr;
    delete pUGRefTranslator;
    pUGRefTranslator=nullptr;
}

这是坐标转换

修改一下代码逻辑,改为每次去修改对应点的坐标,不将原来的删除

修改跟踪图层对象代码如下,:

我这几个点只是一个测试,实际中是一个标签下有很多个点,同时有很多个标签,这种情况下我只能根据标签名获取到带有这个标签的所有对象,并不能获取到具体的那个对象。

还有点不明白,一直在跟踪层中添加对象而不删除,内存应该会增加才对
请问一下这种情况下应该怎么解决?
将点按照“tag”+索引的方式去一一对相应上点。后面九中方法不是一直在往跟踪层添加对象,是一致添加的就那几个对象,只是修改了对象的空间位置,但是对象还是原来的对象,内存不会一直增加
我上面那个程序只是测试一下,我实际要完成的功能比如标签1下有很多个点,有1~500个标签,并且在界面上显示的标签可能是1,6,10等等,也有可能是30~200的标签,就是当前显示的标签名是随机的,同时满足某种条件下我要把标签1或者其他的标签下的所有点删除,这样的话如果不删除地图中的对象,我程序运行几个小时后,那地图中的几何对象起码也得有几十万个了
...