arc engine 实现在在3°分带下,有带号和无带号转换。

我们国家的投影坐标系主要采用高斯-克吕格投影,分为6度和3度分带投影,1:2.5万-1:50万比例尺地形图采用经差6度分带,1:1万比例尺的地形图采用经差3度分带。具体分带法是:6度分带从本初子午线(prime meridian)开始,按经差6度为一个投影带自西向东划分,全球共分60个投影带,中国跨13-23带;3度投影带是从东经1度30分经线(1.5°)开始,按经差3度为一个投影带自西向东划分,全球共分120个投影带,中国跨25-45带。

GCS_China_Geodetic_Coordinate_System_2000

CGCS2000_3_degree_GK_CM123E—三度分带下的41带投影(横坐标没有带号)
CGCS2000_3_degree_GK_Zone_41—三度分带下的41带投影(横坐标有带号)
CGCS2000_GK_CM_123E-六度分带下的21带投影(横坐标没有带号)
CGCS2000_GK_Zone_21-六度分带下的21带投影(横坐标有带号)

需求:在3°分带下,实现有带号和无带号转换。如图:
在这里插入图片描述
在这里插入图片描述
在3°分度带下,利用wkid进行坐标转换。
在这里插入图片描述

在这里插入图片描述

代码:

private void button2_Click(object sender, EventArgs e)
        {
            if (this.textin.Text == string.Empty || this.textout.Text == string.Empty)
            {
                return;
            }
            string inpath = this.textin.Text;
            string outpath = this.textout.Text;
            CopyFolder(inpath, outpath);

            FileGDBWorkspaceFactory pOpenFileGDBWorkspaceFactory = new FileGDBWorkspaceFactoryClass();
            IWorkspace pOpenWorkspace2 = pOpenFileGDBWorkspaceFactory.OpenFromFile(outpath, 0);
            CoordSysConvert(pOpenWorkspace2);

            string str1 = GetFeatureClass(pOpenWorkspace2).ToArray()[0];
            IFeatureWorkspace pFeatureWorkspace = pOpenWorkspace2 as IFeatureWorkspace;
            IFeatureClass pFeatureClass = pFeatureWorkspace.OpenFeatureClass(str1);
            IGeoDataset pGeoDataset = (IGeoDataset)pFeatureClass;

            ISpatialReference pSpatialReference = pGeoDataset.SpatialReference;
            string spatialrefName = pSpatialReference.Name;
            this.textoutinfo.Text = spatialrefName;
        }
        //遍历数据集并 进行带号转换
        public List<string> CoordSysConvert(IWorkspace workspace)
        {
            List<string> listFeaClass = new List<string>();
            try
            {
                //遍历工作空间下的featureclass
                IFeatureWorkspace pFeatureWorkspace = workspace as IFeatureWorkspace;
                IEnumDataset pEnumDatasets = workspace.get_Datasets(esriDatasetType.esriDTAny) as IEnumDataset;
                IDataset pDataset = pEnumDatasets.Next();

                int inbnvalue = Convert.ToInt32(this.textbn.Text);
                int cm = Convert.ToInt32(this.textCM.Text);
                int solidCM = cm / 3;
                *斜体样式*
                //this.textbn.Text;
                while (pDataset != null)
                {
                    if (pDataset.Type == esriDatasetType.esriDTFeatureClass)
                    {
                        IGeoDataset pGeoDataset = pDataset as IGeoDataset;
                        ISpatialReference pSpatialReference = pGeoDataset.SpatialReference;
                        string spatialrefName = pSpatialReference.Name;

                        //int code = (pSpatialReference as IProjectedCoordinateSystem).FactoryCode;
                        int code = pSpatialReference.FactoryCode;  
                        if (spatialrefName.IndexOf("E") != 0)
                        {
                            IGeoDatasetSchemaEdit pGeoDatasetSchemaEdit = pGeoDataset as IGeoDatasetSchemaEdit;
                            ISpatialReferenceFactory3 pSpaRefFactory = new SpatialReferenceEnvironmentClass();
                            IProjectedCoordinateSystem pNewProSys = pSpaRefFactory.CreateProjectedCoordinateSystem(inbnvalue - solidCM + code - 21);
                            if (pGeoDatasetSchemaEdit.CanAlterSpatialReference == true)
                                pGeoDatasetSchemaEdit.AlterSpatialReference(pNewProSys);
                        }
                    }
                    else if (pDataset.Type == esriDatasetType.esriDTFeatureDataset)
                    {
                        IGeoDataset pGeoDataset = pDataset as IGeoDataset;
                        ISpatialReference pSpatialReference = pGeoDataset.SpatialReference;
                        string spatialrefName = pSpatialReference.Name;
                        //int code = (pSpatialReference as IProjectedCoordinateSystem).FactoryCode;
                        int code = pSpatialReference.FactoryCode;
                         if (spatialrefName.IndexOf("E") != 0)
                         {
                             IGeoDatasetSchemaEdit pGeoDatasetSchemaEdit = pGeoDataset as IGeoDatasetSchemaEdit;
                             ISpatialReferenceFactory3 pSpaRefFactory = new SpatialReferenceEnvironmentClass();
                             IProjectedCoordinateSystem pNewProSys = pSpaRefFactory.CreateProjectedCoordinateSystem(inbnvalue - solidCM + code - 21);
                             if (pGeoDatasetSchemaEdit.CanAlterSpatialReference == true)
                                 pGeoDatasetSchemaEdit.AlterSpatialReference(pNewProSys);
                         }
                    }
                    pDataset = pEnumDatasets.Next();
                }
                MessageBox.Show("转换成功!");
            }
            catch (Exception ex)
            {
                return null;
            }
            return listFeaClass;
        }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值