//获取标注圆内的注记集合 public static List <mcRecordSet> GetCircleAnnos(mcRecordSet recordset, mcRecordSet destRecordSet) { List <mcRecordSet> AnnoInCircles = new List <mcRecordSet>(); int SfcID = 0; SfcID = recordset.MoveFirst(); //找到图例中的注记圆 while (!recordset.IsEOF()) { IGeometry GeoResult = null; recordset.GetGeometry(out GeoResult); mcRect rect = null; GeoResult.CalRect(out rect); double width = Math.Round(rect.xmax - rect.xmin, 2); double heigth = Math.Round(rect.ymax - rect.ymin, 2); //判断是否是注记圆 if (Math.Abs(width - heigth) < 5) { //获取单个标注圆内的注记 mcRecordSet AnnoInCircle = null; mcQueryDef queryDef = new mcQueryDef(); queryDef.set_rect(rect, meSpaQueryMode.meModeContain); destRecordSet.Select(queryDef, out AnnoInCircle); AnnoInCircles.Add(AnnoInCircle); } SfcID = recordset.MoveNext(); } return(AnnoInCircles); }
//获取标注圆内的注记集合 public static List <mcRecordSet> GetCircleAnnosNew(List <IGeometry> geoCircelList, List <IGeomInfo> geoCircelInfoList, mcRecordSet AnnoRecordSet) { List <mcRecordSet> AnnoInCircles = new List <mcRecordSet>(); for (int i = 0; i < geoCircelList.Count; i++) { //获取单个标注圆内的注记 mcRect circleRect = null; geoCircelList[i].CalRect(out circleRect); IPntInfo pntInfo = geoCircelInfoList[i] as IPntInfo; mcRect ExpandRect = new mcRect(); ExpandRect.xmin = circleRect.xmin - (pntInfo.width / 2) - 2; ExpandRect.ymin = circleRect.ymin - (pntInfo.height / 2) - 2; ExpandRect.xmax = circleRect.xmax + (pntInfo.width / 2) + 2; ExpandRect.ymax = circleRect.ymax + (pntInfo.height / 2) + 2; mcRecordSet AnnoInCircle = null; mcQueryDef queryDef = new mcQueryDef(); queryDef.set_rect(ExpandRect, meSpaQueryMode.meModeContain); AnnoRecordSet.Select(queryDef, out AnnoInCircle); AnnoInCircles.Add(AnnoInCircle); } return(AnnoInCircles); }
private void btnGeoUpdate_Click(object sender, EventArgs e) { GeoUpdateParameterSetDlg aupDlg = new GeoUpdateParameterSetDlg(this); if (aupDlg.ShowDialog() == DialogResult.OK) { mcGDBServer GDBSvr = null; mcGDataBase GDB = null; mcGDataBase GDB_source = null; mcQueryDef QueryDef = null; mcQueryDef QueryDef_source = null; mcGeoPolygon GeoPolygon = null; mcGeoPolygon GeoPolygon_source = null; IGeometry pgeo = null; IGeometry pgeo_source = null; IVectorCls VecCls = null; IVectorCls VecCls_source = null; mcObjectID ID = null; mcObjectID ID_Source = null; IVectorCls VecCls_Add = null; GDBSvr = new mcGDBServer(); QueryDef = new mcQueryDef(); QueryDef_source = new mcQueryDef(); GeoPolygon = new mcGeoPolygon(); GeoPolygon_source = new mcGeoPolygon(); //变量初始化 ID = new mcObjectID(); ID_Source = new mcObjectID(); //连接数据源,打开数据库 try { GDBSvr.Connect("MapGislocal", "", ""); GDB = GDBSvr.get_gdb(DB); GDB_source = GDBSvr.get_gdb(DB_source); VecCls = GDB.get_XClass(meXClsType.meXSFCls) as IVectorCls; VecCls_source = GDB_source.get_XClass(meXClsType.meXSFCls) as IVectorCls; VecCls.Open(KQ, 0); VecCls_source.Open(KQ_source, 0); ID.Int = 1; VecCls.GetGeometry(ID, out pgeo); GeoPolygon = (mcGeoPolygon)pgeo; //空间查询模式。主要有四种 :相交、外包矩形相交、相等、相离,具体意思及区别见技术文档 QueryDef.set_Spatial(GeoPolygon, meSpaQueryMode.meModeIntersect); ID_Source.Int = 1; VecCls_source.GetGeometry(ID_Source, out pgeo_source); GeoPolygon_source = (mcGeoPolygon)pgeo_source; //空间查询模式。主要有四种 :相交、外包矩形相交、相等、相离,具体意思及区别见技术文档 QueryDef_source.set_Spatial(GeoPolygon_source, meSpaQueryMode.meModeIntersect); string[] keys = new string[dict.Count]; dict.Keys.CopyTo(keys, 0); foreach (string key in keys) { if ("".Equals(key)) { mcQueryDef QDef = null; mcRecordSet RecordSet = null; QueryDef = new mcQueryDef(); IVectorCls VecCls_data = null; //打开待分析数据 VecCls_data = GDB.get_XClass(meXClsType.meXSFCls) as IVectorCls; VecCls_data.Open(dict[key], 0); VecCls_Add = GDB_source.get_XClass(meXClsType.meXSFCls) as IVectorCls; VecCls_Add.Create(dict[key], meGeomConstrainType.mefReg, 0, 0, null); //设置属性查询条件 QueryDef.Filter = ""; VecCls_data.Select(QDef, out RecordSet); int rtn = VecCls_Add.CopySet(RecordSet); VecCls_Add.Close(); VecCls_data.Close(); break; } SpatialDataAutoUpdate(GDBSvr, GDB, GDB_source, QueryDef, QueryDef_source, dict[key], key, Field, Field_source); } } catch (Exception ex) { MessageBox.Show(ex.Message); } finally { VecCls.Close(); VecCls_source.Close(); GDBSvr.DisConnect(); GDB.Close(); GDB_source.Close(); } } }
private static void SpatialDataAutoUpdate(mcGDBServer GDBSvr, mcGDataBase GDB, mcGDataBase GDB_source, mcQueryDef QueryDef, mcQueryDef QueryDef_source, string data, string data_source, string field, string field_source) { //变量定义 mcRecordSet RecordSet = null; mcRecordSet RecordSet_source = null; IVectorCls VecCls_data = null; IVectorCls VecCls_source_data = null; try { //打开待分析数据 VecCls_data = GDB.get_XClass(meXClsType.meXSFCls) as IVectorCls; VecCls_data.Open(data, 0); VecCls_source_data = GDB_source.get_XClass(meXClsType.meXSFCls) as IVectorCls; VecCls_source_data.Open(data_source, 0); VecCls_data.Select(QueryDef, out RecordSet); VecCls_source_data.Select(QueryDef_source, out RecordSet_source); int SfcID = 0; SfcID = RecordSet.MoveFirst(); while (!RecordSet.IsEOF()) { mcRecord record = null; mcFields Fields = null; IGeometry geo = null; IGeomInfo geoInfo = null; object val = null; mcObjectID mID = new mcObjectID(); RecordSet.Get(out geo, out record, out geoInfo); record.GetFields(out Fields); record.GetFldVal(field, out val); int SfcID_source = 0; bool flag = true; SfcID_source = RecordSet_source.MoveFirst(); while (!RecordSet_source.IsEOF()) { mcObjectID id_source = new mcObjectID(); mcRecord record_source = null; mcFields Fields_source = null; IGeometry geo_source = null; IGeomInfo geoInfo_source = null; object val_source = null; RecordSet_source.Get(out geo_source, out record_source, out geoInfo_source); RecordSet_source.GetID(out id_source); record_source.GetFields(out Fields_source); record_source.GetFldVal(field_source, out val_source); //找到新旧数据中对应的矿体 if (val.ToString().Equals(val_source.ToString())) { flag = false; VecCls_source_data.Del(id_source); VecCls_source_data.Append(geo, record, geoInfo); //更新原始数据结果集 要不会报空指针错误 VecCls_source_data.Select(QueryDef, out RecordSet_source); break; } SfcID_source = RecordSet_source.MoveNext(); } //判断是否是新增矿体 新增矿体直接添加 if (flag) { VecCls_source_data.Append(geo, record, geoInfo); //更新原始数据结果集 要不会报空指针错误 VecCls_source_data.Select(QueryDef, out RecordSet_source); } SfcID = RecordSet.MoveNext(); } } catch (Exception ex) { throw new Exception("更新出错啦!"); } finally { //关闭类、数据库、断开数据源 VecCls_data.Close(); VecCls_source_data.Close(); } }
//获取新数据内标注圆的集合 public static void GetAnnoCircleGeoList(string frame_layername, out List <IGeometry> Anno_CircleGeoList, out List <IGeomInfo> Anno_CircleGeoInfoList, AxWorkSpace.AxMxWorkSpace WorkSpace) { List <IGeometry> _Anno_CircleGeoList = new List <IGeometry>(); List <IGeomInfo> _Anno_CircleGeoInfoList = new List <IGeomInfo>(); // 1、找到最大的图框 mcRecordSet AllFeatures_RecordSet = GetLayerRecordSet(frame_layername, WorkSpace); List <double> mpLengths = new List <double>(); int sfID = 0; sfID = AllFeatures_RecordSet.MoveFirst(); while (!AllFeatures_RecordSet.IsEOF()) { mcRecord record = null; AllFeatures_RecordSet.GetAtt(out record); object per = null; record.GetFldVal("mpLength", out per); mpLengths.Add((double)per); sfID = AllFeatures_RecordSet.MoveNext(); } mpLengths.Sort(); mcQueryDef lengthDef = new mcQueryDef(); lengthDef.Filter = "mpLength=" + mpLengths[mpLengths.Count - 1]; mcRecordSet frameRecordSet = null; AllFeatures_RecordSet.Select(lengthDef, out frameRecordSet); frameRecordSet.MoveFirst(); IGeometry geoFrame = null; frameRecordSet.GetGeometry(out geoFrame); // 2、找到图例圆 IXGroupLayer m_Layer = null; m_Layer = WorkSpace.MapCollection.get_Item(0).get_Layer2("T01_0060.WT") as IXGroupLayer; IVectorCls vcls = m_Layer.get_Layer(2).XClass as IVectorCls; mcQueryDef queryDef = new mcQueryDef(); //图框的外包矩形 mcRect FrameRect = null; geoFrame.CalRect(out FrameRect); //计算、保留图例圆的中心点坐标 mcDot CircleDot = new mcDot(); mcGeoPolygon queryPolygon = GetRectPolygon(FrameRect); queryDef.set_Spatial(queryPolygon, meSpaQueryMode.meModeContain); mcRecordSet containCircle = null; vcls.Select(queryDef, out containCircle);//图框内的圆 containCircle.MoveFirst(); while (!containCircle.IsEOF()) { mcObjectID id = null; containCircle.GetID(out id); IGeomInfo geoInfo = null; containCircle.GetInfo(out geoInfo); IPntInfo pntInfo = geoInfo as IPntInfo; if (pntInfo.height > 20 && pntInfo.width > 20) { IGeometry geoCircle = null; IGeomInfo geoCircleInfo = null; containCircle.GetGeometry(out geoCircle); _Anno_CircleGeoList.Add(geoCircle); containCircle.GetInfo(out geoCircleInfo); _Anno_CircleGeoInfoList.Add(geoCircleInfo); } containCircle.MoveNext(); } Anno_CircleGeoList = _Anno_CircleGeoList; Anno_CircleGeoInfoList = _Anno_CircleGeoInfoList; }