ImageVerifierCode 换一换
格式:DOC , 页数:11 ,大小:127.50KB ,
资源ID:3520267      下载积分:20 文钱
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,省得不是一点点
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.wenke99.com/d-3520267.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(MapObejcts组件应用设计(几何对象).doc)为本站会员(sk****8)主动上传,文客久久仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知文客久久(发送邮件至hr@wenke99.com或直接QQ联系客服),我们立即给予删除!

MapObejcts组件应用设计(几何对象).doc

1、MapObjects2 可以处理的几何元素有 Point 、Line 、 Polygon、 Circle、 Rectangle,每种元素定义成一个对象。这些对象统称为 Shape,但没有定义 Shape对象。除了 Point 以外,其它四种都提供了交互式输入方法:TrackLine 、TrackPolygon、 TrackCircle、 TrackRectangle。2.5.1 Point 对象Point 是最简单的对象,语句Dim pt As New MapObjects2.Pointpt.X = 30342pt.Y = 43535建立了一个 Point 实例。2.5.2 Line 及 Po

2、lygon 对象1 图形坐标数据在 MapObjects2 中,Line 与 Polygon 图形都用 Point 的有序集合的集合定义,称为 parts,Point 的有序集合定义一条折线,称为 part,part 的集合命名为 Parts。只有一条折线的 Line 或 Polygon 实例的 Parts 集合中仅含有一个 part。在 Line中 part 的首尾两点不同,在 Polygon 中 part 的首尾两点用一个 Point 表示。下面这段程序取自附属盘中的样例 GeoData 中的 MouseDown 事件过程,程序先根据鼠标位置查出一个省区,然后将省区多边形的坐标串加入到 L

3、ist1 控件中。Dim recs As MapObjects2.Recordset 查询结果记录集Dim curX As Single, curY As Single 鼠标光标位置坐标Case “显示选择的多边形坐标数据 ”Dim pt As MapObjects2.PointDim dist As DoubleSet pt = Map1.ToMapPoint(curX, curY) 根据屏幕坐标建立 point 实例dist = 1000Set recs = Map1.Layers(“china”).SearchByDistance(pt, dist, “”) 按距离查询If recs.E

4、OF Then Exit Sub在列表框中显示省界坐标”Dim shp As PolygonDim pts As MapObjects2.PointsDim i As IntegerDim j As IntegerSet shp = recs(“Shape”).ValueMe.List1.ClearMe.List1.AddItem “Parts.Count = “ & shp.Parts.CountMe.List1.AddItem recs.Fields(“Name”) + “省界坐标”For j = 0 To shp.Parts.Count-1Set pts = shp.Parts(j)Fo

5、r i = 0 To pts.Count - 1Me.List1.AddItem (Str(pts.Item(i).X) & “ “ & Str(pts.Item(i).Y)Next iNext jMap1.Refresh 触发 Map1_AfterTrackingLayerDraw 事件过程,绘制查询结果图End Select2 Points 集合与 Parts 集合在 Polygon 及 Line 对象中,Points 是点的集合,Parts 是 Points 的集合。以下是集合上的常用操作:Dim poly As MapObjects2.PolygonDim pts As MapObje

6、cts2.PointsSet poly = Map1.TrackPolygon 鼠标跟踪绘制一个多边形Set pts = poly.Parts.Item(0) 获得多边形中 Points 集合的引用pts.Remove pts.Count 1 删除多边形上的最后一点Dim pt As New MapObjects2.Pointpt.X = 2300pt.Y = 4500pts.Set 2 , pt 替换 pts 集合中的点 pts.Item(2)pts.Reverse 改变 pts 中点的排列方向在 Polygon 对象中, Points 集合中点的排列方向赋予了特殊的含义。简单Polygon

7、 边界 Points 点按顺时针方向排列。含有岛区的复合 Polygon 的外围边界线点按顺时针方向排列,内部岛区边界线点按逆时针方向排列。Parts 集合是不可创建对象,Polygon 与 Line 的 Parts 属性也是只读的。在创建 Polygon 或 Line 对象的实例同时创建了 Parts 实例,且用 Parts 属性引用Parts 实例。可按如下步骤建立一个完整的 Polygon 实例:1 创建一个 Polygon 对象实例。2 创建 Points 对象实例。3 创建 Point 对象实例,设置它的 X、Y 属性值,用 Pionts.Add 方法添加到Points 实例中。4

8、重复步骤 3,将所有的点加入到 Points 实例中。5 用 Polygon.Parts.Add 方法将 Points 实例加入到 Parts 属性中。单 Part 的 Polygon 用上述 5 步即可建立。 对于多 Part 的 Polygon 重复步骤 5。同理可以建立 Line 实例。2.5.3 几何对象的运算MapObject2 的几何对象共有 6 种,符号常量由枚举表 ShapeTypeConstants 定义如下符号常量 值 对象名moShapeTypePoint 21 PointmoShapeTypeLine 22 LinemoShapeTypePolygon 23 Ployg

9、onmoShapeTypeMultipoint 24 PointsmoShapeTypeRectangle 25 RectanglemoShapeTypeEllipse 26 Ellipse六种对象的父对象都是 Object。例:判断几何对象的类型。Dim ObjA As ObjectDim ObjPoint As New MapObjects2.PointDim ObjPolygon As New MapObjects2.PolygonSet ObjA = ObjPointIf ObjA.shapeType = moShapeTypePoint Then Debug.Print “ObjA

10、类型是 Point“Set ObjA = ObjPolygonIf ObjA.shapeType = moShapeTypePolygon Then Debug.Print “objA 的类型是Polygon “几何对象的运算在上表中 6 种对象的实例上进行,由实例的方法完成运算,运算数据来源于实例及实例方法中的参数。1 IsPointInFunction IsPointIn(pt As Point) As Boolean适用对象: Polygon, Rectangle,Ellipse这个方法判断点是否位于几何对象围成的区域中。例:Dim pt as New MapObjects2.Point

11、pt.X = 1200pt.Y = 2000if Not Map1.Extent.IsPointIn(pt) Then Map.Extent 是 Ractangle 对象Map1.CenterAt pt.X, pt.Y 以 pt 为中心显示地图End If2 GetCrossingsFunction GetCrossings(Shape As Object) As Points适用对象: Point,Points,Line, Polygon, Rectangle这个函数计算两个几何图形的交点集合。例:Dim shape As New MapObjects2.LineDim aPoly As N

12、ew MapObjects2.PolygonDim pts As MapObjects2.Points设置 shape 和 aPoly 的 parts 属性值Set pts = aPoly.GetCrossings(shape) 返回交点集合的引用3 Function Union(Shape As Object,Extent) As Object适用对象: Point, Points, Line, Polygon, Rectangle, Ellipse这个函数返回两个几何图形的并。Polygon 和 Rectangle 都表示面,归为同一类类型。参与运算的两个对象应属于同一类型对象。例:Dim

13、 aPoly As MapObjects2.PolygonDim bPoly As MapObjects2.PolygonDim cPoly As MapObjects2.Polygon设置 aPoly 及 bPoly 的 parts 属性值Set cPoly = aPoly.Union(bPoly) 4 IntersectFunction Intersect(Shape As Object,Extent) As Object这个 函数返回两个几何图形的交。句法:Set resultShape = object.Intersect (Shape ,extent)object 可以是: Poin

14、t, Points, Line, Polygon, Rectangle, Ellipse 6 种对象Shape 可以是: Point, Points, Line, Polygon, Rectangle, Ellipse 6 种对象resultShape 的类型随 object 与 Shape 的组合而异,如下表所示resultShape 的类型Shape objectPoint Points Line Polygon Rectangle EllipsePoint Point Point Point Point Point PointPoints Point Point 或PointsPoint

15、 或PointsPoint 或PointsPoint 或PointsPoint 或PointsLine Point Point 或Point 或Line Line LinePoints PointsPolygon Point Point 或PointsLine Polygon Polygong 或RactanglePolygonRectangle Point Point 或PointsLine Polygon或RactagleRactangle Polygon或RactangleEllipse Point Point 或PointsLine Polygon Polygon 或Ractangle

16、Polygon5 DifferenceFunction Difference(Shape As Object,Extent) As Object适用对象: Point, Points, Line, Polygon, Rectangle, Ellipse这个函数返回两个几何图形的差。例:Set cPoly = aPoly.Difference(bPoly)6 XorFunction Xor(Shape As Object,Extent) As Object适用对象: Point, Points, Line, Polygon, Rectangle, Ellipse这个函数返回两个几何图形的异或。例

17、:Set cPoly = aPoly.Xor(bPoly)7 BufferFunction Buffer(distance As Object, Extent) As Object适用对象: Point, Points, Line, Polygon, Rectangle, EllipseBuffer 函数返回边界距离调用对象为 distance 的 Polygon。例:Dim aPoly As MapObjects2.PolygonDim aLine As New MapObjects2.Line设置 aLine 的 Parts 属性值Set aPloly = aLine.Buffer(120

18、)在 MapObjects2 中,Buffer Intersect Difference Union 及 Xor 方法使用整数坐标,具有较高的计算速度。为确保从浮点数转换到整数保持几何操作的一致性,建议使用 Rectangle 型的 Extent 参数,对所有的几何操作使用相同的 Extent参数。若不使用参数 Extent,对相同的 Shape 重复使用几何方法,不同次的结果图形的几何坐标可能会出现计算误差。如果在方法中没有使用 Extent 参数,Mapobjets2 使用两个源 Shape 的外接矩形的并。例 1 在跟踪层画两个 Polygon 求它们的 Xor,用不同的颜色在跟踪层显示

19、源Polygon 和结果 Polygon。完整代码在 XorPolygon 样例目录中。主要代码如下:Dim shape1 As ObjectDim exclOr As BooleanPrivate Sub Form_Load() 设置 PointEvents 在跟踪层中得显示用的符号符号exclOr = FalseMap1.TrackingLayer.SymbolCount = 2With Map1.TrackingLayer.Symbol(0).SymbolType = moFillSymbol 面(区域).Style = moGrayFill 半透明填充.Color = moCyan.O

20、utlineColor = moCyanEnd WithWith Map1.TrackingLayer.Symbol(1).SymbolType = moFillSymbol.Style = moGrayFill 半透明填充.Color = moMagenta.OutlineColor = moMagentaEnd WithEnd SubPrivate Sub Map1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) 在 Map1 窗口中画两个 Polygon 计算它们的 XORDim poly

21、As New MapObjects2.PolygonDim eventLine As New MapObjects2.GeoEventSet poly = Map1.TrackPolygon 在 Map1 窗口中画 PolygonSet eventLine = Map1.TrackingLayer.AddEvent(poly, 0) 在跟踪层中显示PolyCall doXor(poly)End SubPrivate Sub doXor(shape As Object) 计算两个 Polygon 的 XORIf Not exclOr Then 画第一个 Polygon 时保存到 Shape1 中

22、Set shape1 = shapeexclOr = TrueElseIf exclOr Then 画完第而个 Polygon 后则计算它们的 XORDim xorShape As ObjectDim xorEvent As New MapObjects2.GeoEventSet xorShape = shape1.Xor(shape, Map1.FullExtent) 计算两个 Polygon 的 XorSet xorEvent = Map1.TrackingLayer.AddEvent(xorShape, 1) 加入到跟踪层中Set shape1 = NothingexclOr = Fal

23、seEnd IfEnd Sub习题1 编写程序实现样例 1 的功能。2 以习题 1 的代码为基础,写出 Intersect 程序,在程序中判断 Intersect 函数的返回结果的 Shape 类型。2.5.4 动态分段动态分段在 Line 对象上操作,是 Line 对象的特有方法操作的结果。在MapObjects2 中 Line 表示有向折线,折线的折点称为 Vertex(节点),折线的始末点称为 Node(结点)。以始结点为度量起点 ,每个节点都有一个沿着折线的路程值,用路程值确定点在折线上的位置,给定的路程值确定了折线上的唯一点。1 点事件(PointEvents)Line 对象几何图形

24、上的任意一点称为 PointEvent, PointEvent 专用于程序设计,可在程序运行中动态创建,动态改变位置,是动态的 Point 实例。例:在长度为 500 的线实例 aLine 上创建距始点路程为 400 的点事件。Dim ptsEvents As MapObjects2.PointsSet ptsEvents = aLine.ReturnPointEvents(400) 05002 线事件(LineEvent)从 Line 对象几何图形上截取的任意一条线段称为 LineEvent(线事件),LineEvent是动态创建的线实例,用线的始末点在原 Line 上的路程确定截取位置。例

25、:在长度为 500 的 Line 实例 aLine 上,创建始点路程 200 终点路程 400 的线事件。Dim lineEvent as MapObjects2.LineSet lineEvent = aLine.ReturnLineEvent(200,400)3 线的节点(Vertex)路程Line 对象实例上的节点距始结点(Node)的路程作为线的几何属性常用于最佳路径分析及网络分析,为此 MapObjects.Line 对象提供了两个方法:(1) Sub SetMeasuresAsLength()此方法为线的节点的 Measure 属性赋路程值, 路程值用地图的数据坐标计算,是地面上的

26、实际路程。例:在长度为 500 的线实例 aLine 上设置节点的 Measure(路程) 属性值aLine.SetMeasuresAsLength080280310500180各节点的 Measure 属性值如下:从上例可见,aLine 的始末结点也算作节点。(2) Sub SetMeasures(StartValue As Double,EndValue As Double)此方法用 StartValue 作为始节点的路程值,用 EndValue 作为末节点的路程值,在这两个值之间按新旧路程的比例插值作为中间节点的路程值,将计算结果赋给节点的 Measure 属性。执行此函数之前可执行也可

27、不执行SetMeasuresAsLength 函数。例:对上例中 aLine 实例重新设置节点的路程属性值,使得始节点的路程值为 1,末节点的路程值为 251,中间节点路程值按新旧路程值比例计算。aLine.SetMeasurs(1,251)141141156251914 动态分段样例在 MapObjects 中,点事件将给定的线动态分为两段,称为动态分段(Dynamic Segmentation)。分段只是视觉上的效果,并未对线进行实际分割。动态分段函数不会更改线的节点坐标值。例 1 用鼠标在地图窗口中输入一点,找出最近的一条线,在线上分别使用3 个 Measure 函数,显示出每个 Mea

28、suer 函数设置的线的各个节点的 Measure值。完整样例在 SetMeasuer 目录中Private Sub Map1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)Dim pt As MapObjects2.PointDim recs As New MapObjects2.RecordsetSet pt = Map1.ToMapPoint(X, Y) 转换(X,Y)成地图数据坐标系下的坐标Set recs = Map1.Layers(0).SearchByDistance(pt, Map

29、1.ToMapDistance(150), “) 如果找到了一条线,则提取它的 shape 字段值储存在 oLine 变量中, 设置 measures 在列表框中显示 oLine 上的 的各个节点的 Measure 值。If Not recs.EOF ThenDim oLine As New MapObjects2.LineDim pointMeasuer As DoubleSet oLine = recs(“Shape“).ValueMap1.TrackingLayer.ClearEventsMap1.TrackingLayer.AddEvent oLine, 0List1.ClearLis

30、t2.ClearList3.ClearDim vertices As New MapObjects2.PointsDim i As IntegeroLine.SetMeasuresAsLengthpointMeasuer = oLine.ReturnMeasure(pt)List1.AddItem “鼠标点的 Measure: “ & pointMeasuerList1.AddItem “节点的 Measure:“For Each vertices In oLine.PartsFor i = 0 To vertices.Count - 1List1.AddItem vertices(i).Me

31、asureNext iNext verticesoLine.SetMeasures 0, 100pointMeasuer = oLine.ReturnMeasure(pt)List2.AddItem “鼠标点的 Measure: “ & pointMeasuerList2.AddItem “节点的 Measure:“For Each vertices In oLine.PartsFor i = 0 To vertices.Count - 1List2.AddItem vertices(i).MeasureNext iNext verticesoLine.OffsetMeasures 50poi

32、ntMeasuer = oLine.ReturnMeasure(pt)List3.AddItem “鼠标点的 Measure: “ & pointMeasuerList3.AddItem “节点的 Measure:“For Each vertices In oLine.PartsFor i = 0 To vertices.Count - 1List3.AddItem vertices(i).MeasureNext iNext verticesEnd IfEnd Sub例 2:在地图窗口中用鼠标左键输入一点,在 Map1.Layers(“Road”)图层中找出与输入点距离最近的线,在找到的线上创建与输入点距离最近的点(点事件)。在跟踪层中用红色显示点事件。样例在 PntEnt.vbp 工程中,从中摘取的程序如下:Private Sub Form_Load()省略的其它语句设置 PointEvents 在跟踪层中得显示符号Map1.TrackingLayer.SymbolCount = 1With Map1.TrackingLayer.Symbol(0).SymbolType = moPointSymbol.Color = moRed.Size = 6.Style = moCircleMarkerEnd With

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。