我用Datasource.Datasets.Create(datasetVectorInfo,prjCoordSys)创建的矢量数据集,但是连上这个Datasource之后获取到创建的DatasetVector调用datasetVector.GetRecordset(false, CursorType.Dynamic)之后返回的Recordset是null,不知道是什么原因导致的。
我在创建DatasetVector之前操作过从prj坐标系文件获取的PrjCoordSys给Datasource,翻到执行之后的iObjects的log日志有这样一段记录:
2021-07-21 18:24:29 [error] 获取数据失败, ThreadID: 26080, Timespan(ms): 0, ResourceID: ELc083, SourceCode: D:\TeamCity\UGO1010\01_SourceCode\Src\EnginePG\UGEditRecordsetPG.cpp(286)
2021-07-21 18:24:49 [error] 错误: 字段 smdtv_1.smgeoposition 不存在
LINE 1: ...1.fldm, SMDTV_1.ssqy, SMDTV_1.ysdm, SMDTV_1.zdmj, SMDTV_1.Sm...
^
, ThreadID: 26080, Timespan(ms): 19593, ResourceID: -100, SourceCode: D:\TeamCity\UGO1010\01_SourceCode\Src\EnginePG\UGEditRecordsetPG.cpp(377)
2021-07-21 18:24:49 [error] 获取数据失败, ThreadID: 26080, Timespan(ms): 0, ResourceID: ELc083, SourceCode: D:\TeamCity\UGO1010\01_SourceCode\Src\EnginePG\UGEditRecordsetPG.cpp(286)
从prj文件获取PrjCoordSys:
PrjCoordSys pRef;
string sProPath = string.Format(@"{0}\Templates\SMFrame\Coordinate Systems\预定义坐标系\Geographic Coordinate Systems\Asia\{1}.prj", sSysPath, sProName);
if (!File.Exists(sProPath))
{
sProName = GetPureGeoPRJFileName(sProName);
sProPath = sSysPath + @"\Templates\SMFrame\Coordinate Systems\预定义坐标系\Geographic Coordinate Systems\Asia\" + sProName + ".prj";
if (!File.Exists(sProPath))
{
pRef = null;
//// 自定义空间参考
//string sDefaultPath = sSysPath + @"\sys\Coordinate Systems\预定义坐标系\Geographic Coordinate Systems\Asia\China Geodetic Coordinate System 2000.prj";
//pRef = pSpatialReferenceFactory.CreateESRISpatialReferenceFromPRJFile(sDefaultPath);
}
else
{
pRef = new PrjCoordSys();
pRef.FromFile(sProName, PrjFileType.Esri);
}
}
else
{
pRef = new PrjCoordSys();
pRef.FromFile(sProName, PrjFileType.Esri);
}
Datasrouce设置坐标系:
m_TarSpr = Comm.GetSpatialReference(this.popZBX.Text, sSysPath, dMeridian, m_dXYTolerence, m_dXYResolution);
//// 数据源修改空间参考
m_TarDatasource.PrjCoordSys = m_TarSpr;
矢量数据集创建:
try
{
DatasetVectorInfo datasetVectorInfo = new DatasetVectorInfo();
datasetVectorInfo.Name = pDsVInfo.Name;
datasetVectorInfo.Type = pDsVInfo.DsType;
datasetVectorInfo.IsFileCache = true;
//// 初始化图层
//DatasetVector datasetVector = m_TarDatasrouce.Datasets.Create(datasetVectorInfo, m_TarDatasrouce.PrjCoordSys);
DatasetVector datasetVector = m_TarDatasrouce.Datasets.Create(datasetVectorInfo, m_Prj);
if (datasetVector == null)
{
sError = string.Format("图层【{0}】创建失败。", pDsVInfo.Name);
m_lstImportResult.Add(new ImportResult(pDsVInfo.Name, "失败", "图层创建失败"));
m_FailCount++;
continue;
}
//datasetVector.PrjCoordSys = m_TarDatasrouce.PrjCoordSys;
//// 初始化字段
foreach (SuperMap.Data.FieldInfo pFldInfo in pDsVInfo.FldInfos)
{
datasetVector.FieldInfos.Add(pFldInfo);
}
m_SuccessCount++;
m_lstImportResult.Add(new ImportResult(pDsVInfo.Name, "成功", "图层创建成功"));
}
catch(Exception ex)
{
m_lstImportResult.Add(new ImportResult(pDsVInfo.Name, "失败", ex.Message));
m_FailCount++;
}
矢量数据集导入记录获取Recordset:
public static Recordset GetRecordSet(Dataset dataset)
{
if (dataset == null)
{
return null;
}
try
{
return (dataset as DatasetVector).GetRecordset(false, CursorType.Dynamic);
}
catch
{
return null;
}
}
补充:
1、坐标系获取是直接读取的ArcGIS的坐标系文件(.prj),iObject.Net支持PrjCoordSys.FromFile()传.prj文件路径获取,方法的第二个参数传【PrjFileType.Esri】即可,获取到的PrjCoordSys正常;
2、创建出来的DatasetVector能在SuperMap iDesktop中正常读到,可以右键【查看属性】,能看到创建时候设置的坐标系,只是矢量数据集的记录数为0而已。但是代码获取到的Recordset是null,而不是RecordCount为0的实例;
3、之所以贴出来的代码有变量名出入,因为设置坐标系、创建图层以及获取Recordset的方法都是封装的,只贴出来关键处理逻辑,如果传进去的dataset就已经是null了,那我就没必要在这里提问了。