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

上传人:sk****8 文档编号:3520267 上传时间:2019-06-01 格式:DOC 页数:11 大小:127.50KB
下载 相关 举报
MapObejcts组件应用设计(几何对象).doc_第1页
第1页 / 共11页
MapObejcts组件应用设计(几何对象).doc_第2页
第2页 / 共11页
MapObejcts组件应用设计(几何对象).doc_第3页
第3页 / 共11页
MapObejcts组件应用设计(几何对象).doc_第4页
第4页 / 共11页
MapObejcts组件应用设计(几何对象).doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

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个工作日内予以改正。