Arc Engine实现整图缩放 草稿代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geometry;
using System.IO;
using ESRI.ArcGIS.DataSourcesFile;

namespace MapScale
{
    public partial class FrmScale : Form
    {
        IEnumLayer pEnumLayer;
        ILayer pLayer;
        string shpName;

        public FrmScale()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            double n = double.Parse(textBox1.Text.Trim());
            if (n > 0)
            {
                pEnumLayer = axMapControl1.Map.get_Layers();
                while ((pLayer = pEnumLayer.Next()) != null)
                {
                    IDataLayer pDataLayer = pLayer as IDataLayer;
                    IWorkspaceName pWorkspaceName = ((IDatasetName)pDataLayer.DataSourceName).WorkspaceName;
                    string shpPath = pWorkspaceName.PathName;
                    shpName = System.IO.Path.Combine(shpPath, pLayer.Name + ".shp");

                    IFeatureLayer pFeatureLayer;
                    IFeature pFeature;
                    IFeatureClass pFeatureClass;
                    IQueryFilter pQueryFilter = new QueryFilterClass();
                    pQueryFilter.WhereClause = "FID>=0";
                    pFeatureLayer = pLayer as IFeatureLayer;
                    pFeatureClass = pFeatureLayer.FeatureClass;

                    ExportFeatureClassToShp(shpName, pFeatureClass);

                    double xLength = pLayer.AreaOfInterest.XMax - pLayer.AreaOfInterest.Width / 2;
                    double yLength = pLayer.AreaOfInterest.YMax - pLayer.AreaOfInterest.Width / 2;
                    IPoint pPoint = new PointClass();
                    pPoint.PutCoords(xLength, yLength);
                    for (int i = 0; i < pFeatureClass.FeatureCount(pQueryFilter); i++)
                    {
                        pFeature = pFeatureClass.GetFeature(i);
                        ITransform2D pTransform = pFeature.ShapeCopy as ITransform2D;
                        pTransform.Scale(pPoint, n, n);
                        pFeature.Shape = (IGeometry)pTransform;
                        pFeature.Store();
                    }
                    axMapControl1.ActiveView.Refresh();
                }
                MessageBox.Show("Completed!");
            }
        }

        private string CreateScalePath()
        {
            ILayer pLayer = axMapControl1.Map.get_Layer(0);
            IDataLayer pDataLayer = pLayer as IDataLayer;
            IWorkspaceName pWorkspaceName = ((IDatasetName)pDataLayer.DataSourceName).WorkspaceName;
            string shpPath = pWorkspaceName.PathName;
            DirectoryInfo pDirectionary = Directory.CreateDirectory(shpPath+"\\Scale");
            string folderShp = pDirectionary.FullName;
            return folderShp;
        }

        private void GetShpPath()
        {
            IEnumLayer pEnumLayer = axMapControl1.Map.get_Layers();
            ILayer pLayer;
            while((pLayer=pEnumLayer.Next())!=null)
            {
                IDataLayer pDataLayer = pLayer as IDataLayer;
                IWorkspaceName pWorkspaceName = ((IDatasetName)pDataLayer.DataSourceName).WorkspaceName;
                string shpPath = pWorkspaceName.PathName;
                shpName = System.IO.Path.Combine(shpPath, pLayer.Name + ".shp");
            }
        }

        public void ExportFeatureClassToShp(string sPath, IFeatureClass pFeatureClass)//绝对路径和想要导出的要素类
        {
            try
            {
                string ExportFileShortName = System.IO.Path.GetFileNameWithoutExtension(sPath)+"_scale";
                string folderShp = CreateScalePath();
                if (ExportFileShortName == "")
                {
                    ExportFileShortName = (pFeatureClass as IDataset).Name+"_scale";
                }
                //设置导出要素类的参数   
                IFeatureClassName pOutFeatureClassName = new FeatureClassNameClass();
                IDataset pOutDataset = (IDataset)pFeatureClass;
                pOutFeatureClassName = (IFeatureClassName)pOutDataset.FullName;
                //创建一个输出shp文件的工作空间   
                IWorkspaceFactory pShpWorkspaceFactory = new ShapefileWorkspaceFactoryClass();
                IWorkspaceName pInWorkspaceName = new WorkspaceNameClass();
                pInWorkspaceName = pShpWorkspaceFactory.Create(folderShp, ExportFileShortName, null, 0);

                //创建一个要素集合   
                IFeatureDatasetName pInFeatureDatasetName = null;
                //创建一个要素类   
                IFeatureClassName pInFeatureClassName = new FeatureClassNameClass();
                IDatasetName pInDatasetClassName;
                pInDatasetClassName = (IDatasetName)pInFeatureClassName;
                pInDatasetClassName.Name = ExportFileShortName;//作为输出参数   
                pInDatasetClassName.WorkspaceName = pInWorkspaceName;
                //通过FIELDCHECKER检查字段的合法性,为输出SHP获得字段集合   
                long iCounter;
                IFields pOutFields, pInFields;

                IField pGeoField;
                IEnumFieldError pEnumFieldError = null;
                pInFields = pFeatureClass.Fields;
                IFieldChecker pFieldChecker = new FieldChecker();
                pFieldChecker.Validate(pInFields, out pEnumFieldError, out pOutFields);
                //通过循环查找几何字段   
                pGeoField = null;
                for (iCounter = 0; iCounter < pOutFields.FieldCount; iCounter++)
                {
                    if (pOutFields.get_Field((int)iCounter).Type == esriFieldType.esriFieldTypeGeometry)
                    {
                        pGeoField = pOutFields.get_Field((int)iCounter);
                        break;
                    }
                }
                //得到几何字段的几何定义   
                IGeometryDef pOutGeometryDef;
                IGeometryDefEdit pOutGeometryDefEdit;
                pOutGeometryDef = pGeoField.GeometryDef;
                //设置几何字段的空间参考和网格   
                pOutGeometryDefEdit = (IGeometryDefEdit)pOutGeometryDef;
                pOutGeometryDefEdit.GridCount_2 = 1;
                pOutGeometryDefEdit.set_GridSize(0, 1500000);

                //开始导入   
                IFeatureDataConverter pShpToClsConverter = new FeatureDataConverterClass();
                pShpToClsConverter.ConvertFeatureClass(pOutFeatureClassName, null, pInFeatureDatasetName, pInFeatureClassName, pOutGeometryDef, pOutFields, "", 1000, 0);
            }
            catch (Exception)
            {
                throw;
            }
        }
    }
}

posted on 2012-12-29 00:51  maphey  阅读(309)  评论(0编辑  收藏  举报