Cesium 加载geojson数据类型点线面

1.获取geojson数据,本地新建一个.ts文件放置数据导出,并引入

 获取geojson数据:

DataV.GeoAtlas地理小工具系列

import { scGeojson } from './geojson';

2.加载面

const addPolygonEvt = () => {viewer.dataSources.add(Cesium.GeoJsonDataSource.load(scGeojson, {clampToGround: true, // 贴地fill: Cesium.Color.AZURE.withAlpha(0.5),}),);
};

因为面数据贴地,边界线消失,所以,将面数据转为多线数据,加载一次边界线

3.加载边界线

import { polygonToLine, polygon } from '@turf/turf';
const addPolygonLine = () => {// 设置一个空数组,用来放置每个面的边界,geojson数据const lineArr: any[] = [];scGeojson.features.map((it) => {if (it.geometry && it.geometry.coordinates) {it.geometry.coordinates.map((item) => {let line = polygonToLine(polygon(item)); // 把多面转为多线lineArr.push(line);});}});// 1.遍历线数组,可以使用加载实体线方式,把每个面的边界线加载出来// 2.或则使用加载geojson数据方法,加载出来lineArr.map((it) => {// 加载实体方式// viewer.entities.add({// 	polyline: {// 		positions: Cesium.Cartesian3.fromDegreesArray(// 			flatten(it.geometry.coordinates),// 		),// 		material: Cesium.Color.AQUA,// 		clampToGround: true,// 	},// });// 加载geojson方式viewer.dataSources.add(Cesium.GeoJsonDataSource.load(it, {clampToGround: true, // 贴地stroke: Cesium.Color.AQUA,strokeWidth: 1,}),);});
};

4.加载点

import { point, FeatureCollection } from '@turf/turf';
const addGeojsonPoint = () => {const pointGeoJson: FeatureCollection = {type: 'FeatureCollection',features: [],};scGeojson.features.map((it) => {pointGeoJson.features.push(point(it.properties.center, it.properties));});let data = viewer.dataSources.add(Cesium.GeoJsonDataSource.load(pointGeoJson, {}),);data.then((dataSource: any) => {const entities = dataSource.entities.values;for (const item in entities) {const entity = entities[item];// if (entity.point) {entity.billboard = {image: '/public/images/gg.png',color: Cesium.Color.AQUA,width: 40,height: 40,heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, // 贴地};entity.label = {text: entity.name,font: '14px',pixelOffset: new Cesium.Cartesian3(0, 30, 0),fillColor: Cesium.Color.DARKGREEN,};}});
};

 效果:


hooks.ts代码:

import * as Cesium from 'cesium';
import { popInfo } from './config';
import { scGeojson } from './geojson';
import { polygonToLine, polygon, point, FeatureCollection } from '@turf/turf';
let viewer: any = {};
export function mountedEvt() {Cesium.Ion.defaultAccessToken ='';viewer = new Cesium.Viewer('cesiumContainer', {// baseLayerPicker: false,});mapFlyEvt(104.065735, 30.659462, 2000000);addPolygonEvt();addPolygonLine();addGeojsonPoint();
}
/*** @Description 加载geojson点位* @Author: wms* @Date: 2023-11-21 15:20:34*/
const addGeojsonPoint = () => {const pointGeoJson: FeatureCollection = {type: 'FeatureCollection',features: [],};scGeojson.features.map((it) => {pointGeoJson.features.push(point(it.properties.center, it.properties));});let data = viewer.dataSources.add(Cesium.GeoJsonDataSource.load(pointGeoJson, {}),);data.then((dataSource: any) => {const entities = dataSource.entities.values;for (const item in entities) {const entity = entities[item];// if (entity.point) {entity.billboard = {image: '/public/images/gg.png',color: Cesium.Color.AQUA,width: 40,height: 40,heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, // 贴地};entity.label = {text: entity.name,font: '14px',pixelOffset: new Cesium.Cartesian3(0, 30, 0),fillColor: Cesium.Color.DARKGREEN,};}});addPopEvt();
};
/*** @Description 弹窗* @Author: wms* @Date: 2023-11-17 11:02:33*/
export const addPopEvt = () => {const dom = document.getElementById('popBox');let popBox: any = new Cesium.InfoBox(dom as string | Element);viewer.screenSpaceEventHandler.setInputAction(function onLeftClick(movement: any,) {let pickedObject = viewer.scene.pick(movement.position);if (Cesium.defined(pickedObject) &&pickedObject.id instanceof Cesium.Entity) {var entity = pickedObject.id;if (entity.position) {// 显示弹窗popBox.container.style.visibility = 'visible';// 获取位置信息let entityPosition = entity.position.getValue(viewer.clock.currentTime,);// 传递数据,由于我定义了一个map.js文件,所以没办法把点位数据直接传递给页面,只能用eventBus传递两个文件的数据popInfo.value = entity.properties;// 监听 Viewer 的 postRender 事件,在地图移动时更新弹窗位置viewer.scene.postRender.addEventListener(function () {try {if (entityPosition !== null) {let screenPosition =Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene,entityPosition,);if (screenPosition) {let leftOffset =screenPosition.x -popBox.container.clientWidth / 2;let topOffset =screenPosition.y -popBox.container.clientHeight -18;popBox.container.style.left = leftOffset + 'px';popBox.container.style.top = topOffset + 'px';}}} catch (error) {console.log(error);}});} else {popBox.container.style.visibility = 'hidden';}} else {// 隐藏弹窗popBox.container.style.visibility = 'hidden';}}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
};
/*** @Description 加载面数据* @Author: wms* @Date: 2023-11-21 09:36:22*/
export const addPolygonEvt = () => {viewer.dataSources.add(Cesium.GeoJsonDataSource.load(scGeojson, {clampToGround: true, // 贴地fill: Cesium.Color.AZURE.withAlpha(0.5),}),);
};
/*** @Description 加载面边界* @Author: wms* @Date: 2023-11-21 14:59:04*/
const addPolygonLine = () => {// 设置一个空数组,用来放置每个面的边界,geojson数据const lineArr: any[] = [];scGeojson.features.map((it) => {if (it.geometry && it.geometry.coordinates) {it.geometry.coordinates.map((item) => {let line = polygonToLine(polygon(item)); // 把多面转为多线lineArr.push(line);});}});// 遍历线数组,使用加载实体线方式,把每个面的边界线加载出来// 或则使用加载geojson数据方法,加载出来lineArr.map((it) => {// viewer.entities.add({// 	polyline: {// 		positions: Cesium.Cartesian3.fromDegreesArray(// 			flatten(it.geometry.coordinates),// 		),// 		material: Cesium.Color.AQUA,// 		clampToGround: true,// 	},// });viewer.dataSources.add(Cesium.GeoJsonDataSource.load(it, {clampToGround: true, // 贴地stroke: Cesium.Color.AQUA,strokeWidth: 1,}),);});
};
/*** @Description 数组扁平化处理* @Author: wms* @Date: 2023-11-21 14:50:59*/
const flatten = (arr: any[]) => {let result: number[] = [];for (let i = 0; i < arr.length; i++) {if (Array.isArray(arr[i])) {result = result.concat(flatten(arr[i]));} else {result.push(arr[i]);}}return result;
};
/*** @Description 地图飞行动画* @Author: wms* @Date: 2023-11-21 15:11:14*/
const mapFlyEvt = (lon: number, lat: number, height: number) => {const position = Cesium.Cartesian3.fromDegrees(lon, lat, height);// flyTo快速切换视角,带飞行动画,可以设置飞行时长viewer.camera.flyTo({destination: position,orientation: {heading: Cesium.Math.toRadians(0),pitch: Cesium.Math.toRadians(-90),roll: Cesium.Math.toRadians(0),},duration: 3, // 单位秒});
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/156508.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【计算机网络学习之路】Windows下的socket编程

文章目录 前言Windows下的socket编程1.预备工作2. socket编程 结束语 前言 本系列文章是计算机网络学习的笔记&#xff0c;欢迎大佬们阅读&#xff0c;纠错&#xff0c;分享相关知识。希望可以与你共同进步。 本篇文章仅记录Windows下socket编程和Linux的不同&#xff0c;并没…

云ES容灾方案

一、ES集群可用性容灾 1.1 云ES集群可用性容灾(使用跨可用区实例) 云ES集群部署在三个可用区,单可用区故障,云ES集群依然可能对外提供服务;两个可用区故障,需要进行控制台切流(集群会自动切的选择主节点) 应用服务部署在二个可用区,单可用区故障,依然可对提供服务1.2 …

开源网安解决方案荣获四川数实融合创新实践优秀案例

​11月16日&#xff0c;2023天府数字经济峰会在成都圆满举行。本次峰会由四川省发展和改革委员会、中共四川省委网络安全和信息化委员会办公室、四川省经济和信息化厅等部门联合指导&#xff0c;聚焦数字经济与实体经济深度融合、数字赋能经济社会转型发展等话题展开交流研讨。…

vue2【相关介绍】

目录 1&#xff1a;什么是单页面应用程序 2&#xff1a;什么是vue-cli 3&#xff1a;安装使用 4&#xff1a;vue项目的目录结构&#xff1a;​编辑 5&#xff1a;了解src目录的构成&#xff1a; 6&#xff1a;vue项目的运行流程 7&#xff1a;el&#xff1a;容器名称&…

ChatGPT暂时停止开通plus,可能迎来封号高峰期

前言: 前两日,chat gpt的创始人 San Altman在网上发表了,由于注册的使用量超过了他们的承受能力,为了确保每个人的良好使用体验,chat gpt将暂时停止开通gpt plus。 情况: 前段时间好像出现了官网崩溃的情况,就连api key都受到了影响,所以现在就开始了暂时停止plus的注…

本机idea连接虚拟机中的Hbase

相关环境&#xff1a; 虚拟机&#xff1a;Centos7 hadoop版本:3.1.3 hbase版本:2.4.11 zookeeper版本:3.5.7 Java IDE:IDEA JDK&#xff1a;8 步骤 步骤一&#xff1a;在idea创建一个maven项目 步骤二&#xff1a;在虚拟机里找到core-site.x…

如何在3dMax中使用Python返回场景内所有对象的列表?

如何在3dMax中使用Python返回场景内所有对象的列表&#xff1f; 3dMax支持开发基于Python的工具和扩展&#xff0c;因此可以对其进行自定义并将其集成到现代数字内容创建管道中。为此&#xff0c;3dMax集成了Python 3.9解释器&#xff0c;并通过pymxs API公开了3dMax的丰富功能…

如何有效的禁止Google Chrome自动更新?

禁止Chrome自动更新 1、背景2、操作步骤 1、背景 众所周知&#xff0c;当我们在使用Selenium进行Web自动化操作&#xff08;如爬虫&#xff09;时&#xff0c;一般会用到ChromeDriver。然而Driver的更新速度明显跟不上Chrome的自动更新。导致我们在使用Selenium进行一些操作时就…

工业交换机的六种分类

工业交换机可以按照不同的标准进行分类&#xff0c;具体有六种分类方法。我们今天就来简单了解一下这六种分类方法&#xff0c;它们分别是&#xff1a;工业交换机的管理标准、工业交换机的结构标准、工业交换机的网络位置、工业交换机的传输速率、工业交换机的工作协议以及工业…

提升--09-1--AQS底层逻辑实现

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、怎么解释AQS是什么&#xff1f;AQS的本质是JUC包下一个抽象类&#xff0c;AbstractQueuedSynchronizer &#xff08;抽象的队列式同步器&#xff09; 二、AQS核…

四川芸鹰蓬飞:抖店运营的时候注意什么?

抖店作为一个短视频平台&#xff0c;吸引了越来越多的商家加入。在抖店上进行有效的运营是提高销量和曝光度的关键。那么&#xff0c;抖店怎么设置运营呢&#xff1f;有哪些方法可以帮助商家在这个竞争激烈的平台上脱颖而出呢&#xff1f; 一、抖店怎么设置运营&#xff1f; 首…

微服务实战系列之加密RSA

前言 在这个时代&#xff0c;我们选择的人生目标已丰富多彩&#xff0c;秉持的人生态度也千差万别&#xff1a; 除了吃喝玩乐&#xff0c;还有科技探索&#xff1b; 除了CityWalk&#xff0c;还有“BookWalk”&#xff1b; 除了走遍中国&#xff0c;还有走遍世界&#xff1b; …

Selenium自动化测试详解

最近也有很多人私下问我&#xff0c;selenium学习难吗&#xff0c;基础入门的学习内容很多是3以前的版本资料&#xff0c;对于有基础的人来说&#xff0c;3到4的差别虽然有&#xff0c;但是不足以影响自己&#xff0c;但是对于没有学过的人来说&#xff0c;通过资料再到自己写的…

Spring-IOC-Spring6和JUnit5集成

1、父工程pom.xml <properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><spring.version>…

【FLink】水位线(Watermark)

目录 1、关于时间语义 1.1事件时间 1.2处理时间​编辑 2、什么是水位线 2.1 顺序流和乱序流 2.2乱序数据的处理 2.3 水位线的特性 3 、水位线的生成 3.1 生成水位线的总体原则 3.2 水位线生成策略 3.3 Flink内置水位线 3.3.1 有序流中内置水位线设置 3.4.2 断点式…

【shell】条件语句

一、测试 1.1文件测试test test命令是内部命令 test的语法 test 条件表达式 [ 条件表达式 ] test 选项 文件 -d &#xff1a;判断是否是目录 -f &#xff1a;判断是否是普通文件 -b &#xff1a;判断是否是块设备 -c &#xff1a;判断是否是字符设备 -e &#xff1a;判断是否…

【Python】给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。

问题描述 给出一个包含n个整数的数列&#xff0c;问整数a在数列中的第一次出现是第几个。 输入格式 第一行包含一个整数n。 第二行包含n个非负整数&#xff0c;为给定的数列&#xff0c;数列中的每个数都不大于10000。 第三行包含一个整数a&#xff0c;为待查找的数。 输出格式…

rv1126-rv1109-openssh

这是一个工具&#xff0c;可以通过ssh远程登录来操作&#xff0c;非常逆天&#xff01; 于是rv1109代码自身自带有openssh 所以只需要打开config即可 diff --git a/buildroot/configs/rockchip_rv1126_rv1109_spi_nand_defconfig b/buildroot/configs/rockchip_rv1126_rv1109…

Android codec2 视频框架之输出端的内存管理

文章目录 前言setSurfacestart从哪个pool中申请buffer解码后框架的处理流程renderOutbuffer 输出显示 前言 输出buffer整体的管理流程主要可以分为三个部分&#xff1a; MediaCodc 和 应用之间的交互 包括设置Surface、解码输出回调到MediaCodec。将输出buffer render或者rele…

手机照片一键去水印轻松摆脱不需要的旁观者

是什么让照片中的意外客人成为挑战&#xff1f;我们都经历过这种情况——在热门地标或繁忙的城市街道拍照&#xff0c;不可避免地会在画面中捕捉到陌生人。有时他们会无意中抢尽风头&#xff0c;转移观众的注意力。 这些水印不仅影响了照片的美观度&#xff0c;还给我们的观赏体…