阅读:3336回复:7
如何实现在MAP空间里选择一块区域打印
如何实现在MAP空间里选择一块区域打印?用ARCENGINE里的对象实现,大家都来说说啊
|
|
1楼#
发布于:2006-11-18 09:19
<P>先把选择的区域对每一个图层做区域切割进保存为shap文件在本地.</P>
<P>在对每一个图层做shap文件保存的时候,同时把保存好的shap文件用本地文件的方式加载到一个MapControl控件(或者其它控件,我是自己用PictureBox来显示地图的).</P> <P>然后通过控件把显示的地图数据打印出来就可以了.</P> <P>其中对图层进行切割的代码如下:</P> <P>'‖=================================================<BR>'‖TrimFeatureClass2ShpFile: 裁剪到shape文件<BR>'‖<BR>'‖pFC: 裁剪的实体类<BR>'‖pPolygon: 裁剪的范围<BR>'‖strShpFileName: 输出的shape文件名<BR>'‖bShowProgress: 是否显示进度条<BR>'‖pTrimedFeatureClass:输出的FeatureClass<BR>'‖返回:输出的FeatureClass,nothing - 失败<BR>'‖=================================================<BR>Public Function TrimFeatureClass2ShpFile(pFC As esriGeoDatabase.IFeatureClass, pPolygon As esriGeometry.IPolygon, strShpFileName As String, bShowProgress As Boolean) As esriGeoDatabase.IFeatureClass</P> <P> On Error GoTo ErrorHandler</P> <P> Set TrimFeatureClass2ShpFile = Nothing</P> <P> Dim i As Long<BR> Dim pos As Long<BR> Dim pFeatureCursor As esriGeoDatabase.IFeatureCursor<BR> Dim pFeature As esriGeoDatabase.IFeature<BR> Dim pNewFeatureCursor As esriGeoDatabase.IFeatureCursor<BR> Dim pTopologicalOperator As esriGeometry.ITopologicalOperator<BR> Dim pGeometry As esriGeometry.IGeometry<BR> Dim pFeatureBuffer As esriGeoDatabase.IFeatureBuffer <BR> Dim pFeatureCount As Long<BR> Dim pTrimedFeatureClass As IFeatureClass<BR> Dim nOldPercent As Integer</P> <P> '获取数据库系统时间<BR> <BR> Dim pSpatialFilter As esriGeoDatabase.ISpatialFilter<BR> Set pSpatialFilter = New SpatialFilter<BR> Dim pFeatureLayer As esriCarto.IFeatureLayer</P> <P> With pSpatialFilter<BR> '设置筛选器实体<BR> Set .Geometry = pPolygon<BR> '设置筛选字段<BR> .GeometryField = pFC.ShapeFieldName<BR> '设置空间关系<BR> .SpatialRel = esriSpatialRelIntersects<BR> '设置查询顺序<BR> .SearchOrder = esriSearchOrderSpatial<BR> End With<BR> '获取筛选的实体个数<BR> pFeatureCount = pFC.FeatureCount(pSpatialFilter)<BR> '判断筛选个数为0<BR> If pFeatureCount = 0 Then<BR> Set pSpatialFilter = Nothing<BR> Exit Function<BR> End If</P> <P><BR> '创建新的SHAPE文件<BR> Set pTrimedFeatureClass = CreateNewShapefile(pFC, strShpFileName)<BR> <BR> '判断实体类为空<BR> If pTrimedFeatureClass Is Nothing Then<BR> '设置对象为空<BR> Set pSpatialFilter = Nothing<BR> Exit Function<BR> End If<BR> '获取实体指针<BR> Set pFeatureCursor = pFC.Search(pSpatialFilter, False)<BR> Set pSpatialFilter = Nothing<BR> '获取实体<BR> Set pFeature = pFeatureCursor.NextFeature<BR> nOldPercent = 0<BR> '获取插入实体指针<BR> Set pNewFeatureCursor = pTrimedFeatureClass.Insert(True)<BR> '判断实体不为空<BR> Do While Not pFeature Is Nothing<BR> '创建实体缓冲<BR> Set pFeatureBuffer = pTrimedFeatureClass.CreateFeatureBuffer<BR> If pFC.ShapeType = esriGeometryPolygon Then<BR> ' 若实体类型为面,则做相交<BR> Set pTopologicalOperator = pPolygon<BR> Set pGeometry = pTopologicalOperator.InterSect(pFeature.Shape, esriGeometry2Dimension)<BR> ElseIf pFC.ShapeType = esriGeometryPolyline Then<BR> '若实体类型为线<BR> Set pGeometry = PolygonIntersectPolyline(pPolygon, pFeature.Shape)<BR> ElseIf pFC.ShapeType = esriGeometryPoint Then<BR> ' 若实体类型为点,则全是<BR> Set pGeometry = pFeature.Shape<BR> ElseIf pFC.ShapeType = esriGeometryMultipoint Then<BR> ' 若实体类型为多点<BR> Set pGeometry = PolygonIntersectMultiPoint(pPolygon, pFeature.Shape)<BR> Else<BR> MsgBox "不做任何裁剪!"<BR> ' 若实体类型为除点、线、面外的类型,不做裁剪<BR> Exit Function<BR> End If<BR> '判断实体不为空<BR> If Not pGeometry Is Nothing Then<BR> If Not pGeometry.IsEmpty Then<BR> '获取实体<BR> Set pFeatureBuffer.Shape = pGeometry<BR> For i = 0 To pFeature.Fields.fieldCount - 1<BR> ' 因shape字段最长只能为10位,故只比较前10位<BR> pos = pFeatureBuffer.Fields.FindField(Left(pFeature.Fields.field(i).Name, 10))<BR> If pos >= 0 Then<BR> '判断实体字段类型不为几何类型并且不为OID类型并且字段可编辑并且字段不为空<BR> If Not pFeatureBuffer.Fields.field(pos).Type = esriFieldTypeGeometry And _<BR> Not pFeatureBuffer.Fields.field(pos).Type = esriFieldTypeOID And _<BR> pFeatureBuffer.Fields.field(pos).Editable And _<BR> Not IsNull(pFeature.value(i)) Then<BR> '获取字段值<BR> pFeatureBuffer.value(pos) = pFeature.value(i)<BR> End If<BR> End If<BR> Next i<BR> '插入实体<BR> pNewFeatureCursor.InsertFeature pFeatureBuffer<BR> End If<BR> End If<BR> '获取实体<BR> Set pFeature = pFeatureCursor.NextFeature<BR> <BR> If bShowProgress Then<BR> With frmProgress<BR> '进度条当前值加一<BR> .ProgressBar1.value = .ProgressBar1.value + 1<BR> If Int(.ProgressBar1.value * 100 / .ProgressBar1.Max) > nOldPercent Then<BR> .Statuslbl1.Caption = "正在导出" ; pFC.AliasName ; "层,请稍候..." ; Format(.ProgressBar1.value / .ProgressBar1.Max, "###%")<BR> nOldPercent = Int(.ProgressBar1.value * 100 / .ProgressBar1.Max)<BR> pNewFeatureCursor.Flush<BR> DoEvents<BR> End If<BR> End With<BR> End If<BR> Loop<BR> pNewFeatureCursor.Flush</P> <P> Set TrimFeatureClass2ShpFile = pTrimedFeatureClass<BR> Exit Function<BR>ErrorHandler:<BR> Debug.Print Err.number ; " " ; Err.Description, vbCritical, "TrimFeatureClass"<BR>End Function</P> <P>以上代码要进行调试一下,因为有一些业务代码本人做了删除.</P> |
|
|
2楼#
发布于:2006-11-24 21:06
<P>谢谢共享。也学习下</P>
|
|
3楼#
发布于:2006-11-30 10:20
<P>学习</P>
|
|
4楼#
发布于:2006-12-01 13:06
<P>稍微麻烦了点。哈哈。有更好的方法。</P>
<P>看接口 IDisplay::put_ClipGeometry ()</P> <P>这个方法可以指定显示的范围,从而满足指定区域打印的问题。</P> |
|
5楼#
发布于:2006-12-06 16:29
<P>5楼的很简单,2楼的麻烦了点</P>
<P>还有类似5楼的方法,imap:clipgeometry,也可以达到目的</P> |
|
6楼#
发布于:2006-12-06 22:36
<P>嗯,这个接口不错.以前都没有注意看这个.</P>
<P>不过,上面的方法,可以用于做导出切边的时候用.</P> <P>例如以标准图幅把数据导出到CAD格式的时候,就可以用到这个方法让导出来的数据和用CAD制图一样的效果.</P> |
|
|
7楼#
发布于:2012-11-22 11:40
求助C# 整幅地区打印
|
|
|