首页 / 浏览问题 / 组件GIS / 问题详情
二维线的编辑
35EXP 2019年11月14日
cpp9.1.0

1.编辑点的时候点两端的连接线跟着移动

2.工作空间或地图有没有获取当前地图的缩略图的api

1个回答

您好,

第一个问题,是需要端点跟着动吗?是不是要做平移?编辑节点是只有一个点动的

第二个问题,工作空间没有回去缩略图,UGMap才能拿到地图
694EXP 2019年11月14日
对的,不是平移,就一条折线,我需要动某个节点时,其他的节点不动,只有这个点的两条线跟着变化;

地图能获取到缩略图吗?或者输出成为可编辑的数据集
1. 使用如下函数设置为节点编辑状态

先使用 :UGMapEditorWnd::SetUserAction(UGC::UGDrawParamaters::uaPointModeSelect); 选中对象
后使用,UGMapEditorWnd::GetEditToolPack()->SetAccessibilityActionPointMode(UGC::UGEditType::EAA_EditPoint); 编辑节点

 只设置第一个的话,可以平移对象,加上第二个就是编辑节点

2. 地图打开后可以输出图片

     UGMap::ViewEntire()   可以设置地图全幅显示,不调用默认为地图保持时的比例尺

    UGMap::OutputMapToFile()

1.第一个可以用自己新建对象访问?我用的是例子带的QMapControl;

2.输出不行啊,没有反应,返回值为零。

1. 是窗口的交互操作,设这UGMapEditorWnd参数即可,QMapControl是对其的封装

2. 最后一个参数使用UGFileType中定义的类型,即UGFileType::JPG

还是不行啊,这个窗口交互只要添加这两句语句就好了吗??

	UGMapEditorWnd *wnd = new UGMapEditorWnd();

	wnd->SetUserAction(UGC::UGDrawParamaters::uaPointModeSelect);
	wnd->GetEditToolPack()->SetAccessibilityActionPointMode(UGC::UGEditType::EAA_EditPoint);

还是没有节点编辑,只能整条线移动或缩放

您好,是线使用选中,选择一个对象后再设置成编辑

可能我的表述有误,需要的节点改变就好比折线上的某一个折点改变后,其他折点不变,重新生成一条线。

顺便问一下,我的工作空间和数据源好像不能自动绑定在一起,就算我使用该工作空间打开数据源。

	UGDsConnection *dsc = new UGDsConnection;
	dsc->m_bReadOnly = false;
	dsc->m_nType = UGC::UDB;
	dsc->m_strAlias = L"A";
	dsc->m_strServer = Translator::QStr2UGStr(path1);
	UGDataSource* dd = workspace->OpenDataSource(*dsc);

还在吗??

除了上面的问题外想再问一下:

1.现有一面数据集和点数据集,想获取到压盖到点数据集对象得到面数据集对象,并把点数据集对象的某一属性值赋值给面数据集对象。

2.希望类似桌面版能打开多张地图
1. 你所描述的编辑不是和我们实现的编辑,而是相当于通过已有线的节点绘制一条线,采用绘制线的方法即可,绘制的时候端的可以捕捉到其他线的节点。

2. 工作空间打开数据源后,该数据源就已经包含在当前工作空间了。“不能自动绑定”不是指这个吗?

3.面覆盖点,通常是一个面覆盖多个点,可以通过叠加分析(UGOverlayAnalyst)的相交分析直接得到点数据集,并保留面数据集的SmID,再通过保留的SmID查出对应的面数据

4. 应用做成多文档应用,打开多个地图窗口即可。
好的,感谢,关于“不能绑定”的意思就是下次打开的时候工作空间内数据源还是空,我关闭之前保存了工作空间
应该是没有保存成功,打开的工作空间需设置:

m_pUGWorkspace->m_WorkspaceConnection.m_bFailIfExists = false;

这样才能直接保存。

在保存之前已设置

    UGDsConnection *dsc = new UGDsConnection;
	dsc->m_bReadOnly = false;
	dsc->m_nType = UGC::UDB;
	dsc->m_strAlias = L"A";
	dsc->m_strServer = Translator::QStr2UGStr(path1);
	UGDataSource* dd = workspace->OpenDataSource(*dsc);
	workspace->m_WorkspaceConnection.m_bFailIfExists = false;
	int ret = workspace->m_DataSources.GetCount();
	workspace->Save();

workspace的路径是什么? 保存返回值是否为true?
路径为本地文件夹+名字,save返回true,ret值为1,下次用workspace->open(路径) 打开工作空间,包含数据源为0
检查C++产品包Bin目录下的log目录中的日志,看打开是有什么错误提示
提示文件损坏,但是可以在桌面版打开

Cannot open the datasource or file in exclusive mode because it is corrupted,
数据是否在同一个盘符或者是否已经打开过了?

独占方式只能打开一次
应该没有,不过数据源是新建的,然后直接打开。

保存关闭后再次打开就不行
新建数据源文件了吗?麻烦把代码贴一下。
		QString path1 = path.replace(".smwu",".udb");
		UGDataSource *ds = UGDataSourceManager::CreateDataSource(UGEngineType::UDB);
		ds->GetConnectionInfo().m_nType = UGC::UDB;
		ds->GetConnectionInfo().m_bReadOnly = false;
		//ds->GetConnectionInfo().m_bExclusive = true;
		ds->GetConnectionInfo().m_strServer = Translator::QStr2UGStr(path1);
		if(!ds->Create())
		{
			QMessageBox::critical(this, "error", QStringLiteral("creat eror"));
		}

你只是创建了对象,没有生成文件吗?

创建后还要添加到workspace的UGDatasources中才能关联。

bool isCreated = datasource->Create();
    if (isCreated)
    {
        m_pUGWorkspace->m_DataSources.Insert(ugName, datasource);
    }
就是说如果现有的文件用openDataSource()就可以关联?新建的需要添加到数据源集合?还是所有的关联都需要加入集合?
不是使用UGWorkspace相关的函数打开的都要手动关联。
	QString path1 = path.replace(".smwu",".udb");
	UGDataSource *ds = UGDataSourceManager::CreateDataSource(UGEngineType::UDB);
	ds->GetConnectionInfo().m_nType = UGC::UDB;
	ds->GetConnectionInfo().m_bReadOnly = false;
	ds->GetConnectionInfo().m_strAlias = L"A";
	ds->GetConnectionInfo().m_strServer = Translator::QStr2UGStr(path1);
	if(ds->Create())
	{
		//默认点数据集创建
		UGDatasetVectorInfo* info1 = new UGDatasetVectorInfo ();
		info1->m_nType = UGC ::UGDataset ::DatasetType ::Point;
		UGString name1 = ds->GetUnoccupiedDatasetName(_U ("myPoint"));
		info1->m_strName = name1 ;
		info1->m_strTableName =name1 ;
		UGDatasetVector* datasetresult1 = ds->CreateDatasetVector(*info1);
			
		//默认线数据集创建
		UGDatasetVectorInfo* info2 = new UGDatasetVectorInfo ();
		info2->m_nType = UGC ::UGDataset ::DatasetType ::Line;
		UGString name2 = ds->GetUnoccupiedDatasetName(_U("myLine"));
		info2->m_strName = name2 ;
		info2->m_strTableName =name2 ;
		UGDatasetVector * datasetresult2 = ds->CreateDatasetVector(*info2);
	
		//默认面数据集创建
		UGDatasetVectorInfo* info3 = new UGDatasetVectorInfo ();
		info3->m_nType = UGC ::UGDataset ::DatasetType ::Region;
		UGString name3 = ds->GetUnoccupiedDatasetName(_U ("myPlane"));
		info3->m_strName = name3 ;
		info3->m_strTableName =name3 ;
		UGDatasetVector * datasetresult3 = ds->CreateDatasetVector(*info3);
	}
	
	workspace->OpenDataSource(ds->GetConnectionInfo());
	workspace->m_WorkspaceConnection.m_bFailIfExists = false;

我在后面有用workspace函数打开,但还是没绑定

你的是独占的哪里那能打开哦,不是给了添加到UGDatasources的方法吗
并未设置独占啊?就是关联还是必须添加到数据源集合?
你是新建了一个UDB,前面的代码没有一个和UGWorkspace有关。

ds->GetConnectionInfo().m_bReadOnly = false;  // 非只读,就是可以写入,这就是独占的。

看看workapce中有没有嘛
...