溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

skyline應(yīng)用-BS動(dòng)態(tài)繪制面狀區(qū)域

發(fā)布時(shí)間:2020-07-16 04:50:17 來(lái)源:網(wǎng)絡(luò) 閱讀:1045 作者:speciallst 欄目:開發(fā)技術(shù)

  在三維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)。


向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI