画面与画线有异曲同工之妙(操作相似)
- 相同点:都要先绑定鼠标事件,获取鼠标点,创建LinnerRings的Geometry对象,再调用sgworld.Creator.createPolygon(Geometry,“”,“”,)
- 区别:面对象Geometry对象需4个点
创建面的两种不同逻辑方式(特指获取点的方式)
- 先创建线,线只需要两个点,在线得到三个点时,将线Geometry里面的点取出,用来创建面,删除线对象
- 直接创建面,把4个相同的鼠标世界点给Geometry对象,每次左键点击时,把Geometry最后一个点替换成当前点,再加入当前点,下次鼠标左击时也是如此,最后创面结束删除最后一个点。
- 在第二个方式里面如果嫌麻烦的话可以不用修改点,直接把点加进去也行,只是前面几个点重复。
代码1,先创线再换成面:
// 画面
function btnDrawPolygon() {
sgworld.Window.SetInputMode(1); //鼠标样式修改
sgworld.AttachEvent("OnLButtonDown", StartDrawPolygon);
sgworld.AttachEvent("OnFrame", DrawPolygonOnFrame);
sgworld.AttachEvent("OnRButtonUp", StopDrawPolygon)
}
function StartDrawPolygon(flags, x, y) {
//flags:虚拟键按下的标记;x、y为屏幕坐标
var CursorCoord = sgworld.Window.pixelToWorld(x, y);
var pos = CursorCoord.Position
var lineColor = sgworld.Creator.CreateColor(255, 100, 0, 125); //定义线渲染样式
try {
var pWorldPointInfo = sgworld.Window.PixelToWorld(x, y, -1); //将屏幕坐标转换为地理坐标
if (null == pWorldPointInfo) {
return false;
}
var pos = pWorldPointInfo.Position;
if (polygon == null) {
var geometry = sgworld.Creator.GeometryCreator.CreateLineStringGeometry([pos.X, pos.Y, 0, pos.X, pos.Y, 0]);
polygon = sgworld.Creator.CreatePolyline(geometry, lineColor, 2, "", "线");
polygon.Terrain.GroundObject = true;
polygon.Geometry.StartEdit(); //开始编辑线
} else {
if (polygon.ObjectType == 1) {
var x = polygon.Geometry.Points.Item(0).X;
var y = polygon.Geometry.Points.Item(0).Y;
// polygon.Geometry.EndEdit()
// alert(polygon.ID + " id")
sgworld.Creator.DeleteObject(polygon.ID)
var geometry = sgworld.Creator.GeometryCreator.CreateLinearRingGeometry(
[x, y, 0,
pos.X, pos.Y, 0,
pos.X, pos.Y, 0
]);
// alert(22)
polygon = sgworld.Creator.CreatePolygon(geometry);
//alert(polygon.Geometry.Points)
polygon.Terrain.GroundObject = true;
polygon.Geometry.StartEdit(); //开始编辑线
} else {
//将最后一个点换成鼠标的坐标
var pPoints = polygon.Geometry;
polygon.Geometry.Rings(0).Points.Item(pPoints.Rings(0).Points.count - 1).X = pos.X;
polygon.Geometry.Rings(0).Points.Item(pPoints.Rings(0).Points.count - 1).Y = pos.Y;
polygon.Geometry.Rings(0).Points.Item(pPoints.Rings(0).Points.count - 1).Z = 0;
polygon.Geometry.Rings(0).Points.AddPoint(pos.X, pos.Y, 0);
// alert(2222)
}
}
} catch (ex) {
alert(ex.description);
}
}
function DrawPolygonOnFrame() {
//鼠标移动时绘制线的效果
var mouseInfo = sgworld.Window.GetMouseInfo();
var mousePoint = sgworld.Window.PixelToWorld(mouseInfo.X, mouseInfo.Y);
if (null == mousePoint) {
return false;
}
var pos = mousePoint.Position;
if (polygon) {
if (polygon.ObjectType == 1) {
var pPoints = polygon.Geometry.Points;
// console.log('X===' + polygon.Geometry.Points.Item(pPoints.count - 1).X)
polygon.Geometry.Points.Item(pPoints.count - 1).X = pos.X;
polygon.Geometry.Points.Item(pPoints.count - 1).Y = pos.Y;
polygon.Geometry.Points.Item(pPoints.count - 1).Z = 0;
} else {
var pPoints = polygon.Geometry.Rings(0).Points;
// console.log('X===' + polygon.Geometry.Points.Item(pPoints.count - 1).X)
polygon.Geometry.Rings(0).Points.Item(pPoints.count - 1).X = pos.X;
polygon.Geometry.Rings(0).Points.Item(pPoints.count - 1).Y = pos.Y;
polygon.Geometry.Rings(0).Points.Item(pPoints.count - 1).Z = 0;
}
}
}
function StopDrawPolygon(flags, x, y) {
if (polygon == null || polygon.Geometry.Rings(0).Points.count <= 3) {
return false;
}
polygon.Geometry.Rings(0).Points.DeletePoint(polygon.Geometry.Rings(0).Points.count - 1)
sgworld.DetachEvent("OnLButtonDown", StartDrawPolygon);
sgworld.DetachEvent("OnRButtonUp", StopDrawPolygon);
sgworld.DetachEvent("OnFrame", DrawPolygonOnFrame);
//结束线编辑功能
polygon.Geometry.EndEdit();
polygon = null;
sgworld.Window.SetInputMode(0); //鼠标恢复效果
}
代码2,直接4个相同点创面:
//画矩形面
function drawPolygonsquare() {
sgworld.Window.SetInputMode(1); //鼠标样式修改
sgworld.AttachEvent("OnLButtonDown", starsquare)
sgworld.AttachEvent("OnFrame", DrawsquareOnFrame)
sgworld.AttachEvent("OnRButtonUp", Stopsquare)
}
function starsquare(flags, x, y) {
var pWorldPointInfo = sgworld.Window.PixelToWorld(x, y, -1); //将屏幕坐标转换为地理坐标
if (null == pWorldPointInfo) {
return false;
}
var pos = pWorldPointInfo.Position;
slope2 = pos
var nLineColor = 0xFF00FF00;
var color = sgworld.Creator.CreateColor(1, 1, 1, 0)
if (polygon == null) {
var geometry = sgworld.Creator.GeometryCreator.CreateLinearRingGeometry(
[pos.X, pos.Y, 0,
pos.X, pos.Y, 0,
pos.X, pos.Y, 0,
pos.X, pos.Y, 0,
pos.X, pos.Y, 0
]);
polygon = sgworld.Creator.CreatePolygon(geometry, nLineColor, color);
polygon.Terrain.GroundObject = true;
polygon.Geometry.StartEdit(); //开始编辑
} else {
//将最后3个点换成鼠标的坐标
var pPoints = polygon.Geometry;
polygon.Geometry.Rings(0).Points.Item(pPoints.Rings(0).Points.count - 3).Y = pos.Y;
polygon.Geometry.Rings(0).Points.Item(pPoints.Rings(0).Points.count - 2).X = pos.X;
polygon.Geometry.Rings(0).Points.Item(pPoints.Rings(0).Points.count - 2).Y = pos.Y;
polygon.Geometry.Rings(0).Points.Item(pPoints.Rings(0).Points.count - 1).X = pos.X;
}
}
function DrawsquareOnFrame(flags, x, y) {
var mouseInfo = sgworld.Window.GetMouseInfo();
var mousePoint = sgworld.Window.PixelToWorld(mouseInfo.X, mouseInfo.Y);
if (null == mousePoint) {
return false;
}
var pos = mousePoint.Position;
if (polygon) {
var pPoints = polygon.Geometry;
polygon.Geometry.Rings(0).Points.Item(pPoints.Rings(0).Points.count - 3).Y = pos.Y;
polygon.Geometry.Rings(0).Points.Item(pPoints.Rings(0).Points.count - 2).X = pos.X;
polygon.Geometry.Rings(0).Points.Item(pPoints.Rings(0).Points.count - 2).Y = pos.Y;
polygon.Geometry.Rings(0).Points.Item(pPoints.Rings(0).Points.count - 1).X = pos.X;
}
}
function Stopsquare(flags, x, y) {
sgworld.DetachEvent("OnLButtonDown", starsquare)
sgworld.DetachEvent("OnFrame", DrawsquareOnFrame)
sgworld.DetachEvent("OnRButtonUp", Stopsquare)
polygon.Geometry.EndEdit();
polygon = null;
slope2 = null
sgworld.Window.SetInputMode(0); //鼠标恢复效果
}
.