MO中添加对象

数据的简单入库现在已经实现,但是如何将地籍的权属信息入库还不明白,还有一个问题始终也没有解决好,就是通过MO向数据库添加空间对象。
 
当然这里没有实现的目前是DWG格式入库后的数据,原来是SHAPE格式的数据,不论是向原始文件中添加对象或是向入库后的表添加对象都不存在问题。我尝试了将入库后的DWG数据导出为SHAPE格式然后再导入数据库,似乎只能每次添加一个对象,然后就不行,要重新将数据导入,有时后即便只添加一个也不成功。不知道是什么原因。
 
应该不是数据库权限的问题,否则SHAPE格式为什么没有问题呢。上次老大说会不会是添加的对象坐标超出范围,不被接受,明天试一下将坐标显示出来。
 
哦,尽管对象没有导进,但是添加的动作在数据库里还是有反应,每做一次添加动作,表中OBJECT ID还是会增加的。啊,会不会真的是坐标的问题呢,分配空间给它,但是坐标没有输入。
已经确定不是坐标超出范围的问题了,想不通,程序应该也不存在问题,问题应该就在于DWG格式的源数据。可是没有SHAPE格式数据和DWG格式数据入库之后存在什么差别,到底是什么问题呢。
 
折腾很久了,暂时放一下吧,下面考虑一下属性数据的入库,数据的分层。
发现了SHAPE格式的源数据和DWG格式的源数据导入数据库后的差别了。通过在DOS下输入命令:
sdelayer -o describe -u sde -p geo223; 输出如下:
ArcSDE   8.3      Build 1090 Tue Nov 19 11:26:36 PST 2002
Layer    Administration Utility
-----------------------------------------------------
----------------------------------------------------------------
Database           : SDE
Table Owner        : SDE
Table Name         : RIVERS
Spatial Column     : SHAPE
Layer id           : 58
Entities           : nslc+
Layer Type         : SDE
I/O Mode           : NORMAL
User Privileges    : SELECT, UPDATE, INSERT, DELETE
Layer Configuration: DEFAULTS
 
Database           : SDE
Table Owner        : SDE
Table Name         : BANIANLINE
Spatial Column     : SHAPE
Layer id           : 58
Entities           : nslc3+
Layer Type         : SDE
I/O Mode           : NORMAL
User Privileges    : SELECT, UPDATE, INSERT, DELETE
Layer Configuration: DEFAULTS
 
Database           : SDE
Table Owner        : SDE
Table Name         : YUDAILINE
Spatial Column     : SHAPE
Layer id           : 58
Entities           : nslc+
Layer Type         : SDE
I/O Mode           : NORMAL
User Privileges    : SELECT, UPDATE, INSERT, DELETE
Layer Configuration: DEFAULTS
 
其中RIVERS是SHAPE格式数据导进数据库的,BANIANLINE是DWG格式导入数据库的,YUDAILINE是DWG数据通过FME转换为SHAPE格式后导进数据库的,我们注意到ENTITIES上存在差别,可能问题就出在这里,明天看下ENTITIES代表什么。
昨天通过命令sdelayer -o describe查看到的DWG数据入库后与SHAPE数据入库后的差别可能的确是造成DWG数据入库后无法添加对象的原因。但是今天的尝试仍然无法解决这个问题,看来还是只能暂时放一下了,确定还是用FME将DWG格式转换成SHAPE格式,然后再入库吧,尽管有属性信息的损失,但是大多的属性信息只是图形的颜色、线宽,不是很重要,如果有可能自己编程实现DWG2SHP吧!
 
今天尝试过将DWG入库后的ENTITY TYPE:nslc3+ 变成 nslc+,没有成功,步骤如下:
sdeexport -o create -l yudai,shape -f F:/yudai -u sde -p geo223;
其中yudai是表名,shape是列名,F:/yudai是导出的文件名,sde是数据库用户名,geo223是密码。
sdelayer -o delete -l yudai,shape -u sde -p geo223;
删除层,而非表;
sdetable -o truncate -t yudai -u sde -p geo223;
删除表里的记录;
sdelayer -o add -l yudai,shape -e nslc+ -u sde -p geo223;
添加层,将层的ENTITY TYPE设为nslc+;
到这里的操作都是成功的。
sdeimport -o append -l yudai,shape -u sde -p geo223;
这步操作报错:
Exportfile and SDE table/layer is not compatible: INCOMPATIBLE_ENTITY_TYPE
Number of Update with match : 0
Number of Update with no match : 0
导出的文件是否仍带着原来ENTITY TYPE的信息,导致导入的时候与新的ENTITY TYPE发生冲突以致报错。
void OnSaveObject()
{
  //得到当前加载的图层
 CMoMapLayer maplayer;
 CMoLayers layers(m_Map.GetLayers()); 
 CString LayerName[1024];
 for(int jj = 0; jj < layers.GetCount(); jj++)
 {
  maplayer = layers.Item(CComVariant(jj));
  LayerName[jj] = maplayer.GetName();
 }
 CObjectSaveDlg objdlg(this, LayerName, layers.GetCount());
 if(objdlg.DoModal() == IDOK)
 {
  CString str;
  str = objdlg.m_CurText;
  int ii;
  VARIANT vaExtent;
  VARIANT vaAttr;
  VariantInit(&vaExtent);
  VariantInit(&vaAttr);
  vaExtent.vt = VT_DISPATCH;
  //vaAttr.vt = VT_BSTR;
  //vaAttr.bstrVal = str;
  CMoRecordset recs;
  CMoTableDesc tableDesc;
        CMoFields fields;
   CMoGeoDataset geoDataset;
  
  maplayer = layers.Item(COleVariant(TEXT(str)));  
  recs = maplayer.GetRecords();
  tableDesc = recs.GetTableDesc();
  fields = recs.GetFields();
        

  if(!recs.GetUpdatable())
  {
   MessageBox("OnSaveObject the recordset is not editable");
   return;
  }
  
   //如果保存至的图层类别包括下面的对象,那么保存不成功
  switch(maplayer.GetShapeType())
  {
   //图层类型是点
  case 21:
   {
    if(m_dPolygonArray.GetSize() > 0)
     MessageBox("选定的图层类型为点,不能保存多边形对象");
    if(m_dLineArray.GetSize() > 0)
                    MessageBox("选定的图层类型为点,不能保存线对象");
    
     for(ii = 0; ii < m_dPointArray.GetSize(); ii++)
    {
     recs.AddNew();
     CMoPoint pt(*m_dPointArray[ii]);
     vaExtent.pdispVal = pt.m_lpDispatch;
     fields.Item(CComVariant("Shape")).SetValue(vaExtent);
     recs.Update();
     //recs.StopEditing();
    }
   }
   break;
   //图层类型线
  case 22:
   {
    if(m_dPointArray.GetSize() > 0)
     MessageBox("选定的图层类型为线,不能保存点对象");
    if(m_dPolygonArray.GetSize() > 0)
                    MessageBox("选定的图层类型为线,不能保存多边形对象");
    
                for(ii = 0; ii < m_dLineArray.GetSize(); ii++)
    {
     recs.AddNew();
     CMoLine ln(*m_dLineArray[ii]);
     vaExtent.pdispVal = ln.m_lpDispatch;
     fields.Item(CComVariant("Shape")).SetValue(vaExtent);
                    recs.Update(); 
     //recs.StopEditing();
    }
   }
   break;
   //图层类型是多边形
  case 23:
   {
    if(m_dPointArray.GetSize() > 0)
     MessageBox("选定的图层类型为多边形,不能保存点对象");
    if(m_dLineArray.GetSize() > 0)
                    MessageBox("选定的图层类型为多边形,不能保存线对象");
    
                for(ii = 0; ii < m_dPolygonArray.GetSize(); ii++)
    {
     recs.AddNew();
     CMoPolygon poly(*m_dPolygonArray[ii]);
     vaExtent.pdispVal = poly.m_lpDispatch;
     fields.Item(CComVariant("Shape")).SetValue(vaExtent);
     recs.Update();
     //recs.StopEditing();
    }
   }
   break;
  }
  m_Map.Refresh();  
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值