我们国家的投影坐标系主要采用高斯-克吕格投影,分为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;
}