cesium源码解析篇:GeoJsonDataSource(Polygon)

2024-01-30 13:44

本文主要是介绍cesium源码解析篇:GeoJsonDataSource(Polygon),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本篇主要内容为

  1. 介绍使用GeoJsonDataSource加载GeoJSON数据之后的代码调用和业务逻辑
  2. 从中提炼对polygon进行解析和创建entity的函数以供参考
    • 读取GeoJSON
    • 获取 feature
    • 判断是 Polygon or MultiPolygon
    • hole
    • 创建entity对象

代码调用栈

  • Cesium.GeoJsonDataSource.load(data, options)
    • new GeoJsonDataSource().load(data, options) // 创建GeoJsonDataSource对象 并加载数据
      • fun preload(that, data, options, clear) // 调用外部函数进行预加载
        • promise = data.fetchJson() // 使用Cesium.Resource.fetchJson函数读取数据 返回一个promise
        • fun load // 调用外部函数load进行数据加载
          • fun tryHander // 根据输入的数据类型获取对应的处理函数
            • fun processFeatureCollection
              • fun processFeature
                • fun processMultiPolygon
                • fun processPolygon
                • fun processMultiLineString
                • fun processLineString
                • fun processmultiPoint
                • fun processPoint
                • fun processTopology

解析Polygon&创建Entity

  1. 读取geojson文件 并返回promise
const jsonPromise = new Cesium.Resource.fetchJson({url: "../../SampleData/data.geojson"
})
  1. 解析数据中的polygon 并返回entities对象
// 根据经度、纬度、高度计算得到空间笛卡尔坐标
function crsFunction(coordinates) {return new Cesium.Cartesian3.fromDegrees(coordinates[0], coordinates[1], coordinates[2]);
};// 将经度、纬度、高度数组转换为空间笛卡尔坐标数组
function coordinatesArrayToCartesianArray(coordinates, crsFunction) {const positions = new Array(coordinates.length);for (let i = 0; i < coordinates.length; i++) {positions[i] = crsFunction(coordinates[i]);}return positions;
}// 根据多边形创建对应的entity         
function createPolygonEntity(polygon){const holes = [];// 如果为带洞多边形for (let i = 1, len = polygon.length; i < len; i++) {holes.push(new Cesium.PolygonHierarchy(coordinatesArrayToCartesianArray(polygon[i], crsFunction)));}// 返回可用于创建entity的object对象return {polygon: {hierarchy:new Cesium.PolygonHierarchy(coordinatesArrayToCartesianArray(polygon[0], crsFunction),holes),height: 0,material: Cesium.Color.RED.withAlpha(0.5),outline: true,outlineColor: Cesium.Color.BLACK,},id: Cesium.createGuid()}
}// 解析GeoJSON数据并返回用于创建entity的object
function getEntitiesFromGeoJSON(data){const entities = []data.features.forEach(feature => {// 获取每个feature的坐标信息和多边形类型const polygons = feature.geometry.coordinates;const polygonType = feature.geometry.type;// 对多边形和多多边形进行分别处理if (polygonType == "Polygon"){const entity = createPolygonEntity(polygons);entities.push(entity);} else if (polygonType == "MultiPolygon"){for (let i = 0; i < polygons.length; i++) {const entity = createPolygonEntity(polygons[i]);entities.push(entity);}}})return entities;
}jsonPromise.then(function(data){const entities = getEntitiesFromGeoJSON(data);
})
  1. 添加所有entity对象
entities.forEach(function(entity){viewer.entities.add(entity)
})

这篇关于cesium源码解析篇:GeoJsonDataSource(Polygon)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/660429

相关文章

关于WebSocket协议状态码解析

《关于WebSocket协议状态码解析》:本文主要介绍关于WebSocket协议状态码的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录WebSocket协议状态码解析1. 引言2. WebSocket协议状态码概述3. WebSocket协议状态码详解3

CSS Padding 和 Margin 区别全解析

《CSSPadding和Margin区别全解析》CSS中的padding和margin是两个非常基础且重要的属性,它们用于控制元素周围的空白区域,本文将详细介绍padding和... 目录css Padding 和 Margin 全解析1. Padding: 内边距2. Margin: 外边距3. Padd

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步