




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1. Point对象2. Line及Polygon对象1. 图形坐标数据2. Points集合与Parts集合3. 几何对象的运算1. IsPointIn2. GetCrossings3.4. Intersect5. Difference6. Xor7. Buffer4. 动态分段1. 点事件(PointEvents)2. 线事件(LineEvent)3. 线的节点(Vertex)路程4. 动态分段样例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及Polygon对象1图形坐标数据在MapObjects2中,Line与Polygon图形都用Point的有序集合的集合定义,称为parts,Point的有序集合定义一条折线,称为part,part的集合命名为Parts。只有一条折线的Line或Polygon实例的Parts集合中仅含有一个part。在Line中part的首尾两点不同,在Polygon中part的首尾两点用一个Point表示。下面这段程序取自附属盘中的样例GeoData中的MouseDown事件过程,程序先根据鼠标位置查出一个省区,然后将省区多边形的坐标串加入到List1控件中。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.EOF 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)For 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 MapObjects2.PointsSet poly = Map1.TrackPolygon 鼠标跟踪绘制一个多边形Set pts = poly.Parts.Item(0) 获得多边形中Points集合的引用pts.Remove pts.Count 1 删除多边形上的最后一点Dim pt AsNew MapObjects2.Pointpt.X = 2300pt.Y = 4500pts.Set 2 , pt 替换pts集合中的点pts.Item(2)pts.Reverse 改变pts中点的排列方向在Polygon对象中,Points集合中点的排列方向赋予了特殊的含义。简单Polygon边界Points点按顺时针方向排列。含有岛区的复合Polygon的外围边界线点按顺时针方向排列,内部岛区边界线点按逆时针方向排列。Parts集合是不可创建对象,Polygon与Line的Parts属性也是只读的。在创建Polygon或Line对象的实例同时创建了Parts实例,且用Parts属性引用Parts实例。可按如下步骤建立一个完整的Polygon实例:1创建一个Polygon对象实例。2创建Points对象实例。3创建Point对象实例,设置它的X、Y属性值,用Pionts.Add方法添加到Points实例中。4重复步骤3,将所有的点加入到Points实例中。5用Polygon.Parts.Add方法将Points实例加入到Parts属性中。单Part的Polygon用上述5步即可建立。 对于多Part的Polygon重复步骤5。同理可以建立Line实例。2.5.3几何对象的运算MapObject2 的几何对象共有6种,符号常量由枚举表ShapeTypeConstants定义如下符号常量值对象名moShapeTypePoint21PointmoShapeTypeLine22LinemoShapeTypePolygon23PloygonmoShapeTypeMultipoint24PointsmoShapeTypeRectangle25RectanglemoShapeTypeEllipse26Ellipse六种对象的父对象都是Object。例:判断几何对象的类型。Dim ObjA As ObjectDim ObjPoint As New MapObjects2.PointDim ObjPolygon As New MapObjects2.PolygonSet ObjA = ObjPointIf ObjA.shapeType = moShapeTypePoint Then Debug.Print ObjA类型是PointSet 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.Pointpt.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 New 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 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可以是: Point, Points, Line, Polygon, Rectangle, Ellipse 6 种对象Shape可以是: Point, Points, Line, Polygon, Rectangle, Ellipse 6 种对象resultShape的类型随object与Shape的组合而异,如下表所示resultShape的类型Shape objectPointPointsLinePolygonRectangleEllipsePointPointPointPointPointPointPointPointsPointPoint 或PointsPoint 或PointsPoint或PointsPoint 或PointsPoint 或PointsLinePointPoint 或PointsPoint 或PointsLineLineLinePolygonPointPoint 或PointsLinePolygonPolygong或RactanglePolygonRectanglePointPoint 或PointsLinePolygon或RactagleRactanglePolygon或RactangleEllipsePointPoint 或PointsLinePolygonPolygon或RactanglePolygon5 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这个函数返回两个几何图形的异或。例: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)在MapObjects2中,Buffer Intersect Difference Union及Xor方法使用整数坐标,具有较高的计算速度。为确保从浮点数转换到整数保持几何操作的一致性,建议使用Rectangle型的Extent参数,对所有的几何操作使用相同的Extent参数。若不使用参数Extent,对相同的Shape重复使用几何方法,不同次的结果图形的几何坐标可能会出现计算误差。如果在方法中没有使用Extent参数,Mapobjets2使用两个源Shape的外接矩形的并。例1 在跟踪层画两个Polygon 求它们的Xor,用不同的颜色在跟踪层显示源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.OutlineColor = 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 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中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 = FalseEnd IfEnd Sub习题1 编写程序实现样例1的功能。2 以习题1的代码为基础,写出Intersect程序,在程序中判断Intersect函数的返回结果的Shape类型。2.5.4动态分段动态分段在Line对象上操作,是Line对象的特有方法操作的结果。在MapObjects2中Line表示有向折线,折线的折点称为Vertex(节点),折线的始末点称为Node(结点)。以始结点为度量起点,每个节点都有一个沿着折线的路程值,用路程值确定点在折线上的位置,给定的路程值确定了折线上的唯一点。1点事件(PointEvents)Line对象几何图形上的任意一点称为PointEvent,PointEvent专用于程序设计,可在程序运行中动态创建,动态改变位置,是动态的Point实例。例:在长度为500的线实例aLine上创建距始点路程为400的点事件。Dim ptsEvents As MapObjects2.PointsSet ptsEvents = aLine.ReturnPointEvents(400) 05002线事件(LineEvent)从Line对象几何图形上截取的任意一条线段称为LineEvent(线事件),LineEvent是动态创建的线实例,用线的始末点在原Line上的路程确定截取位置。例:在长度为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属性赋路程值, 路程值用地图的数据坐标计算,是地面上的实际路程。例:在长度为500的线实例aLine上设置节点的Measure(路程)属性值aLine.SetMeasuresAsLength080280310500180各节点的Measure属性值如下:从上例可见,aLine的始末结点也算作节点。(2) Sub SetMeasures(StartValue As Double,EndValue As Double)此方法用StartValue作为始节点的路程值,用EndValue作为末节点的路程值,在这两个值之间按新旧路程的比例插值作为中间节点的路程值,将计算结果赋给节点的Measure属性。执行此函数之前可执行也可不执行SetMeasuresAsLength函数。例:对上例中aLine实例重新设置节点的路程属性值,使得始节点的路程值为1,末节点的路程值为251,中间节点路程值按新旧路程值比例计算。aLine.SetMeasurs(1,251)141141156251914动态分段样例在MapObjects中,点事件将给定的线动态分为两段,称为动态分段(Dynamic Segmentation)。分段只是视觉上的效果,并未对线进行实际分割。动态分段函数不会更改线的节点坐标值。例1 用鼠标在地图窗口中输入一点,找出最近的一条线,在线上分别使用3个Measure函数,显示出每个Measuer 函数设置的线的各个节点的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, Map1.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.ClearList2.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).MeasureNext 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 50pointMeasuer = 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()省略的其它语句设置PointEven
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030中国农村啤酒市场消费升级特征与渠道下沉策略研究报告
- 2025年智能音箱的市场发展趋势
- 2025年福建省宁德市营商环境观察员招募3人模拟试卷及一套参考答案详解
- 2025年甘肃省兰州新区石化产业投资集团有限公司急需紧缺专业技术岗位招聘14人考前自测高频考点模拟试题及完整答案详解1套
- 2025年海洋能发电技术产业技术路线图报告
- 2025湖南怀化市洪江市创业投资有限责任公司招聘考前自测高频考点模拟试题及答案详解(历年真题)
- 2025年上半年江苏无锡市新吴区新瑞医院(上海交通大学医学院附属瑞金医院无锡分院)招聘32人考前自测高频考点模拟试题及参考答案详解1套
- 鄂州市华容区招聘幼师考试真题2024
- 2025年麻城市属事业单位考试试卷
- “百万英才汇南粤”广东省佛山市南海区教育系统2025-2026学年面向社会公开招聘教师模拟试卷及答案详解(网校专用)
- 2025至2030MCU行业市场发展分析及竞争形势与投资机会报告
- 2025年植物保护专业考试试题及答案
- 完整的离婚协议书打印电子版(2025年版)
- 尿道狭窄的治疗与护理
- 防水工程质量保证书
- 大额资金使用管理办法
- 业务激励方案61170
- 家电行业售后维修服务管理流程
- 2024年煤炭工业矿井设计规范
- 替莫唑胺耐药机制-深度研究
- 二级中医医院评审专家手册
评论
0/150
提交评论