iobject c++在打开的服务地图上添加自定义图片 [已关闭]

0 投票

使用产品:supermap-iobjectscpp-10.0.0-17726-74479 操作系统:win7 x64 -vs2015
数据类型: 服务和文件
问题详细描述:使用idesktop制作的点符号库(MarkerLibrary.sym),在地文件数据源地图上加点可以显示自定义的图片,在服务数据源地图显示不了,显示还是默认点。
问题重现步骤: 

1、代开数据源

m_pWorkspace = new UGWorkspace();
#if 0
    UGWorkspaceConnection  *info = new UGWorkspaceConnection();
    UGString str = _U("D:\\data\\World.smwu");
    info->m_strServer = str;
    info->m_nWorkspaceType = 9;
    bool isss = false;
    isss = m_pWorkspace->Open(*info);
#else
    UGDsConnection dcon;
    //UGString dataSourceName = _U("http://support.supermap.com.cn:8090/iserver/services/map-china400/rest/maps/China");
    UGString dataSourceName = _U("http://support.supermap.com.cn:8090/iserver/services/map-ChinaProvinces/rest/maps/ChinaProvinces");
    dcon.m_nType = UGEngineType::Rest;
    dcon.m_strAlias = _U("China");
    dcon.m_strServer = dataSourceName;
    UGDataSource* pDataSourc = m_pWorkspace->OpenDataSource(dcon);
    if (pDataSourc == NULL)
    {
        MessageBox("打开web地图失败", "提示", 0);
    }
    UGDataset *dataset = pDataSourc->GetDataset(0);
    if (dataset == NULL)
    {
        MessageBox("打开web地图数据源失败", "提示", 0);
    }
#endif // 0

2、加载点符号库
    string strMarkLib;
    CCSGlobalMethod::GetConfigurationDirPath(strMarkLib);
    strMarkLib += CS_FILE_MARKERLIBRARY; //CS_FILE_MARKERLIBRARY="MarkerLibrary.sym"
    UGString strLib;
    strLib.FromStd(strMarkLib);
    UGMarkerSymbolLib *ds = m_pWorkspace->m_Resources.GetMarkerSymbolLib();
    UGbool isd = ds->LoadFromFile(strLib);

3、地图添加点,(根据传入的图片路径,解析文件名,在点符号库中寻找图片的ID)

CString CSuperMapCtrl::AddBmp(TPoint pt, LPCTSTR lpszBmpPath, double size /* = 30 */)
{
    //获取当前符号库
    UGMarkerSymbolLib *ds = m_pWorkspace->m_Resources.GetMarkerSymbolLib();
    //解析图片路径获取图片名
    char szFileName[256] = { 0 };
    CR_OS::pathname_to_noextname(szFileName, lpszBmpPath);
    string path = szFileName;
    UGString ufilename;
    ufilename.FromMBString(path);
    //根据图片名获取符号库id
    int id = ds->FindName(ufilename);
    UGPoint2D pt2D = UGPoint2D(pt.x, pt.y);
    UGGeoPoint *pUGpoint = new UGGeoPoint();
    pUGpoint->SetPoint(pt2D);
    pUGpoint->SetID(m_nId++);
    UGStyle style;
    style.SetMarkerStyle(id+1);    //自制符号的id
    style.SetMarkerSize(1);        //点大小,5
    style.SetMarkerHeight(10);            // 设置符号高度
    style.SetMarkerWidth(10);            // 设置符号宽
    pUGpoint->SetStyle(&style);

    CString scTag = MakeUsableIndex(OIT_Bmp);
    UGString suTag;
    suTag.FromStd(scTag.GetBuffer());
    m_pMapWnd->m_mapWnd.m_Map.m_TrackingLayer.Add(pUGpoint, suTag);
    UGC::UGTextStyle tStyle;
    tStyle.SetForeColor(UGRGB(255, 0, 0));
    tStyle.SetBold(true);
    tStyle.SetAlign(4);
    tStyle.SetHeight(5);
    tStyle.SetFixedSize(true);
    m_pMapWnd->m_mapWnd.m_Map.m_TrackingLayer.AddLabel(_U("xxx"), tStyle);
    m_pMapWnd->m_mapWnd.m_Map.SetRefreshFlag(false);
    m_pMapWnd->SendInvalidateFunc();

    delete pUGpoint;
    pUGpoint = NULL;

    m_pMapWnd->SetCenter(pt2D);
    m_pMapWnd->SetScale(500);

    return scTag;
}

4、本地文件数据可以显示自定义图片,使用服务数据源不行。

1)本地

2)服务

5、问题:

1)服务数据源怎么显示自定义图标(跟踪层)?

2)就是添加点的名称文字,怎么实现,我现在是用UGGeoText ,使用点的gps坐标转桌面坐标偏移图片大小再转gps来显示,这个出现的问题就是缩放时,点与文字间距效果很差,有没有其他方式?

3)点或文字的点击事件怎么实现?

4)程序每次运行一段时间就自动崩溃图片如下vs使用的是2015:

5)supermap mfc c++开发资料太少了,没啥demo,全是c#、java,c++的太少, 给的help 程序员参考API全是说明没有一个使用用例,跟看头文件有啥区别!(吐槽下)

问题关闭原因: 已解决
7月 18 分类:  53次浏览 | 用户: cy273x (2 分)
已关闭 7月 22 用户:cy273x

1个回答

0 投票
1、服务数据源怎么显示自定义图标(跟踪层)?这个测试是没有问题的呢,不管是本地还是打开的web服务地图,都是可以正常添加点到跟踪图层的,你设置符号之前,跟踪代码检查是否存在当前设置的符号id。

2、就是添加点的名称文字,如果是想添加到跟踪图层的话,就只能用geotext的方法,如果数据不是太频繁的变化,可以将点放到点数据集,然后用标签专题图去显示文字;

3、点或文字的点击事件怎么实现?如果是普通数据集图层,在map中有对象选中事件,如果是跟踪图层的话,就需要用鼠标点击事件,然后通过UGTrackingLayer中的HitTest去判断是否有选中对象,然后做接下来的操作。

4、查看是否对象使用后,不用的时候窦进行释放内存,几何对象、ugrecordset都需要及时的释放
7月 20 用户: 程逸诗 名扬四海 (2,842 分)

1、本地可以,web服务不行,跟踪代码如下:当前符号id返回1存在的,还是不行,2.3是否有相关demo,4,我检查下,

4)vs2015异常问题,在FQA里面下载的CMapShow功能,使用vs2015,编译,使用iobject10 的库和dll,也复现了这个问题,如下所示:我的工程只显示地图不添加任何元素,应该非内存释放问题。-----备注(Release编译暂未复现这个问题,应该是debug库哪有问题,可用就可以了。)

刚电话了技术支持,对比了下本地地图与服务地图UGWorkspace创建过程,打开服务地图比打开本地地图少了m_pMapWnd->m_mapWnd.m_Map.SetWorkspace(m_pWorkspace);,添加后服务地图可以显示自定义图片,在此感谢。
好的,可以了就好
谢谢支持
...