.tab文件中被删除的记录怎么还在?

luyiping 2003-09-15 09:27:32
.tab文件中被删除的记录怎么还在?
我把某图元删了,用mapinfo打开时是灰色的空列
在加如一个图元时怎么会加到这个记录的后面呢?
明明是删掉了,为什么计算ds.RowCount的时候还是吧它加进去的呢?
...全文
79 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
banner90 2003-10-09
  • 打赏
  • 举报
回复
第一个已经解决了,怎么还不结贴
klbt 2003-10-08
  • 打赏
  • 举报
回复
学习,帮你顶。
shansheng 2003-09-15
  • 打赏
  • 举报
回复
紧缩表,lovelyant原创
三思而行(3S2Go)论坛
vc+mapx 4.5

希望大家多多指教,此函数有一个缺点,对于有索引的图层,紧缩后,索引就没了。请教如何在程序中添加索引?
希望多多交流bodyhfp@163.com

void PackTab(CString strLayername/*需要被紧缩的层名*/)
{
COleVariant sd;
CMapXLayer layer;
CMapXDataset ds;
layer = map->GetLayers().Item(strLayername);
sd.vt = VT_DISPATCH;
sd.pdispVal = layer.m_lpDispatch;
sd.pdispVal->AddRef();
long count = map->GetDatasets().GetCount();
int flag=-1; //数据集中是否存在该层
for(int k=1;k<=count;k++)
{
if(map->GetDatasets().Item(k).GetName()==strLayername)
{
flag=1;
break;
}
}
if(flag==-1)
ds = map->GetDatasets().Add(miDataSetLayer,sd,map->GetLayers().Item(strLayername).GetName());
else
ds = map->GetDatasets().Item(strLayername);
long nreccount = ds.GetRowCount();
long nfeacount = layer.AllFeatures().GetCount();
if(nreccount!=nfeacount) /*是否需要紧缩的判断条件*/
{
CWaitCursor cursor;
// map->GetDatasets().Remove(1);
CMapXLayer layer = map->GetLayers().Item(strLayername);
long layercount = map->GetLayers().GetCount();
long layerindexOrign;
for(int k=1;k<=layercount;k++)
{
if(map->GetLayers().Item(k).GetName()==strLayername)
{
layerindexOrign = k; //该层所在的位置
break;
}
}
VARIANT vtLayer;
vtLayer.vt = VT_DISPATCH;
vtLayer.pdispVal = layer.m_lpDispatch;
vtLayer.pdispVal->AddRef();
CMapXDataset dataSet = map->GetDatasets().Item(layer.GetName());//map->GetDatasets().Add(miDataSetLayer, vtLayer,"pack";
// CString dsname = map->GetDatasets().Item(1).GetName();
CString layername = layer.GetName();
CString layerFilespec = layer.GetFilespec();
////////////////将选中的layer上的内容复制到临时建立的表templayer中(开始)/////////////////////////
CMapXLayerInfo m_LayerInfo;
m_LayerInfo.CreateDispatch(m_LayerInfo.GetClsid());
m_LayerInfo.SetType(miLayerInfoTypeNewTable);
CString tempstr;
layerFilespec.TrimLeft();
layerFilespec.TrimRight();
int pos;
pos = layerFilespec.ReverseFind('\\');
CString routeStr;
routeStr = layerFilespec.Mid(0,pos+1);
tempstr = routeStr+"\\templayer.tab";
VARIANT name;
name.vt=VT_BSTR;
name.bstrVal = tempstr.AllocSysString();
m_LayerInfo.AddParameter("filespec",name);
VARIANT vlayername;
vlayername.vt = VT_BSTR;
vlayername.bstrVal = CString("templayer".AllocSysString();
m_LayerInfo.AddParameter("Name",vlayername);
VARIANT m_Fields;
CMapXFields n_Fields;
n_Fields.CreateDispatch(n_Fields.GetClsid());
n_Fields=dataSet.GetFields();
m_Fields.vt = VT_DISPATCH;
m_Fields.pdispVal = n_Fields.m_lpDispatch;
m_Fields.pdispVal->AddRef();
m_LayerInfo.AddParameter("Fields", m_Fields);
VARIANT m_Features;
CMapXFeatures n_Features=layer.AllFeatures();
m_Features.vt = VT_DISPATCH;
m_Features.pdispVal=n_Features.m_lpDispatch;
m_Features.pdispVal->AddRef();
m_LayerInfo.AddParameter("Features", m_Features);
CMapXLayer packlyr = map->GetLayers().Add(m_LayerInfo.m_lpDispatch);
// map->GetLayers().LayersDlg(COptionalVariant(),COptionalVariant());
//packlyr为加入的临时层对象
//////////////////已将layer复制到临时建立的表templayer中///////////////////////////
map->GetDatasets().Remove(layername); //从Datasets中去除先前帮定的需紧缩的层
map->GetLayers().Remove(layername); //先把原始层(未紧缩的层)从层集中去除
//创建dataset for packlyr
vtLayer.vt = VT_DISPATCH;
vtLayer.pdispVal = packlyr.m_lpDispatch;
vtLayer.pdispVal->AddRef();
dataSet = map->GetDatasets().Add(miDataSetLayer, vtLayer,"pack";
//创建新表
CMapXLayerInfo newlayerInfo;
newlayerInfo.CreateDispatch(newlayerInfo.GetClsid());
newlayerInfo.SetType(miLayerInfoTypeNewTable);
newlayerInfo.AddParameter("filespec",COleVariant(layerFilespec));
newlayerInfo.AddParameter("Name", COleVariant(layername));
n_Fields=dataSet.GetFields();
m_Fields.vt = VT_DISPATCH;
m_Fields.pdispVal = n_Fields.m_lpDispatch;
m_Fields.pdispVal->AddRef();
newlayerInfo.AddParameter("Fields", m_Fields);
CMapXFeatures features = packlyr.AllFeatures();
VARIANT fs;
fs.vt = VT_DISPATCH;
fs.pdispVal=features.m_lpDispatch;
fs.pdispVal->AddRef();
newlayerInfo.AddParameter("features",fs);
newlayerInfo.AddParameter("OverwriteFile",COleVariant("1"; //永久写入原表
CString tempstr1,tempstr2,tempstr3,tempstr4,tempstr5;

tempstr1 = routeStr+"\\"+layername+".tab";
tempstr2 = routeStr+"\\"+layername+".dat";
tempstr3 = routeStr+"\\"+layername+".map";
tempstr4 = routeStr+"\\"+layername+".id";
tempstr5 = routeStr+"\\"+layername+".ind";
DeleteFile(tempstr1);
DeleteFile(tempstr2);
DeleteFile(tempstr3);
DeleteFile(tempstr4);
DeleteFile(tempstr5);

map->GetLayers().Add(newlayerInfo.m_lpDispatch);
map->GetLayers().Move(1,layerindexOrign+1); //把层从添加的位置移回到原来的位置
// map->GetLayers().LayersDlg(COptionalVariant(),COptionalVariant());
//删除临时表
map->GetDatasets().Remove("pack";
map->GetLayers().Remove("templayer";

tempstr1 = routeStr+"\\templayer.tab";
tempstr2 = routeStr+"\\templayer.dat";
tempstr3 = routeStr+"\\templayer.map";
tempstr4 = routeStr+"\\templayer.id";
tempstr5 = routeStr+"\\templayer.ind";
DeleteFile(tempstr1);
DeleteFile(tempstr2);
DeleteFile(tempstr3);
DeleteFile(tempstr4);
DeleteFile(tempstr5);
DataBand(strLayername);
}

}
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
刷屏,我的最爱!
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
navtech 2003-09-15
  • 打赏
  • 举报
回复
的确是这样的。在mapinfo里菜单的选择Table->Maintancence->Pack Table,可以紧缩表。
在MapX5.2.25里有Pack方法,MapX4.5里面就只能自己写了。

2,142

社区成员

发帖
与我相关
我的任务
社区描述
它是一种特定的十分重要的空间信息系统。它是在计算机硬、软件系统支持下,对整个或部分地球表层(包括大气层)空间中的有关地理分布数据进行采集、储存、管理、运算、分析、显示和描述的技术系统。
社区管理员
  • 地理信息系统
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧