您好,登錄后才能下訂單哦!
在三維GIS的規(guī)劃、公安等應(yīng)用系統(tǒng)中,常需要操作者在地圖上動(dòng)態(tài)勾畫出面狀區(qū)域,以便用來(lái)觀看,并能夠進(jìn)行保存查看。
skyline的BS開發(fā)是采用JavaScript語(yǔ)言進(jìn)行開發(fā),最新版的6.6可以支持chrome、Firefox、IE瀏覽器,但隨著chrome的更新,不再支持npgapi的方式,最新版的chrome上會(huì)失效,一直以來(lái)在IE瀏覽器上的支持比較穩(wěn)定,建議在IE上開發(fā)使用。
面狀區(qū)域繪制類似于TerraExplorer上的畫面操作,只是這個(gè)用程序?qū)崿F(xiàn)。
具體步驟如下:
在開始進(jìn)行標(biāo)繪時(shí),首先仿照TE的方式,先將鼠標(biāo)的樣式變化一下,之后進(jìn)行事件綁定
//變換鼠標(biāo)的樣式,定義全局使用對(duì)象
SGWorld.Window.SetInputMode(1,"",0);
LbFlags=true;
polygon=null;
//綁定TE的三個(gè)事件:左鍵、右鍵、每幀變化 SGWorld.AttachEvent("OnLButtonDown", OnleftbtnUp); SGWorld.AttachEvent("OnRButtonDown", OnRButtonUpp); SGWorld.AttachEvent("OnFrame", Onframe); //OnleftbtnUp、OnRButtonUpp、Onframe是三個(gè)事件的具體實(shí)現(xiàn),使用JavaScript的function即可; //左鍵事件實(shí)現(xiàn) function OnleftbtnUp(Flags,X,Y) { if (LbFlags) { //首先獲得屏幕上點(diǎn)擊的左鍵鼠標(biāo)的地圖位置,需要將鼠標(biāo)位置轉(zhuǎn)換地圖坐標(biāo) var CursorCoord = SGWorld.Window.pixelToWorld(X, Y); if (CursorCoord == null) return false; if (polygon == null) { // 在進(jìn)行畫面的時(shí)候,通常是先畫一條線,因?yàn)橐粋€(gè)面至少需要3個(gè)點(diǎn) var myGeometry = SGWorld.Creator.GeometryCreator.CreateLineStringGeometry([CursorCoord.Position.x, CursorCoord.Position.y, 0, CursorCoord.Position.x, CursorCoord.Position.y, 0]); polygon = SGWorld.Creator.createPolyline(myGeometry, SGWorld.Creator.CreateColor(255, 255, 0, 1), 2, -1,"gPolylineText"); polygon.LineStyle.Width = 1; polygon.Geometry.StartEdit(); } else { if (polygon.ObjectType == 1) { //當(dāng)有3個(gè)點(diǎn)的時(shí)候,就把前邊畫的線給刪除掉 var x = polygon.Geometry.Points.Item(0).X; var y = polygon.Geometry.Points.Item(0).Y; SGWorld.Creator.DeleteObject(polygon.ID); // 開始畫面 var myGeometry = SGWorld.Creator.GeometryCreator.CreateLinearRingGeometry([x, y, 0, CursorCoord.Position.x, CursorCoord.Position.y, 0, CursorCoord.Position.x, CursorCoord.Position.y, 0]) polygon = SGWorld.Creator.createPolygon(myGeometry, SGWorld.Creator.CreateColor(255, 255, 0, 255), SGWorld.Creator.CreateColor(255, 255, 0, 255), 2, 0, "gPolygonText"); polygon.LineStyle.Width = 1; polygon.Terrain.GroundObject = true; polygon.Geometry.StartEdit(); } else { //編輯面的環(huán)中點(diǎn),并增加點(diǎn) polygon.Geometry.Rings(0).Points.Item(polygon.Geometry.Rings(0).Points.count - 1).X = CursorCoord.Position.x; polygon.Geometry.Rings(0).Points.Item(polygon.Geometry.Rings(0).Points.count - 1).Y = CursorCoord.Position.y; polygon.Geometry.Rings(0).Points.Item(polygon.Geometry.Rings(0).Points.count - 1).Z = 0; polygon.Geometry.Rings(0).Points.AddPoint(CursorCoord.Position.x, CursorCoord.Position.y, 0); } } } } //每幀事件,實(shí)現(xiàn)在沒有完成畫面的時(shí)候,面的最后一個(gè)跟隨鼠標(biāo)移動(dòng) function Onframe() { if (polygon != null) { try { //獲得當(dāng)前鼠標(biāo)的位置,使面的最后一個(gè)點(diǎn)隨著鼠標(biāo)移動(dòng) var mouseInfo = SGWorld.Window.GetMouseInfo() var CursorCoord = SGWorld.Window.pixelToWorld(mouseInfo.X, mouseInfo.Y); if (CursorCoord == null) return false; if (polygon.ObjectType == 2) { polygon.Geometry.Rings(0).Points.Item(polygon.Geometry.Rings(0).Points.count - 1).X = CursorCoord.Position.x; polygon.Geometry.Rings(0).Points.Item(polygon.Geometry.Rings(0).Points.count - 1).Y = CursorCoord.Position.y; polygon.Geometry.Rings(0).Points.Item(polygon.Geometry.Rings(0).Points.count - 1).Z = 0; } else { polygon.Geometry.Points.Item(polygon.Geometry.Points.count - 1).X = CursorCoord.Position.x; polygon.Geometry.Points.Item(polygon.Geometry.Points.count - 1).Y = CursorCoord.Position.y; polygon.Geometry.Points.Item(polygon.Geometry.Points.count - 1).Z = 0; } } catch (e) { } } } //右鍵事件,面繪制完成時(shí),將狀態(tài)恢復(fù)到畫面之前,完成畫面。
function OnRButtonUpp(Flags, X, Y){
//SGWorld.ProjectTree.EndEdit();
if (polygon != null)
{
if (polygon.ObjectType == 1)
polygon.Geometry.Points.DeletePoint(polygon.Geometry.Points.count - 1);
else polygon.Geometry.Rings(0).Points.DeletePoint(polygon.Geometry.Rings(0).Points.count - 1);
polygon.Geometry.EndEdit();
}
SGWorld.Window.SetInputMode(0,"",0);
LbFlags=false;
}
上邊是整個(gè)應(yīng)用功能實(shí)現(xiàn)的代碼,其中像線寬、填充顏色等參數(shù),參照API文檔,就可以自定義進(jìn)行實(shí)現(xiàn)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。