向图层中加入实体
本节目录
添加实体基本知识
在三维地图上添加实体,需要设置实体放置位置的经纬度和海拔高度。这些数据都可以通过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();