• C# ArcEngine创建内存图层(转载)


    C#+Arcengine---创建内存图层

    分类:技术文档
    2009-12-11 14:43阅读(1498)评论(0)

        

      #region 在内存中创建图层
            /// <summary>
            /// 在内存中创建图层
            /// </summary>
            /// <param name="DataSetName">数据集名称</param>
            /// <param name="AliaseName">别名</param>
            /// <param name="SpatialRef">空间参考</param>
            /// <param name="GeometryType">几何类型</param>
            /// <param name="PropertyFields">属性字段集合</param>
            /// <returns>IfeatureLayer</returns>
            public static IFeatureLayer CreateFeatureLayerInmemeory(string DataSetName, string AliaseName, ISpatialReference SpatialRef, esriGeometryType GeometryType, IFields PropertyFields)
            {
                IWorkspaceFactory workspaceFactory = new InMemoryWorkspaceFactoryClass();
                ESRI.ArcGIS.Geodatabase.IWorkspaceName workspaceName = workspaceFactory.Create("", "MyWorkspace", null, 0);
                ESRI.ArcGIS.esriSystem.IName name = (IName)workspaceName;
                ESRI.ArcGIS.Geodatabase.IWorkspace inmemWor = (IWorkspace)name.Open();

                IField oField = new FieldClass();
                IFields oFields = new FieldsClass();
                IFieldsEdit oFieldsEdit = null;
                IFieldEdit oFieldEdit = null;
                IFeatureClass oFeatureClass = null;
                IFeatureLayer oFeatureLayer = null;

                try
                {
                    oFieldsEdit = oFields as IFieldsEdit;
                    oFieldEdit = oField as IFieldEdit;

                    for (int i = 0; i < PropertyFields.FieldCount; i++)
                    {
                        oFieldsEdit.AddField(PropertyFields.get_Field(i));
                    }

                    IGeometryDef geometryDef = new GeometryDefClass();
                    IGeometryDefEdit geometryDefEdit = (IGeometryDefEdit)geometryDef;
                    geometryDefEdit.AvgNumPoints_2 = 5;
                    geometryDefEdit.GeometryType_2 = GeometryType;
                    geometryDefEdit.GridCount_2 = 1;
                    geometryDefEdit.HasM_2 = false;
                    geometryDefEdit.HasZ_2 = false;
                    geometryDefEdit.SpatialReference_2 = SpatialRef;
                    geometryDefEdit.SpatialReference_2 = new UnknownCoordinateSystemClass();//没有这一句就报错,说尝试读取或写入受保护的内存。
                    geometryDefEdit.SpatialReference.SetDomain(-200, 200, -200, 200);//没有这句就抛异常来自HRESULT:0x8004120E。


                    oFieldEdit.Name_2 = "SHAPE";
                    oFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
                    oFieldEdit.GeometryDef_2 = geometryDef;
                    oFieldEdit.IsNullable_2 = true;
                    oFieldEdit.Required_2 = true;
                    oFieldsEdit.AddField(oField);

                    oFeatureClass = (inmemWor as IFeatureWorkspace).CreateFeatureClass(DataSetName, oFields, null, null, esriFeatureType.esriFTSimple, "SHAPE", "");
                    (oFeatureClass as IDataset).BrowseName = DataSetName;

                    oFeatureLayer = new FeatureLayerClass();
                    oFeatureLayer.Name = AliaseName;
                    oFeatureLayer.FeatureClass = oFeatureClass;
                }
                catch
                {
                }
                return oFeatureLayer;
            }

            #endregion

            

            下面就是根据采集的坐标点创建点内存图层:

                IFeatureLayer pFeatureLayer = new FeatureLayerClass();
                IFieldsEdit curFileds = new FieldsClass();
                IFieldEdit curField = new FieldClass();
                curField = new FieldClass();
                curField.Name_2 = "名称";
                curField.Type_2 = esriFieldType.esriFieldTypeString;
                curFileds.AddField(curField);

                curField = new FieldClass();
                curField.Name_2 = "经度";
                curField.Type_2 = esriFieldType.esriFieldTypeDouble;
                curFileds.AddField(curField);

                curField = new FieldClass();
                curField.Name_2 = "纬度";
                curField.Type_2 = esriFieldType.esriFieldTypeDouble;
                curFileds.AddField(curField);

                pFeatureLayer = CreateFeatureLayerInmemeory("Position", "采集点", new     UnknownCoordinateSystemClass(), esriGeometryType.esriGeometryPoint, curFileds as IFields);
                p_axMap.AddLayer(pFeatureLayer as ILayer);
                IFeatureCursor FeatureCursor;
                IFeature pFeature;
                IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
                pFeature = pFeatureClass.CreateFeature();
                IQueryFilter pQueryFilter = new QueryFilterClass();
                FeatureCursor = pFeatureClass.Search(pQueryFilter, true);
                pQueryFilter.WhereClause = null;
                pFeature = FeatureCursor.NextFeature();
                pFeature.set_Value(0, str1);
                pFeature.set_Value(1, x);
                pFeature.set_Value(2, y);
                IEnvelope pEnvelope = new EnvelopeClass();

                //如果双击的对象是一个点,这样子才能够缩放到该点
                pEnvelope.PutCoords(0, 0, 0.3, 0.3);//确定envelope大小

                IPoint xpoint = new PointClass();
                xpoint.PutCoords(x, y);

                pFeature.Shape = xpoint;
                pFeature.Store();

                //设置颜色
                IRgbColor pcolor = new RgbColorClass();

                pcolor.Red = 255;

                pcolor.Green = 0;

                pcolor.Blue = 0;

                //设置图形
                ISimpleMarkerSymbol psm = new SimpleMarkerSymbolClass();
                psm.Style = esriSimpleMarkerStyle.esriSMSCircle;
                psm.Size = 10;
                psm.Color = pcolor;         

                (pFeatureLayer as IFeatureSelection).SelectionSymbol = (ISymbol)psm;
                (pFeatureLayer as IFeatureSelection).SetSelectionSymbol = true;

                (pFeatureLayer as IFeatureSelection).SelectionSet.Add(pFeature.OID);

                pEnvelope.CenterAt(xpoint);//地图缩放到该点       
                p_axMap.Extent = pEnvelope;
                p_axMap.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, pFeatureLayer, null);
                p_axMap.ActiveView.ScreenDisplay.UpdateWindow();

  • 相关阅读:
    nginx 之 proxy_redirect详解【转】
    Gitee整改之思考
    YCFramework版本更新:V1.0.8
    Android 调整屏幕分辩率
    [RxJS] mergeMap, concatMap, exhaustMap: execute order
    [HTML 5] Page Visibility API
    [Angular 14] Providers in Angular Route
    [Typescript] Awaited Type
    [Angular 14] Inject() function
    圣杯布局和双飞翼布局实现两侧宽度固定,中间宽度自适应及其他扩展实现
  • 原文地址:https://www.cnblogs.com/bobzhangfw/p/3423402.html
Copyright © 2020-2023  润新知