mars3d实现GraphicLayer获取当前相机视角内的可视点位(矢量数据

157 篇文章 2 订阅
140 篇文章 0 订阅

效果:

mars3d实现GraphicLayer获取当前相机视角内的可视点位(矢量数据

相关依赖api:

1. map.getExtent();

提取地球当前视域边界,示例:{ xmin: 70, xmax: 140, ymin: 0, ymax: 55, height: 0, }

2.graphicLayer.eachGraphic遍历所有矢量数据并将其作为参数传递给回调函数判断是否在当前视域边界内

3.写个判断:


/**
* 获取地图边界内的矢量点位
* @param graphicLayer
* @param isExtend
*/
const getGraphics = (graphicLayer: mars3d.layer.GraphicLayer | undefined, isExtend: Boolean = true) => {
if (graphicLayer && (graphicLayer as any)._map) {
const map = (graphicLayer as any)._map as mars3d.Map;
const graphics: mars3d.graphic.BillboardEntity[] = [];
const extend = map.getExtent();
if (isExtend) {
graphicLayer.eachGraphic((graphic: mars3d.graphic.BillboardEntity) => {
const { lng, lat } = graphic.point;
if (lng >= extend.xmin && lng <= extend.xmax && lat >= extend.ymin && lat <= extend.ymax) {
graphics.push(graphic);
}
});
return graphics;
} else {
return graphicLayer.getGraphics();
}
}
};

4.return返回在当前屏幕可视区域内的数据

补充:

1.如果是不规则多边形可以参考:

2.获取的视域转经纬度参考: 几种坐标的互转算法

//屏幕坐标 转换为 笛卡尔空间直角坐标
var cartesian3 = mars3d.PointUtil.getCurrentMousePosition(map.scene, windowPosition);

//笛卡尔空间直角坐标 转换为 屏幕坐标
var windowPosition = Cesium.SceneTransforms.wgs84ToWindowCoordinates(map.scene, cartesian3);//v1.119之前版本
var windowPosition = Cesium.SceneTransforms.worldToWindowCoordinates(map.scene, cartesian3); //v1.119及之后版本

//笛卡尔空间直角坐标   转换为   地理坐标(弧度制)
var cartographic = Cesium.Cartographic.fromCartesian(cartesian3);

//笛卡尔空间直角坐标   转换为   地理坐标(经纬度)
var point = mars3d.LngLatPoint.fromCartesian(cartesian3);

//地理坐标(弧度制)   转换为   笛卡尔空间直角坐标
var cartesian3 = Cesium.Cartesian3.fromRadians(lng, lat, height); //lng\lat为弧度制

//地理坐标(经纬度)  转换为  笛卡尔空间直角坐标
var cartesian3 = Cesium.Cartesian3.fromDegrees(longitude, latitude, height); 

或者使用 mars3d.LngLatPoint 作为中间类来做转换 

//笛卡尔空间直角坐标   转换为   地理坐标(经纬度) 
var point = mars3d.LngLatPoint.fromCartesian(cartesian3);

//地理坐标(弧度制)   转换为    地理坐标(经纬度) 
var point = mars3d.LngLatPoint.fromCartographic(cartographic); 
 
//point 转换为  其他坐标  
var cartesian3 = point.toCartesian();  //转换为  笛卡尔空间直角坐标 
var cartographic = point.toCartographic();  //转换为  地理坐标(弧度制) 

 示例:

map.on(mars3d.EventType.click,  function (event) {
    var point = mars3d.LngLatPoint.fromCartesian(event.cartesian); //转为经纬度
    console.log("鼠标单击坐标", point);
});

 

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mars3D是一款基于Cesium的三维地球开发框架,支持加载多种格式的地图数据,包括PBF矢量地图。而ArcGIS是一个非常流行的GIS平台,也提供了PBF格式的矢量地图数据。下面是一个简单的示例代码,演示如何在Mars3D中加载ArcGIS的PBF矢量地图。 ```javascript //创建地球实例 var viewer = new Cesium.Viewer('cesiumContainer'); //定义PBF矢量图层 var pbfLayer = new mars3d.layer.PbfLayer({ url: 'http://xxxxxx/arcgis/rest/services/xxxx/MapServer/tile/{z}/{y}/{x}', style: { type: 'symbol', layout: { 'icon-image': '{icon}-15', //使用不同的icon名称作为矢量图标 'text-field': '{name}', //显示名称 'text-font': ['Open Sans Semibold', 'Arial Unicode MS Bold'], 'text-offset': [0, 0.6], 'text-anchor': 'top' }, paint: { 'text-color': '#000000', 'text-halo-color': '#ffffff', 'text-halo-width': 2 } } }); //添加PBF矢量图层到地球上 viewer.mars.addLayer(pbfLayer); ``` 其中,`url`参数是ArcGIS PBF矢量地图的服务地址,`style`参数则是对矢量图层的样式进行定义,包括图标、文字等。在示例代码中,我们使用了`symbol`类型的样式,并且将不同类型的矢量图标作为不同的`icon`名称进行了区分。 通过以上代码,你就可以在Mars3D中加载ArcGIS的PBF矢量地图了。需要注意的是,由于ArcGIS服务可能会有跨域限制,建议将PBF地图服务部署到与Mars3D应用同一域名下,或者使用代理进行跨域访问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值