gis 导出 dwg,shp

  当我们在webgis 想要把某个地块或者多个地块导出dwg或者shp文件的时候怎么办?这个时候最好就是用后台的方式。首先把web gis上的graphic 的polygon提取为坐标的形式(类似于x,y x,y x,y),如果这个图形你知道在某个sde库的,也可以提取它的主键属性信息,方便在后台直接查询,减少坐标传输,地块特别大的很麻烦。后台首先要把坐标存到一个内存的featureclass

 1         //创建内存图层 
 2         private IFeatureClass createMemoryFeatureClass(string coord)
 3         {
 4             IField oField = new FieldClass();
 5             IFields oFields = new FieldsClass();
 6             IGeometryDef geometryDef = new GeometryDefClass();
 7 
 8             IWorkspaceFactory workspaceFactory = new InMemoryWorkspaceFactoryClass();
 9             IWorkspaceName workspaceName = workspaceFactory.Create("", "MyWorkspace", null, 0);
10             IName name = (IName)workspaceName;
11             IWorkspace inmemWorkSpace = (IWorkspace)name.Open();
12 
13             IFieldsEdit oFieldsEdit = null;
14             IFieldEdit oFieldEdit = null;
15 
16             IFeatureLayer oFeatureLayer = null;
17             IFeatureClass outputFeatureClass = null;
18             IFeatureCursor outputFeatureCursor = null;
19             try
20             {
21 
22                 oFieldsEdit = oFields as IFieldsEdit;
23                 oFieldEdit = oField as IFieldEdit;
24 
25                 IGeometryDefEdit geometryDefEdit = (IGeometryDefEdit)geometryDef;
26                 geometryDefEdit.AvgNumPoints_2 = 5;
27                 geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolygon;
28                 geometryDefEdit.GridCount_2 = 1;
29                 geometryDefEdit.HasM_2 = false;
30                 geometryDefEdit.HasZ_2 = false;
31 
32                 //ISpatialReferenceFactory ispfac = new SpatialReferenceEnvironmentClass();
33                 //IGeographicCoordinateSystem igeocoorsys = ispfac.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984);
34                 //igeocoorsys.SetDomain(76000, 180000, 0, 104000);
35                 geometryDefEdit.SpatialReference_2 = getSpatialReference();
36 
37                 oFieldEdit.Name_2 = "SHAPE";
38                 oFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
39                 oFieldEdit.GeometryDef_2 = geometryDef;
40                 oFieldEdit.IsNullable_2 = true;
41                 oFieldEdit.Required_2 = true;
42                 oFieldsEdit.AddField(oField);
43 
44                 outputFeatureClass = (inmemWorkSpace as IFeatureWorkspace).CreateFeatureClass("selectedPoints", oFields, null, null, esriFeatureType.esriFTSimple, "SHAPE", "");
45                 outputFeatureCursor = outputFeatureClass.Insert(true);
46                 IFeatureBuffer outputFeatureBuffer = outputFeatureClass.CreateFeatureBuffer();
47 
48                 IWorkspaceEdit inmemWorkspaceEdit = inmemWorkSpace as IWorkspaceEdit;
49                 inmemWorkspaceEdit.StartEditing(false);      //Start Editing
50                 inmemWorkspaceEdit.StartEditOperation();
51                 if (coord != "")
52                 {
53                     outputFeatureBuffer.Shape = ArcGISUtil.StringToPolygon(coord);
54                     outputFeatureCursor.InsertFeature(outputFeatureBuffer);
55 
56                 }
57                 inmemWorkspaceEdit.StopEditOperation();
58                 inmemWorkspaceEdit.StopEditing(true);
59 
60                 IGeoDataset outputGeodataset = (IGeoDataset)outputFeatureClass;
61 
62 
63 
64                 oFeatureLayer = new FeatureLayerClass();
65                 oFeatureLayer.FeatureClass = outputFeatureClass;
66                 oFeatureLayer.Name = "fa";
67             }
68             catch (Exception e)
69             {
70                 System.Diagnostics.Trace.WriteLine(e.StackTrace);
71             }
72             finally
73             {
74                 ArcGISUtil.FinalReleaseComObject(outputFeatureCursor);
75                 ArcGISUtil.FinalReleaseComObject(oField);
76                 ArcGISUtil.FinalReleaseComObject(oFields);
77                 ArcGISUtil.FinalReleaseComObject(geometryDef);
78                 ArcGISUtil.FinalReleaseComObject(workspaceFactory);
79                 ArcGISUtil.FinalReleaseComObject(outputFeatureClass);
80             }
81             return oFeatureLayer.FeatureClass;
82         }

  得到的内存图层,如果是要转shp,可以直接转,如果是要转dwg,先要转为gdb,直接转dwg会失败,目前找不到原因。

 1  //要素转shp 或者gdb
 2         private void feature2GDB(IFeatureClass sourceFeatureClass, IQueryFilter pQueryFilter, string name, string type, string _fileShortName)
 3         {
 4             try
 5             {
 6                 string fileShortName = string.Empty;
 7                 if (type == "gdb")
 8                 {
 9                     fileShortName = _fileShortName;                  
10                    
11                 }
12                 else
13                 {
14                     fileShortName = name;
15                 }
16 
17                 string parentDirectory = HttpContext.Current.Server.MapPath(@"\Checkservices\gdbpath\");
18 
19                 IFeatureClassName sourceFeatureClassName = new FeatureClassNameClass();
20                 IDataset pOutDataset = (IDataset)sourceFeatureClass;
21                 sourceFeatureClassName = (IFeatureClassName)pOutDataset.FullName;
22 
23                 IWorkspaceFactory wsf = null;
24                 if (type == "gdb")
25                 {
26                     wsf = new FileGDBWorkspaceFactoryClass();
27                 }
28                 else if (type == "shp")
29                 {
30                     wsf = new ShapefileWorkspaceFactoryClass();
31                 }
32 
33                 IWorkspaceName pInWorkspaceName = new WorkspaceNameClass();
34                 pInWorkspaceName = wsf.Create(parentDirectory, name, null, 0);
35 
36                 IFeatureClassName pInFeatureClassName = new FeatureClassNameClass();
37                 IDatasetName pInDatasetClassName;
38                 pInDatasetClassName = (IDatasetName)pInFeatureClassName;
39                 pInDatasetClassName.Name = fileShortName;
40                 pInDatasetClassName.WorkspaceName = pInWorkspaceName;
41 
42                 long iCounter;
43                 IFields pOutFields, pInFields;
44                 IField pGeoField;
45                 IEnumFieldError pEnumFieldError = null;
46                 pInFields = sourceFeatureClass.Fields;
47                 IFieldChecker pFieldChecker = new FieldChecker();
48                 //pFieldChecker.InputWorkspace = pOutDataset.Workspace;
49 
50                 pFieldChecker.Validate(pInFields, out pEnumFieldError, out pOutFields);
51                 pGeoField = null;
52                 for (iCounter = 0; iCounter < pOutFields.FieldCount; iCounter++)
53                 {
54                     if (pOutFields.get_Field((int)iCounter).Type == esriFieldType.esriFieldTypeGeometry)
55                     {
56                         pGeoField = pOutFields.get_Field((int)iCounter);
57                         break;
58                     }
59                 }
60 
61                 IGeometryDef pOutGeometryDef;
62                 IGeometryDefEdit pOutGeometryDefEdit;
63                 pOutGeometryDef = pGeoField.GeometryDef;
64                 pOutGeometryDefEdit = (IGeometryDefEdit)pOutGeometryDef;
65 
66                 IFeatureDataConverter pShpToClsConverter = new FeatureDataConverterClass();
67                 pShpToClsConverter.ConvertFeatureClass(sourceFeatureClassName, pQueryFilter,
68                     null, pInFeatureClassName, pOutGeometryDef, pOutFields, "", 1000, 0);
69 
70                 ArcGISUtil.FinalReleaseComObject(wsf);
71                 ArcGISUtil.FinalReleaseComObject(pInWorkspaceName);
72                 ArcGISUtil.FinalReleaseComObject(pInFeatureClassName);
73                 ArcGISUtil.FinalReleaseComObject(pFieldChecker);
74                 ArcGISUtil.FinalReleaseComObject(pShpToClsConverter);
75             }
76             catch (Exception e)
77             {
78                 System.Diagnostics.Trace.WriteLine(e.StackTrace);
79             }
80         }
81 
82         private IFeatureClass openFeatureClass(String layerName, String sde)
83         {
84             IFeatureClass fc = null;
85             try
86             {
87                 fc = SdeConnectManager.getFeatureClass(layerName, sde);
88             }
89             catch
90             {
91                 return null;
92             }
93             return fc;
94         }

  要转dwg可以直接调用AO接口

 1         private void gdb2Cad(string gdbfilePath, string cadfilePath, int num = 0)
 2         {
 3             Geoprocessor gp = new Geoprocessor();
 4             try
 5             {              
 6                 ExportCAD tool = new ExportCAD();
 7                 tool.in_features = gdbfilePath;
 8                 tool.Output_File = cadfilePath;
 9                 tool.Output_Type = "DWG_R2004";
10                 gp.Execute(tool, null);
11             }
12             catch (Exception e)
13             {
14                 System.Diagnostics.Trace.WriteLine(e.StackTrace);
15                 System.Diagnostics.Trace.Write("dwg");
16             }
17         }

  但是如果导出dwg图形有注记的话,AO这个方法就行不通了,貌似arcgis对导出dwg图形带标注支持的不好,后面会有专门的文章讲怎么导出带有注记的dwg。

 

转载于:https://www.cnblogs.com/haibalai/p/5032227.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ARCGIS的数据转换CAD流程(2009-04-23 09:10:44)标签:it 分类:GIS及相关专业技术 工作中,一点点摸索,终于能够导出CAD图了,感谢我的姐姐,一起分享收获的快乐: GIS数据导出CAD流程 1、 打开GIS系统,在TOC中的layers右键属性→general→reference scale→输入1000(CAD中要求字体越小,这个数也越小,经验),→确定 2、 选中作要范围的图层数据。法一、用DRAW工具条中的New Rectangle 或New Polygon 在图上画出范围,单击菜单selection的select by Graphics工具,即可选中所要范围的数据图层。法二、直接使用标准工具条中的select Features工具,选出所要范围数据。法三、另建一*.shp图层(polygon),画出所要求范围(多边形),然后运用菜单selection的select by location工具进行选择。 前提:所需的各层数据都可选择。(Set Selectable layers 进行选择) 3、 图层标注的文字属性导出。右键→属性,首先保证label选中。单击Convert labels to Annotation,打开对话框,store Annotation 选 in a database, Create Annotation for 选择selected features, 将下面表格里的feature linked的√去掉,此时出现文件夹图标,选择保存位置。确定。(默认为该图层所在的文件位置) 4、 所选图层数据保存到新建的Database里。 5、 打开ArcToolBox或者ArcCatalog,导出CAD文件 6、 打开导出CAD文件,未看到图。单击全部缩放工具,此时出现一个白点,挪动,放大。看到点线面,而没有注记文字。 7、显示注记文字。关闭所有点线面图层,打开图层特性管理器,只保留注记层,确定。在点线面的位置圈选,可看到选中标记,颜色选择任何(除了纯白色纯黑色)颜色,将字体样式改为宋体。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值