Drawsee 3D 开发指南

向图层中加入实体

本节目录

添加实体基本知识

    在三维地图上添加实体,需要设置实体放置位置的经纬度和海拔高度。这些数据都可以通过camera类的getCenter()、getEye()和getGroundHeight()三个方法获得。另外添加实体的时候还会用到图例,所以图例就是实体的外观样式,可以通过设置实体的legend属性来设置图例。

    getCenter()方法可以得到屏幕中心点的三维坐标信息,它返回一个mePoint3d类型的对象,可以通过mePoint3d类的x、y、z属性分别得到经纬度和海拔高度。getEye()方法同getCenter()方法的使用类似,只不过它是得到当前观察点的三维坐标点信息。getGroundHeight()方法可以得到指定坐标点的地表高度。

    例如:

//得到当前点经纬度和高度
var ptCenter = oEarthViewer.camera.getCenter(); //得到地图中心点三维坐标信息
var x = ptCenter.x; //得到经度
var z = ptCenter.z; //得到纬度
var height = oEarthViewer.camera.getGroundHeight(x, z); //得到此点的海拔高度

//得到当前观察点的三维坐标信息
var ptEye = oEarthViewer.camera.getEye(); //得到地图当前观察点的三维坐标信息
var x = ptEye.x;
var z = ptEye.z;

var height = oEarthViewer.camera.getGroundHeight(x, z); //得到此点的海拔高度

添加基本形状

    添加基本类型可以通过meDynamicLayer3d类提供的相关方法实现,meDynamicLayer3d类提供的方法如下:

方法名 说明
addPointObject 创建点对象
addBallObject 创建球体(椭圆对象)
addBoxObject 创建长方体对象
addLineObject 创建线对象
addPolyObject 创建多边形对象
getGeoObjectCount 得到图层中实体的个数
removeAllGeoObjects 清除所有的实体

    下面分别介绍:

创建点对象

    创建点对象使用addPointObject()方法,它的详细定义如下:

public meEarth20.meGeoObject3d addPointObject(double, double, double)

    参数说明:

类型 名称 说明
double x 经度
double y 高度
double z 纬度

    例如添加一个点实体:

var ptCenter = oEarthViewer.camera.getCenter();
var height = oEarthViewer.camera.getGroundheight(ptCenter.x, ptCenter.z) ;

var obj = dynLayer.addPointObject(ptCenter.x, height, ptCenter.z);

    上述代码中首先得到坐标点的三维信息,然后通过addPointObject()方法添加一个点对象。dynLayer是一个内置的图层对象。图层的具体使用方法会在"图层说明"章节中介绍。

    上面的代码中obj为创建实体后返回的meGeoObject3d类型的对象。此类有多个属性和方法,用以设置实体的属性。它所提供的方法和属性如下:

名称 说明
annoVisible 标注是否可见
attr 属性字符串
fillColor 填充颜色
fontColor 字体颜色
isModified 是否修改的标记。当修改空间属性时,该标记会被设置为true
legend 缺省图例,对点对象有效
lineColor 边线颜色
lineWidth 边线宽度,像素单位
objectVisible 控件图形是否绘制,如果设置false,则仅仅绘制标注
points 获取和设置对象的点坐标数组。对于点对象,只包含一个元素对矩形和椭圆对象没有意义,为null。对于线和面对象,可以直接调用points的add方法追加坐标点,removeAll清除所有坐标点,重新设置points来完全更新坐标。
text 标注内容
bounds 对象的包围框
oid 对象的索引号(只读)
spaType 对象控件属性(只读)
addInnerRing 针对对变形对象有效。在多边形中添加一个洞
updatePosition 变更实体位置,对点实体有意义。比通常设置points效率高。

    这些方法和属性中有的只针对特定的实体对象才起作用。在添加点对象的时候,我们还需要设置几个属性:

obj.text = "点实体例子"; //标注内容
var greenColor = oEarthViewer.classFactory.createColor(0, 255, 0); //创建一个颜色对象
obj.fontColor = greenColor; //将刚才设置的标注内容设置成绿色
obj.legend = legendImage; //设置点对象的图例

     如上的四条语句,设置了点对象的标注内容,并给标注内容设置了一个颜色。最后一句为点对象设置了一个图片图例。这样当添加点对象的时候,便可以将这个图片插入到地图中去了。创建图片图例的方法是:

legendImage = oEarthViewer.legendDB3d.addImageLegend("imageLegend", "http://192.168.2.10/3dmodel/drawingpin.gif");

    需要注意的是此句需要放在打开图库操作的JavaScript代码块中才能加载成功。如上的这些JavaScript语句由于需要引用oEarthViewer类的对象,所以需要在JavaScript声明块中使用for属性引用它。

    完整的代码如下:

<script language="javascript" for="oEarthViewer">
	function addPoint()
	{
		var ptCenter = oEarthViewer.camera.getCenter();
		var ptEye = oEarthViewer.camera.getEye();
		var radius = ptEye.y * 0.005;
		var height = oEarthViewer.camera.getGroundHeight(ptCenter.x, ptCenter.z);
		
		var obj = dynLayer.addPointObject(ptCenter.x, height+radius, ptCenter.z); //在此图层上创建点对象
		
		obj.text = "点实体"; //标注内容
		var greenFontColor = oEarthViewer.classFactory.createColor(0, 255, 0); //创建一个颜色对象
		obj.fontColor = greenFontColor; //将刚才设置的标注内容设置成绿色
		obj.legend = legendImage; //设置点对象的图例
	}
</script>

实现效果:

创建球对象

    添加球操作和添加点操作相同。使用addBallObject方法便可以创建球对象。具体的使用形式为:

public meEarth20.meGeoObject3d addBallObject(double, double, double, double)

    参数说明:

类型 名称 说明
double centerX 中心经度
double centerY 中心高度
double centerZ 中心纬度
double radius 半径

    创建球的时候可以填充不同的颜色,创建颜色对象的方法为:

var redColor = oEarthViewer.classFactory.createColorAdvance(255, 0, 0, 0.8); // 前面三个参数用来设置颜色,最后一个参数用来设置透明度。

    完整的代码为:

<script language="javascript" for="oEarthViewer">
	function addBall()
	{
		var ptCenter = oEarthViewer.camera.getCenter();
		var ptEye = oEarthViewer.camera.getEye();
		var radius = ptEye.y*0.02;
		var height = oEarthViewer.camera.getGroundHeight(ptCenter.x, ptCenter.z);
		
		var redColor = oEarthViewer.classFactory.createColorAdvance(255, 0, 0, 0.8);
		var greenColor = oEarthViewer.classFactory.createColorAdvance(0, 255, 0, 0.5);

		var redBallX = ptCenter.x + radius * 0.0001;
		var redBallZ = ptCenter.z;
		var redBallHeight = height + radius + 50;
		var redBallRadius = radius + radius * 0.5;
		var redBall = dynLayer.addBallObject(redBallX, redBallHeight, redBallZ, redBallRadius); //创建球
		redBall.text = '小球一'; //设置标注字体
		redBall.fontColor = redFontColor; //设置标注字体颜色
		redBall.fillColor = redColor; //设置填充颜色
	}
</script>

实现效果类似:

添加矩形

    添加矩形与添加球体的实现方法类似。添加矩形需使用addBoxObject方法。该方法的具体形式如下:

public meEarth20.meGeoObject3d addBoxObject(double, double, double, double, double, double)

参数分别为
double centerX 中心经度
double centerY 中心高度
double centerZ 中心纬度
double xSize 经度方向大小
double ySize 高度方向大小
double zSize 纬度方向大小

    只需修改上面添加球体的例子,将添加球体的语句替换成如下语句即可:

var redRectX = ptCenter.x + radius * 0.0001;
var redRectZ = ptCenter.z;
var redRectHeight = height + radius + 50;
var redRect = dynLayer.addBoxObject(redRectX, redRectHeight, redRectZ, radius, radius, radius); //添加矩形对象
redRect.text = '方形一'; //设置标注文字
redRect.fontColor = redFontColor; //设置标注文字颜色
redRect.fillColor = redColor; //设置填充颜色

实现效果:

添加多边形

    添加多边形对象使用的方法为addPolyObject,该方法的具体形式如下:

public meEarth20.meGeoObject3d addPolyObject(meEarth20.mePointArray3d)

参数
mePointArray3d 三维点数组

    这个方法接受一个mePointArray3d类的对象作为参数,这个类是专门用来管理点对象的。当创建多边形的时候需要建立若干个点,然后将这些点连接起来构成的一个平面。mePointArray3d对象是有classFactory类的createPointArray3d方法创建的。mePointArray3d类的方法和属性如下:

成员 说明
add 添加一个点对象
getAt 获取指定索引的点对象
getSize 获取数组大小
getX 获取指定索引的x坐标
getY 获取指定索引的y坐标
getZ 获取指定索引的z坐标
removeAll 清空数组

    这里使用一个循环来添加点,循环a次便创建a个点,构成a边形。

var count = 8 //创建一个八边形
var angleStep = 2 * 3.1415926 / count;
var points = oEarthVewer.classFactory.createPointArray3d(); //创建mePointArray3d对象
for(var i=0; i<count; i++)
{
	x = ptCenter.x + radius * Math.cos(angleStep * i);
	z = ptCenter.z + radius * Math.sin(angleStep * i);
	y = oEarthViewer.camera.getGroundHeight(x, y);
		
	points.add(x, y+100, z); //添加此点
}

    完整的实现函数为:

<script language="javascript" for="oEarthViewer">
	function addPoly()
	{
		var dynLayer = oEarthViewer.classFactory.createDynamiclayer3d(); //创建图层
		dynLayer.name = "NewPolyLayer"; //设置图层的名字
		oEarthViewer.dynamicLayers.addLayer(dynLayer); //加入此图层
				
		var ptCenter = oEarthViewer.camera.getCenter();
		var ptEye = oEarthViewer.camera.getEye();
		var radius = ptEye.y / 100000; 
		radius *= 0.05;
		var x, y, z;
		var count = 8;
		var angleStep = 2 * 3.1415926 / count;
		var points = oEarthViewer.classFactory.createPointArray3d();

		for(var i=0; i<count; i++)
		{
			x = ptCenter.x + radius * Math.cos(angleStep * i);
			z = ptCenter.z + radius * Math.sin(angleStep * i);
			y = oEarthViewer.camera.getGroundHeight(x, z);

			points.add(x, y+100, z);
		}

		var color = oEarthViewer.classFactory.createColorAdvance(255, 255, 0, 0.8);
		var poly = dynLayer.addPolyObject(points);
		poly.text = '多边形';
		poly.fillColor = color;
	}
</script>

    实现效果:

添加线

    添加线操作与添加多边形操作相似,所不同的是添加多边形操作需要添加的点需要大于2个,而添加线只需要添加2个点即可。可以通过addLineObject方法添加线对象。该方法的具体形式为:

public meEarth20.meGeoObject3d addLineObject(meEarth20.mePointArray3d)

参数:
mePointArray3d 三维点数组

    具体的实现函数为:

<script language="javascript" for="oEarthViewer">
	function addLine()
	{
		var dynLayer = oEarthViewer.classFactory.createDynamiclayer3d(); //创建图层
		dynLayer.name = "NewBallLayer"; //设置图层的名字
		oEarthViewer.dynamicLayers.addLayer(dynLayer); //加入此图层
	
		var ptCenter = oEarthViewer.camera.getCenter();

		var greenLinePoints = oEarthViewer.classFactory.createPointArray3d();
		greenLinePoints.add(ptCenter.x-2, 30000, ptCenter.z);
		greenLinePoints.add(ptCenter.x+2, 30000, ptCenter.z);
		var blueLinePoints = oEarthViewer.classFactory.createPointArray3d();
		blueLinePoints.add(ptCenter.x, 30000, ptCenter.z-2);
		blueLinePoints.add(ptCenter.x, 30000, ptCenter.z+2);

		var greenColor= oEarthViewer.classFactory.createColorAdvance(255, 255, 128, 0.8);
		var blueColor = oEarthViewer.classFactory.createColorAdvance(128, 128, 255, 0.8);

		var greenLine = dynLayer.addLineObject(greenLinePoints);
		greenLine.lineWidth = 2; //设置线的宽度
		greenLine.text = '线一';
		greenLine.lineColor = greenColor;

		var blueLine = dynLayer.addLineObject(blueLinePoints);
		blueLine.lineWidth = 4; //设置线的宽度
		blueLine.text = '线二';
		blueLine.lineColor = blueColor;

	}
</script>

    上例中可以通过线的lineWidth属性设置线的宽度。

实现效果:

得到实体个数

    在地图上添加各种实体后,可以通过getGeoObjectCount方法得到地图上实体的个数。该方法返回地图上实体的个数,它的具体实现为:

public int getGeoObjectCount()

    在地图上直接调用此方法即可:

var count = dynLayer.getGeoObjectCount();
alert("实体个数: " + count);

清除所有实体

    可以通过removeAllGeoObjects方法清除地图上的所有实体对象。使用方法为:

dynLayer.removeAllGeoObjects();