xiaogua
路人甲
路人甲
  • 注册日期2006-04-06
  • 发帖数6
  • QQ
  • 铜币128枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:3125回复:7

如何实现在MAP空间里选择一块区域打印

楼主#
更多 发布于:2006-11-13 11:57
如何实现在MAP空间里选择一块区域打印?用ARCENGINE里的对象实现,大家都来说说啊
喜欢0 评分0
hover
路人甲
路人甲
  • 注册日期2005-12-13
  • 发帖数69
  • QQ
  • 铜币279枚
  • 威望0点
  • 贡献值0点
  • 银元0个
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>
承接、合作各种GIS项目开发 :ArcGIS平(基于AO、AE、ArcIMS、ArcServer开发) :MapInfo平台(基于MapXtreme 2004/2005、MapXtreme For Java开发) E-Mail:cmcrj0929@163.com QQ:31814576 有国土、市政、交通、电力等行业的成功应用项目经验。
举报 回复(0) 喜欢(0)     评分
linton_lau
路人甲
路人甲
  • 注册日期2005-04-19
  • 发帖数30
  • QQ
  • 铜币277枚
  • 威望0点
  • 贡献值0点
  • 银元0个
2楼#
发布于:2006-11-24 21:06
<P>谢谢共享。也学习下</P>
举报 回复(0) 喜欢(0)     评分
liu_puma
路人甲
路人甲
  • 注册日期2004-11-13
  • 发帖数29
  • QQ
  • 铜币200枚
  • 威望0点
  • 贡献值0点
  • 银元0个
3楼#
发布于:2006-11-30 10:20
<P>学习</P>
举报 回复(0) 喜欢(0)     评分
bluewood_cn
路人甲
路人甲
  • 注册日期2004-04-19
  • 发帖数118
  • QQ
  • 铜币551枚
  • 威望0点
  • 贡献值0点
  • 银元0个
4楼#
发布于:2006-12-01 13:06
<P>稍微麻烦了点。哈哈。有更好的方法。</P>
<P>看接口 IDisplay::put_ClipGeometry ()</P>
<P>这个方法可以指定显示的范围,从而满足指定区域打印的问题。</P>
举报 回复(0) 喜欢(0)     评分
smilewoo
路人甲
路人甲
  • 注册日期2006-01-04
  • 发帖数1
  • QQ
  • 铜币134枚
  • 威望0点
  • 贡献值0点
  • 银元0个
5楼#
发布于:2006-12-06 16:29
<P>5楼的很简单,2楼的麻烦了点</P>
<P>还有类似5楼的方法,imap:clipgeometry,也可以达到目的</P>
举报 回复(0) 喜欢(0)     评分
hover
路人甲
路人甲
  • 注册日期2005-12-13
  • 发帖数69
  • QQ
  • 铜币279枚
  • 威望0点
  • 贡献值0点
  • 银元0个
6楼#
发布于:2006-12-06 22:36
<P>嗯,这个接口不错.以前都没有注意看这个.</P>
<P>不过,上面的方法,可以用于做导出切边的时候用.</P>
<P>例如以标准图幅把数据导出到CAD格式的时候,就可以用到这个方法让导出来的数据和用CAD制图一样的效果.</P>
承接、合作各种GIS项目开发 :ArcGIS平(基于AO、AE、ArcIMS、ArcServer开发) :MapInfo平台(基于MapXtreme 2004/2005、MapXtreme For Java开发) E-Mail:cmcrj0929@163.com QQ:31814576 有国土、市政、交通、电力等行业的成功应用项目经验。
举报 回复(0) 喜欢(0)     评分
zyr987503101
路人甲
路人甲
  • 注册日期2012-11-22
  • 发帖数9
  • QQ
  • 铜币131枚
  • 威望0点
  • 贡献值0点
  • 银元0个
7楼#
发布于:2012-11-22 11:40
求助C# 整幅地区打印
如何你行你一定要,如果你要你一定行!
举报 回复(0) 喜欢(0)     评分
游客

返回顶部