本文讲述实现Skyline三维地图上绘制多边形的功能,实现效果如下:

绘制线功能主要通过鼠标按下事件(OnLButtonDown)鼠标帧被渲染前发送事件(OnFrame)鼠标右键放下事件(OnRButtonUp)实现。

项目源代码:

 HTML:

<input type="button" value="绘制多边形" id="btnDrawPolygon" />

JavaScript:

 1 //绘制多边形
 2             var pPolygon = null;//多边形对象
 3             $("#btnDrawPolygon").bind("click", function () {
 4                 //注册地图事件
 5                 SGWorld66.Window.SetInputMode(1);//鼠标样式修改
 6                 SGWorld66.AttachEvent("OnLButtonDown", StartDrawPolygon);
 7                 SGWorld66.AttachEvent("OnFrame", DrawPolygonOnFrame);
 8                 SGWorld66.AttachEvent("OnRButtonUp", StopDrawPolygon)
 9             })
10             //绘制多边形
11             var tPolyLine = null;
12             function StartDrawPolygon(flags, x, y) {
13                 //定义渲染样式
14                 var lineColor, lineWidth = 1, lineOpacity = 1, fillColor, fillOpacity = 0.5;
15                 lineColor = SGWorld66.Creator.CreateColor(255, 100, 0, 125);//定义线样式
16                 fillColor = SGWorld66.Creator.CreateColor(100, 255, 0, 125);//定义面样式
17                 //将屏幕坐标转换为地理坐标
18                 var pWorldPointInfo = SGWorld66.Window.PixelToWorld(x, y, -1);
19                 if (null == pWorldPointInfo) {
20                     return false;
21                 }
22                 try {
23                     if (null == pPolygon) {
24                         if (!tPolyLine) {
25                             var lineGeometry = SGWorld66.Creator.GeometryCreator.CreateLineStringGeometry([pWorldPointInfo.Position, pWorldPointInfo.Position]);
26                             tPolyLine = SGWorld66.Creator.CreatePolyline(lineGeometry, lineColor, 2, SGWorld66.ProjectTree.RootID, "线");
27                             tPolyLine.Geometry.StartEdit();
28                         }
29                         else if (tPolyLine.Geometry.Points.Count < 3) {
30                             tPolyLine.Geometry.Points.AddPoint(pWorldPointInfo.Position.X, pWorldPointInfo.Position.Y, pWorldPointInfo.Position.Altitude);
31                         }
32                         else {
33                             var points = tPolyLine.Geometry.Points;
34                             var ring = SGWorld66.Creator.GeometryCreator.CreateLinearRingGeometry([
35                                 points.Item(0).X, points.Item(0).Y, points.Item(0).Z,
36                                 points.Item(1).X, points.Item(1).Y, points.Item(1).Z,
37                                 points.Item(2).X, points.Item(2).Y, points.Item(2).Z,
38                                 pWorldPointInfo.Position.X, pWorldPointInfo.Position.Y, pWorldPointInfo.Position.Altitude
39                             ]);
40                             var polygonGeometry = SGWorld66.Creator.GeometryCreator.CreatePolygonGeometry(ring, null);
41                             pPolygon = SGWorld66.Creator.CreatePolygon(polygonGeometry, lineColor, fillColor, 2, SGWorld66.ProjectTree.RootID, "多边形");
42                             pPolygon.LineStyle.Width = lineWidth;
43                             pPolygon.LineStyle.Color.SetAlpha(lineOpacity);
44                             pPolygon.TreeItem.ShowInViewerTree = true;
45                             pPolygon.Geometry.StartEdit();
46                             //删除临时的线对象
47                             SGWorld66.ProjectTree.DeleteItem(tPolyLine.ID);
48                             tPolyLine = null;
49                         }
50 
51                     } else {
52                         pPolygon.Geometry.ExteriorRing.Points.AddPoint(pWorldPointInfo.Position.X, pWorldPointInfo.Position.Y, pWorldPointInfo.Position.Altitude);
53                     }
54                 } catch (ex) {
55                     alert(ex.description);
56                 }
57             }
58             function DrawPolygonOnFrame() {
59                 //鼠标移动时渲染
60                 var teWindow, mouseInfo, mouseInfo, point, lastPoint;
61                 teWindow = SGWorld66.Window;
62                 mouseInfo = teWindow.GetMouseInfo();
63                 point = teWindow.PixelToWorld(mouseInfo.X, mouseInfo.Y, 0);
64                 if (null != tPolyLine) {
65                     lastPoint = tPolyLine.Geometry.Points.Item(tPolyLine.Geometry.Points.Count - 1);
66                     lastPoint.X = point.Position.X;
67                     lastPoint.Y = point.Position.Y;
68                     lastPoint.Z = point.Position.Altitude;
69                     return;
70                 }
71                 if (null == pPolygon) {
72                     return;
73                 }
74                 lastPoint = pPolygon.Geometry.ExteriorRing.Points.Item(pPolygon.Geometry.ExteriorRing.Points.Count - 1);
75                 lastPoint.X = point.Position.X;
76                 lastPoint.Y = point.Position.Y;
77                 lastPoint.Z = point.Position.Altitude;
78 
79             }
80             function StopDrawPolygon(flags, x, y) {
81                 //结束多边形编辑功能
82                 SGWorld66.DetachEvent("OnLButtonDown", StartDrawPolygon);
83                 SGWorld66.DetachEvent("OnRButtonUp", StopDrawPolygon);
84                 SGWorld66.DetachEvent("OnFrame", DrawPolygonOnFrame);
85                 pPolygon = null;
86                 SGWorld66.Window.SetInputMode(0);//鼠标恢复效果
87             }

Javascript Code

涉及主要接口、方法说明:

  • OnLButtonDown
  • OnRButtonUp
  • OnLButtonDown: 
  • CreateColor
  • PixelToWorld:(屏幕坐标转地理坐标)
  • CreateLineStringGeometry: 
  • CreatePolyline:     
  • AddPoint: 
  • AttachEvent: 
  • DetachEvent: 
  • CreatePolygonGeometry: 
  • CreatePolygon: 

(详情)转载请注明出处http://lygis.me/2016/10/12/drawpolygon

 

版权声明:本文为lygis原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/lygis/articles/5948896.html