public void CoordConvertMap() { try { WaitForm.Start("开始坐标系转换,请稍后..."); IWorkspaceFactory pWsF = new AccessWorkspaceFactoryClass(); m_SpatialReference = new UnknownCoordinateSystemClass(); m_Envelop = new EnvelopeClass(); InitEnvelop(); m_SpatialReference.SetDomain(m_Envelop.XMin, m_Envelop.XMax, m_Envelop.YMin, m_Envelop.YMax); m_SpatialReference.SetZDomain(-1000, 2097151002.92969); m_SpatialReference.SetMDomain(-1000, 8388607011.71875); //pWsF.Create(m_Path, m_Name, null, 0); IWorkspace pWs2 = pWsF.OpenFromFile(m_Path + @"\" + m_Name, 0); string pWs1Path = Config.GetConfigValue("2DMdbPipe"); if (pWs1Path == "") { return; } pWs1 = pWsF.OpenFromFile(pWs1Path, 0); CreateWorkspaceDomains(pWs1, pWs2); for (int i = 0; i < m_Map.LayerCount; i++) { ILayer layer = m_Map.get_Layer(i); if (layer.Visible) { //WaitForm.SetCaption("正在转换图层" + layer.Name + ",请稍后..."); CoordConvertLayers(layer, m_SpatialReference); } } WaitForm.SetCaption("坐标系转换成功!"); WaitForm.Stop(); } catch (System.Exception ex) { WaitForm.Stop(); } }
//** 功能描述: 通过一个字段集,创建另外一个字段集,直接添加传入的字段集中的所有字段的话 // 会产生高版本和低版本不兼容的问题, public static IFields GetFieldsByFields(IFields pFields, ref ISpatialReference pDesSpatialReference, Dictionary <string, string> pDicField) { //pDesSpatialReference = null; //pDicField = null; int i = 0; IField pField = default(IField); IFieldEdit pFieldEdit = default(IFieldEdit); IFieldsEdit pFieldsEdit = default(IFieldsEdit); IField pCreateField = default(IField); ISpatialReference pOriSpatialReference = default(ISpatialReference); IGeometryDef pGeometryDef = default(IGeometryDef); IGeometryDefEdit pGeometryDefEdit = default(IGeometryDefEdit); double ymin = 0; double xmin = 0; double xmax = 0; double ymax = 0; double mMin = 0; double zmin = 0; double zmax = 0; double mMax = 0; IEnvelope pEnvelop = default(IEnvelope); IGeometry pGeometry = default(IGeometry); IClone pClone = default(IClone); //标识该字段是否被添加 bool bIsAddField = false; //应该把OID字段添加进去,否则会产生错误 pFieldsEdit = new FieldsClass(); for (i = 0; i <= pFields.FieldCount - 1; i++) { pField = pFields.get_Field(i); if (pField.Editable | pField.Type == esriFieldType.esriFieldTypeOID | pField.Type == esriFieldType.esriFieldTypeGlobalID | pField.Type == esriFieldType.esriFieldTypeGUID) { pClone = (IClone)pField; pCreateField = (IField)pClone.Clone(); //如果更改字段名称:如果是OID字段的话,即便不在dic中也要进行添加 if ((pDicField != null)) { if (pDicField.ContainsKey(Strings.Trim(pField.Name))) { bIsAddField = true; //修改字段的名称 pFieldEdit = (IFieldEdit)pCreateField; pFieldEdit.Name_2 = pDicField[Strings.Trim(pField.Name)]; //需不需要把别名赋过去,根据需要再看吧,现在看的话应该不要赋过去,因此一般字段名和别名是一样的 //如果赋过去的话,显示的是原字段的别名,即不是用户想看到的字段名 //pFieldEdit.AliasName = pField.AliasName } else if (pField.Type == esriFieldType.esriFieldTypeOID | pField.Type == esriFieldType.esriFieldTypeGlobalID | pField.Type == esriFieldType.esriFieldTypeGUID) { bIsAddField = true; } else { bIsAddField = false; } } else { bIsAddField = true; } if (pField.Type == esriFieldType.esriFieldTypeGeometry) { pGeometryDef = pCreateField.GeometryDef; pGeometryDefEdit = (IGeometryDefEdit)pGeometryDef; if ((pDesSpatialReference != null)) { pOriSpatialReference = pGeometryDef.SpatialReference; //从原来的空间参考中得到domain if (pOriSpatialReference.HasXYPrecision()) { pOriSpatialReference.GetDomain(out xmin, out xmax, out ymin, out ymax); } pEnvelop = new EnvelopeClass(); pEnvelop.PutCoords(xmin, ymin, xmax, ymax); pGeometry = pEnvelop; pGeometry.SpatialReference = pOriSpatialReference; pGeometry.Project(pDesSpatialReference); xmax = pEnvelop.XMax; xmin = pEnvelop.XMin; ymax = pEnvelop.YMax; ymin = pEnvelop.YMin; pDesSpatialReference.SetDomain(xmin, xmax, ymin, ymax); if (pOriSpatialReference.HasZPrecision()) { pOriSpatialReference.GetZDomain(out zmin, out zmax); pDesSpatialReference.SetZDomain(zmin, zmax); } if (pOriSpatialReference.HasMPrecision()) { pOriSpatialReference.GetMDomain(out mMin, out mMax); pDesSpatialReference.SetMDomain(mMin, mMax); } pGeometryDefEdit.SpatialReference_2 = pDesSpatialReference; } //修改grid的大小 if (pGeometryDef.GridCount != 0) { if (pGeometryDef.get_GridSize(0) < 100) { pGeometryDefEdit.set_GridSize(0, 100); } } bIsAddField = true; } if (bIsAddField == true) { pFieldsEdit.AddField(pCreateField); bIsAddField = false; } } } return(pFieldsEdit); }
public IFields get_Fields(int ClassIndex) { IFieldEdit fieldEdit; IFields fields; IFieldsEdit fieldsEdit; IObjectClassDescription fcDesc; if (this.DatasetType == esriDatasetType.esriDTTable) { fcDesc = new ObjectClassDescriptionClass(); } else { fcDesc = new FeatureClassDescriptionClass(); } fields = fcDesc.RequiredFields; fieldsEdit = (IFieldsEdit)fields; fieldEdit = new FieldClass(); fieldEdit.Length_2 = 1; fieldEdit.Name_2 = "ColumnOne"; fieldEdit.Type_2 = esriFieldType.esriFieldTypeString; fieldsEdit.AddField((IField)fieldEdit); //HIGHLIGHT: Add extra int column fieldEdit = new FieldClass(); fieldEdit.Name_2 = "Extra"; fieldEdit.Type_2 = esriFieldType.esriFieldTypeInteger; fieldsEdit.AddField((IField)fieldEdit); //HIGHLIGHT: Set shape field geometry definition if (this.DatasetType != esriDatasetType.esriDTTable) { IField field = fields.get_Field(fields.FindField("Shape")); fieldEdit = (IFieldEdit)field; IGeometryDefEdit geomDefEdit = (IGeometryDefEdit)field.GeometryDef; geomDefEdit.GeometryType_2 = geometryTypeByID(ClassIndex); ISpatialReference shapeSRef = this.spatialReference; #region M & Z //M if ((ClassIndex >= 3 && ClassIndex <= 5) || ClassIndex >= 9) { geomDefEdit.HasM_2 = true; shapeSRef.SetMDomain(0, 1000); } else { geomDefEdit.HasM_2 = false; } //Z if (ClassIndex >= 6) { geomDefEdit.HasZ_2 = true; shapeSRef.SetZDomain(0, 1000); } else { geomDefEdit.HasZ_2 = false; } #endregion geomDefEdit.SpatialReference_2 = shapeSRef; } return(fields); }