Cesium之3D拉伸显示行政区

转自原文 Cesium之3D拉伸显示行政区含GeoJSON数据生成过程GDAL的ogr2ogr

 

Cesiumjs 是一套javascript库,用来渲染3D地球,2D区域地图,和多种GIS要素。不需要安装任何插件就能在支持最新HTML5标准的浏览器上运行。支持WebGL硬件加速,非常适合动态数据在GIS图层上的展示,是一个跨平台,开源,非常有前途的webgis表现层库。Cesium 基于 Apache 开源协议,支持商业和非商业免费使用。

背景:

Cesiumjs源自 Analytical Graphics, Inc. (AGI)公司为他们客户开发一个虚拟地球项目,后来将cesium项目贡献给开源社区并一直活跃开发中。是一种针对Cesium-应用的流式高分辨率服务器)另一个公司级的贡献者是NICTA (NationalICT Australia) 澳大利亚最大的信息与通讯技术中心,NICTA的员工们贡献了瓦片地图服务、地形处理等cesium的核心功能。并一直使用cesium开发环境监测分析、交通基础设施建模仿真优化等领域的应用。

 

 

Demo需求,想要将北京市行政区划内的要素,用3D表现出来,首先,需要得到北京16个区的面坐标:

 

Cesium通过GeoJSON(JSON格式)格式的数据展示空间要素,因此,需要得到此种格式的北京行政区划坐标,通过研究,可以使用GDAL的ogr2ogr方法将shp格式的图层转成GeoJSON格式

 

下面说一下GDAL的下载和使用:

 

需要安装GDAL,下载路径:http://www.gisinternals.com/release.php
下载的是第一个:release-1500-gdal-1-11-3-mapserver-6-4-2
解压缩release-1500-gdal-1-11-3-mapserver-6-4-2.zip
根据里面的read-me.txt,安装此GDAL需要CMD运行SDKShell.bat命令即可,成功安装,每次重启机器后,需要重新执行此程序进行安装,才能使用
然后cd C:\Users\IBM_ADMIN\Downloads\release-1500-gdal-1-11-3-mapserver-6-4-2\bin\gdal\apps

 

根据ogr2ogr.exe的工具进行转换,开始,找到的shp文件转换失败,后从此命令转换的shp修改了下,即可成功转成json,可能是有的shp文件不支持,具体不详
命令:
将geoJSON转成shp格式:
C:\Users\IBM_ADMIN\Downloads\release-1500-gdal-1-11-3-mapserver-6-4-2\bin\gdal\a
pps>ogr2ogr -f "ESRI Shapefile" v.shp geojsonfile.json

将f.shp转成geoJSON格式:
C:\Users\IBM_ADMIN\Downloads\release-1500-gdal-1-11-3-mapserver-6-4-2\bin\gdal\a
pps>ogr2ogr -f "GeoJSON" o.json f.shp

 

因为本地没有现成的北京行政区shp图层,因此,又发现竟然可以通过ESRI在线地图服务的行政区图层转成GeoJSON格式,开始发现坐标系不是wgs84,Cesium-1.16仅支持WGS84坐标系,因为,加入参数,将ESRI的输出坐标系转成4326,即可。


代码:

 

ogr2ogr -f GeoJSON test.json "http://cache1.arcgisonline.cn/ArcGIS/rest/services/ChinaCities_Community_BaseMap_CHN/BeiJing_Community_BaseMap_CHN/MapServer/0/query?where=1%3D1&outfields=*&f=json" OGRGeoJSON
修改下语句即可,ArcGISServer支持输出不同的坐标系
ogr2ogr -f GeoJSON test.json "http://cache1.arcgisonline.cn/ArcGIS/rest/services/ChinaCities_Community_BaseMap_CHN/BeiJing_Community_BaseMap_CHN/MapServer/0/query?where=1%3D1&outSR=4326&outfields=*&f=json" OGRGeoJSON

完成导出

 

这时候终于得到了GeoJSON格式的北京行政区数据文件

下面就是将Cesium现成的例子,改个数据源地址,和高程字段

//Seed the random number generator for repeatable results.
    Cesium.Math.setRandomNumberSeed(0);

    var promise = Cesium.GeoJsonDataSource.load('../../SampleData/test.json');
    promise.then(function(dataSource) {
        viewer.dataSources.add(dataSource);

        //Get the array of entities
        var entities = dataSource.entities.values;
        
        var colorHash = {};
        for (var i = 0; i < entities.length; i++) {
            //For each entity, create a random color based on the state name.
            //Some states have multiple entities, so we store the color in a
            //hash so that we use the same color for the entire state.
            var entity = entities[i];
            var name = entity.name;
            var color = colorHash[name];
            if (!color) {
                color = Cesium.Color.fromRandom({
                    alpha : 1.0
                });
                colorHash[name] = color;
            }
            
            //Set the polygon material to our random color.
            entity.polygon.material = color;
            //Remove the outlines.
            entity.polygon.outline = false;

            //Extrude the polygon based on the state's population.  Each entity
            //stores the properties for the GeoJSON feature it was created from
            //Since the population is a huge number, we divide by 50.
            entity.polygon.extrudedHeight = entity.properties.Shape_Area / 100000.0;
         
            }
        }
        viewer.zoomTo(promise);

 

 

 

最终效果如上图所示。

 

### Cesium行政区边界绘制 在 Cesium 中实现行政区边界的绘制通常涉及获取地理数据并将其转换为适合渲染的格式。对于天地图中的行政区划接口,返回的数据通常是 WKT (Well-Known Text) 格式[^3]。为了能够在 Cesium 中使用这些数据,需要先将 WKT 转换成 GeoJSON 或者直接解析成 Cesium 可识别的对象。 #### 使用 Terraformer-WKT 解析器处理 WKT 数据 Terraformer-WKT 是一个用于解析和创建 WKT 几何对象的小型 JavaScript 库。可以利用这个工具来读取来自天地图的服务响应,并进一步加工以便于 Cesium 的展示: ```javascript import { Parser } from 'terraformer-wkt-parser'; // 假设 `wktString` 是从服务器接收到的一个多边形字符串表示形式 const wktString = "POLYGON ((...))"; // 这里省略具体坐标值 // 创建一个新的 parser 实例并将 WKT 字符串转为 GeoJSON 对象 let geoJsonFeature = new Parser().parse(wktString); ``` #### 将 GeoJSON 添加到 Cesium 场景中 一旦拥有了 GeoJSON 特征集合,就可以通过 Cesium 提供的方法轻松地把这些特征加入场景之中: ```javascript viewer.dataSources.add(Cesium.GeoJsonDataSource.load(geoJsonFeature)); ``` 上述代码片段展示了如何加载单个几何体;如果要批量导入多个区域,则可能需要遍历整个 FeatureCollection 并分别添加它们。 #### 官方 API 文档链接 更多有关此功能的信息可以在官方文档找到详细的说明[^2]: - [GeoJsonDataSource](https://cesium.com/docs/cesiumjs-ref-doc/GeoJsonDataSource.html) 此外,在 Vue 和 OpenLayers 结合使用的上下文中虽然不是直接针对 Cesium, 但是也存在一些扩展组件可以帮助简化 GIS 开发工作流程[^1]。不过对于特定的地图引擎如 Cesium 来说,还是建议优先查阅其自身的资源和技术支持渠道。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值