首页 / 浏览问题 / 组件GIS / 问题详情
iobject c++导入矢量文件失败
2EXP 2020年09月02日
UGDataExchange data;
	UGDataExchange exchange = UGDataExchange();
	//UGDataSource* ds = pWorkspace->OpenDataSource(Translator::QStr2UGStr(path), Translator::QStr2UGStr(strFileName), UGEngineType::ExtFile);
	UGDataSource* ds = pWorkspace->GetDataSource(0);
	if (!ds)
	{
		QMessageBox::information(NULL, QString::fromLocal8Bit("导入shp"), QString::fromLocal8Bit("导入失败"), QMessageBox::Close, QMessageBox::Close);
		return;
	}
	int issu = exchange.AttachDataSource(ds);
	UGShapeImportParams  importparams = UGShapeImportParams();
	importparams.SetDestDTName(Translator::QStr2UGStr(strFileName));
	importparams.SetFilePathName(Translator::QStr2UGStr(path));
	UGint ii = importparams.GetFileType();
	int ss = UGExchangeParamsManager::IsValidImportParams(ii, importparams);

	UGint issucceed = exchange.Import(importparams);
	if (issucceed == 1)
	{
		QMessageBox::information(NULL, QString::fromLocal8Bit("导入shp"), QString::fromLocal8Bit("导入成功"), QMessageBox::Yes, QMessageBox::Yes);
	}
	else
	{
		QMessageBox::information(NULL, QString::fromLocal8Bit("导入shp"), QString::fromLocal8Bit("导入失败"), QMessageBox::Close, QMessageBox::Close);
	}

 为什么导入矢量文件时import函数的返回值为-1

1个回答

拿你的代码过来测试没有问题,你先用idesktop导入一下你的shp,看看是否能够成功导入
4,620EXP 2020年09月02日
我试了下,用idesktop好像可以成功导入,代码不知道为什么导入失败,还有个问题,按照类似的方法导入tif文件是可以导入成功的,但是为什么在地图里面什么都看不到啊,是还要添加到图层里面吗?
如果还是导入失败的话,看是否方便将数据私发一下,这边用你的数据测试一下。

另外,数据导入只是导入到了数据源,如果需要在地图中查看,是需要将这个导入后的数据添加到地图的,具体的接口代码UGMap.layers.AddDataset
		UGLayer*player = new UGLayer;
		player->SetName(_U("tif"));
		int index=ds->GetDatasetCount();
		UGDataset*data = ds->GetDataset(index - 1);
		UGPrjCoordSys proj = map->GetPrjCoordSys();
		UGPrjCoordSys proj1 = data->GetPrjCoordSys();
		data->SetPrjCoordSys(proj);
		data->SaveInfo();
		player->SetDataset(data);
		map->m_Layers.AddLayer(0,player);
		map->m_Layers.MoveTop(0);
		//UGDrawParamaters* pDrawParam = new UGDrawParamaters(map->GetDrawing()->m_DrawParam);
		//UGRect2D rcBounds = player->GetBounds();
		//player->TranslateFromFlyPrj(pDrawParam, rcBounds);
		mapControl->GetUGMapWnd()->m_mapWnd.m_Map.SetRefreshFlag(true);
		mapControl->GetUGMapWnd()->SendInvalidateFunc();

这个是我把tif文件加入到地图里面的代码,但是在地图里面看不到导入的影像,然后我用idesktop打开的时候会提示:数据坐标系不一致,是否开启动态投影,这个动态投影应该怎么设置?我注释掉的那两行代码打开的话程序会崩溃

//设置地图开启动态投影;

m_pMapControl->GetMapEditWnd()->m_mapWnd.m_Map.SetProjectionOnTheFly(true);

//地图全幅显示;
m_pMapControl->GetMapEditWnd()->m_mapWnd.m_Map.ViewEntire();

并且将数据集添加到地图中是直接使用的:第一个参数为数据集,第二个为图层类型,第三个为图层名。

UGLayer* BsLayer = m_pMapControl->GetMapEditWnd()->m_mapWnd.m_Map.m_Layers.AddDataset(BsDataset, true,
        UGLayer::UG_Layer_Normal, _U("siteLayer"));//显示这是要执行的下一句

试过了,还是不行crying这个是我测试用的数据,你可以试一下,感谢!yes

链接:https://pan.baidu.com/s/1_MPY7pMiyhYhX9FUrMGI3A 
提取码:fom6

拿你的数据测试没有问题呢:

导入 shp代码:

void JunSuMFCDialogDlg::OnFileImportshp()
{
    // TODO: 在此添加命令处理程序代码
    UGWorkspace* pWorkspace = (UGWorkspace*)m_pMapControl->GetMapEditWnd()->m_mapWnd.m_Map.GetWorkspace();
    UGDataExchange exchange = UGDataExchange();
    UGDataSource* ds = pWorkspace->GetDataSource(0);
    if (!ds)
    {
        return;
    }
    int issu = exchange.AttachDataSource(ds);
    UGShapeImportParams  importparams = UGShapeImportParams();

    UGString NAME = ds->GetUnoccupiedDatasetName(_U("RESULT11"));
    importparams.SetDestDTName(NAME);
    importparams.SetFilePathName(_U("C:\\Users\\86182\\Desktop\\c++导入数据测试数据\\data\\shp\\DSM.shp"));
    UGint ii = importparams.GetFileType();
    int ss = UGExchangeParamsManager::IsValidImportParams(ii, importparams);

    UGint issucceed = exchange.Import(importparams);

    if (issucceed == 1)
    {
        UGDatasetVector* dataset = (UGDatasetVector*)ds->GetDataset(NAME);
        UGLayer* layer = m_pMapControl->GetMapEditWnd()->m_mapWnd.m_Map.m_Layers.AddDataset(dataset, true);
        m_pMapControl->GetMapEditWnd()->m_mapWnd.m_Map.SetViewBounds(layer->GetBounds(), true);
        m_pMapControl->Refresh();
    }
    else
    {
        //QMessageBox::information(NULL, QString::fromLocal8Bit("导入shp"), QString::fromLocal8Bit("导入失败"), QMessageBox::Close, QMessageBox::Close);
    }

导入tiff代码:

void JunSuMFCDialogDlg::OnFileImporttif()
{
    // TODO: 在此添加命令处理程序代码
    UGWorkspace* pWorkspace = (UGWorkspace*)m_pMapControl->GetMapEditWnd()->m_mapWnd.m_Map.GetWorkspace();
    UGDataExchange exchange = UGDataExchange();
    UGDataSource* ds = pWorkspace->GetDataSource(0);
    if (!ds)
    {
        return;
    }
    int issu = exchange.AttachDataSource(ds);
    
    UGGTiffImportParams importparams = UGGTiffImportParams();

    UGString NAME = ds->GetUnoccupiedDatasetName(_U("TIF"));
    importparams.SetDestDTName(NAME);
    importparams.SetFilePathName(_U("C:\\Users\\86182\\Desktop\\c++导入数据测试数据\\data\\tif\\dsm_4.tif"));
    UGint ii = importparams.GetFileType();
    int ss = UGExchangeParamsManager::IsValidImportParams(ii, importparams);

    UGint issucceed = exchange.Import(importparams);

    if (issucceed == 1)
    {
        
        UGDatasetRaster* dataset = (UGDatasetRaster*)ds->GetDataset(NAME);
        dataset->BuildPyramid(false);
        UGLayer* layer = m_pMapControl->GetMapEditWnd()->m_mapWnd.m_Map.m_Layers.AddDataset(dataset, true);
        m_pMapControl->GetMapEditWnd()->m_mapWnd.m_Map.SetViewBounds(layer->GetBounds(), true);
        m_pMapControl->Refresh();
    }
    else
    {
        //QMessageBox::information(NULL, QString::fromLocal8Bit("导入shp"), QString::fromLocal8Bit("导入失败"), QMessageBox::Close, QMessageBox::Close);
    }
感谢啊,是可以加载进去了,但是显示的是纯白色的,不知道是不是还要设置什么其他的参数
你导入后最好是用idesktop打开对应的工作空间或者是数据源,先看看在数据源下面是否已经存在导入的数据,打开到地图中查看是否能够正常显示。如果可以的话,检查你的代码,是否将数据添加到了地图中:

代码:       

//将数据集添加到地图:

UGLayer* layer = m_pMapControl->GetMapEditWnd()->m_mapWnd.m_Map.m_Layers.AddDataset(dataset, true);

//全幅显示上一步加进去的图层,定位到数据范围;
m_pMapControl->GetMapEditWnd()->m_mapWnd.m_Map.SetViewBounds(layer->GetBounds(), true);

//刷新地图
m_pMapControl->Refresh();

我用idesktop打开对应的工作空间看过了,数据源是导入进去了的,在地图里面显示也是正常的,在我的程序里面已经能导入并显示了,只是显示的是纯白色的,因为我这边的程序有些东西是别人封装过一层的,可能和接口没关系,是其他的问题,我再查查吧,非常感谢yes

...