对象绘制之点线面

作者:nannan

在SuperMap iDesktop.Net三维场景中可以创建三类对象,①场景中的二维对象,②场景中的三维对象,③粒子对象。小编此次就为大家着重介绍一下场景中如何绘制点线面,也就是前面所说的①、②部分,第③部分请见下一篇博客https://blog.youkuaiyun.com/supermapsupport/article/details/93590701。

1.绘制二维对象

绘制二维对象或者粒子对象,只能在 CAD 数据集进行绘制。在绘制之前,请确保当前可编辑图层为 CAD 图层。
在场景中创建二维对象的方式与在地图中创建对象的方式一致。在场景中的图层,可编辑的情况下,可以绘制点、线、折线、多边形、曲线、圆、椭圆等多种几何对象。具体操作步骤如下:

(1)新建CAD数据集

在数据源里右键单击选新建数据集,创建类型选CAD,点击创建即可。
在这里插入图片描述
创建成功的CAD数据集如下:
在这里插入图片描述

(2)设置坐标系

球面场景只支持加载地理坐标系和投影坐标系的数据,而咱们创建的数据集默认是平面无投影的坐标系,所以应将该数据集的坐标重设为地理坐标系或投影坐标系。当然如果数据源自带坐标系,且坐标系为地理坐标系或投影坐标系,则不用对该创建的数据集进行坐标系设置。
CAD数据集右键属性,选坐标系,点击重设,设置为地理坐标系或投影坐标系。
在这里插入图片描述
设置结果如下:
在这里插入图片描述

(3)添加到球面场景,开启可编辑状态

在这里插入图片描述

(4)绘制二维对象。

对象绘制-CAD对象-二维对象里。
在这里插入图片描述
点线面绘制如图,既可以鼠标在场景中左键点击绘制也可以点击键盘Tab键输入X、Y坐标,按键盘Enter回车键绘制。
在这里插入图片描述

2. 绘制三维对象

绘制三维对象有两种方式,一种是CAD数据集绘制三维对象,另一种是三维数据集绘制三维对象。
目前支持在场景中绘制点、折线和多边形等三维对象。三维对象的绘制支持输入坐标值和直接绘制两种方式,默认提供参数化绘制方式,随后输入三维对象每个节点的 X 坐标、Y 坐标以及 Z 坐标即可绘制三维对象。若不需要输入精确坐标值,可以通过“对象绘制”选项卡中“三维对象”组的组对话框选项中,关闭“参数化绘制”功能,也可通过“Shift+P”的快捷方式关闭或开启参数化绘制功能。

(1) CAD数据集中绘制三维对象

在这里插入图片描述
在这里插入图片描述
那如何区别CAD数据集里哪些是二维对象哪些是三维对象呢?这个可以从CAD数据集的属性表的SmGeoType字段判断,如下图:
在这里插入图片描述
小编将SmGeoType每个数值所代表的的几何对象制作了表格,如下图:

GeoType几何对象类型
1二维点
3二维折线
5二维多边形
12二维矩形
15二维圆
20二维椭圆
101三维点
103三维线
105三维面

(2) 三维数据集绘制三维对象

三维数据集绘制三维对象只能是对应的数据集绘制与之相对应的三维对象,比如三维点数据集就只能绘制三维点对象。
在这里插入图片描述
效果如图:
在这里插入图片描述
为了保证绘制的三维对象看起来更直观,建议用户先修改当前场景的高度模式。在“风格设置”选项卡的“拉伸设置”组中,找到“高度模式”,通过右侧的下拉箭头,修改高度模式为非贴地模式,绝对高度或者相对地面,或者地下模式。在绝对高度或者相对地面模式下,可以捕捉场景中其他模型的节点。而在地下模式下,不方便捕捉其他模型的节点,只能通过输入具体坐标值绘制对象。

### Cesium中绘制矢量点、线和面的示例代码 在Cesium中,可以通过`Entity`或`GraphicLayer`来实现矢量点、线和面的绘制。以下是具体的实现方式及示例代码。 #### 绘制矢量点 使用`Point`实体或`GraphicLayer`中的`PointEntity`对象可以绘制矢量点。以下是一个基于`Entity`的示例: ```javascript viewer.entities.add({ position: Cesium.Cartesian3.fromDegrees(108, 30), // 设置点的经纬度坐标 point: { pixelSize: 10, // 点的大小 color: Cesium.Color.PINK, // 点的颜色 outlineColor: Cesium.Color.WHITE, // 边框颜色 outlineWidth: 2 // 边框宽度 } }); ``` 如果使用`GraphicLayer`,则可以参考以下代码[^1]: ```javascript var tucengdian = new mars3d.layer.GraphicLayer(); // 新建矢量图层 map.addLayer(tucengdian); // 将矢量图层绑定到地图上 var graphic = new mars3d.graphic.PointEntity({ position: [108, 30], // 坐标 style: { color: "pink", // 颜色 pixelSize: 10, // 大小 outline: true, // 是否边框 outlineColor: "#ffffff", // 边框颜色 outlineWidth: 2 // 边框大小 } }); tucengdian.addGraphic(graphic); // 添加像素点到矢量图层 ``` #### 绘制矢量线 通过`Polyline`实体可以实现矢量线的绘制。以下是一个示例代码: ```javascript viewer.entities.add({ polyline: { positions: Cesium.Cartesian3.fromDegreesArray([108, 30, 110, 20]), // 定义线的起点和终点 width: 5, // 线宽 material: Cesium.Color.BLUE // 线的颜色 } }); ``` 对于动态绘制线,可以结合`CallbackProperty`实现[^3]: ```javascript let positions = []; // 动态更新的坐标数组 viewer.entities.add({ polyline: { positions: new Cesium.CallbackProperty(function() { return Cesium.Cartesian3.fromDegreesArray(positions); }, false), material: Cesium.Color.RED, width: 3 } }); ``` #### 绘制矢量面 通过`Polygon`实体可以实现矢量面的绘制。以下是一个示例代码: ```javascript viewer.entities.add({ polygon: { hierarchy: Cesium.Cartesian3.fromDegreesArray([ 108, 30, 110, 30, 110, 20, 108, 20 ]), // 定义多边形的顶点 material: Cesium.Color.GREEN.withAlpha(0.5) // 面的颜色及透明度 } }); ``` 如果需要动态绘制面,也可以使用`CallbackProperty`[^3]: ```javascript let vertices = []; // 动态更新的顶点数组 viewer.entities.add({ polygon: { hierarchy: new Cesium.CallbackProperty(function() { return Cesium.Cartesian3.fromDegreesArray(vertices); }, false), material: Cesium.Color.YELLOW.withAlpha(0.7) } }); ``` ### 注意事项 - 在Cesium中,所有的坐标都需要转换为笛卡尔坐标系。例如,经纬度坐标需要通过`Cesium.Cartesian3.fromDegrees`方法进行转换[^4]。 - 如果需要动态更新点、线或面的数据,可以使用`CallbackProperty`。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值