Cesium中将wkt数据转化为geoJSON格式后渲染至地球上

这篇博客详细介绍了如何在Vue应用中调用后端接口获取WKT数据,然后利用Turf.js和Cesium库将WKT格式转换为GeoJSON,并在3D地球上进行渲染。当点击关闭按钮时,可以移除渲染效果。实现过程中涉及到Vue组件、axios请求、GeoJSON数据处理和Cesium地图交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现目标:点击显示按钮,调用后端传递来的接口接收wkt数据,在vscode中将wkt数据转化为geoJSON格式,并渲染至地球上。点击关闭按钮,渲染效果移除。

实现方法:

一.调用后端接口

1.后端Swagger中:

2.api的js文件中:

export function getAllData() {
    return request({
        url: '/xxxx/xxxx/all',
        method: 'get',
    });
}

3.vue文件中:

import { getAllDemolition } from '@/api/xxxx/xxxx.js'
// 点击显示按钮处,该按钮再次点击变成关闭
openAdd() {
			this.showAll = !this.showAll
			if (this.showAll == true) {
				getAllData().then((res) => {
					if (res.data.code == 200) {
					}
				})
			} 
		}

二、将后端传来的wkt数据转化为GeoJSON并渲染至地球上

1.vue文件中:在接口调用处,直接将传来的数据传递给js中的方法,前提是已引入js中的方法

import { addGeoJson, removeGeoJson } from '@/earth/xxxx/xxxx.js'
openAdd() {
			this.showAll = !this.showAll
			if (this.showAll == true) {
				getAllData().then((res) => {
					if (res.data.code == 200) {
						addGeoJSON(res.data.data)
					}
				})
			} else {
				removeGeoJson() // 移除渲染效果
			}
		}

2.写数据转换及渲染的js文件中:

import * as turf from '@turf/turf'
let WKT = require('terraformer-wkt-parser'); // 需安装

// let geojson = WKT.parse('LINESTRING (30 10, 10 30, 40 40)');
let addGeoJsonData = []
let labelsData = [];



function addGeoJSON(arr) {
    arr.forEach(item => {
        if (item.geo) {
            let geo = WKT.parse(item.geo)
                // let center = turf.pointOnFeature(geo).geometry.coordinates; // 找中心点
            switch (item.status) {
                case 'XXX':
                    addGeoJson(geo, '#ead980')
                    break
                case 'XXXX':
                    addGeoJson(geo, '#eef237')
                    break
            }
        }

    })

}

function addGeoJson(urlStr, colorStr, callback) {
    let entity = null
    if (!urlStr) return
    Cesium.GeoJsonDataSource.load(urlStr).then((dataSource) => {
        let color = Cesium.Color.fromCssColorString(colorStr).withAlpha(0.7)
        for (let i = 0; i < dataSource.entities.values.length; ++i) {
            entity = dataSource.entities.values[i]

            if (entity) {
                // 形状总体
                if (entity._polygon) {
                    entity._polygon = new Cesium.PolygonGraphics({
                        hierarchy: entity._polygon._hierarchy._value,
                        outline: false,
                        material: color,
                        classificationType: Cesium.ClassificationType.TERRAIN,
                        zIndex: 10,
                        outlineColor: color,
                        outlineWidth: 2,
                        extrudedHeight: 10,
                        show: true
                    })
                }

                // if (entity._polyline) {
                //     entity._polyline = new Cesium.PolylineGraphics({
                //         positions: entity._polyline._positions,
                //         width: 2,
                //         material: color,
                //         clampToGround: true,
                //         classificationType: Cesium.ClassificationType.TERRAIN,
                //         show: true
                //     })
                // }
            }
            entity.cursor = true
        }
        addGeoJsonData.push(dataSource)
        viewer.dataSources.add(dataSource)
        callback(dataSource.entities.values)
    })
}

// 清除拆迁数据
function removeGeoJson() {
    for (let i = 0; i < addGeoJsonData.length; ++i) {
        viewer.dataSources.remove(addGeoJsonData[i])
    }
    addGeoJsonData.length = 0
    addGeoJsonData = []
    for (let j = 0; j < labelsData.length; j++) {
        viewer.entities.remove(labelsData[j])
    }
    labelsData = []
}

export {addGeoJson, removeGeoJson }

 这样就实现了上述目标。

Cesium 中,虽然其本身并未直接提供将圆形几何体(如 `CircleGeometry` 或 `EllipseGeometry`)转换为 WKT(Well-Known Text)格式的功能,但可以通过提取圆上的点并构造 WKT 字符串的方式来实现这一转换。 ### 提取圆上的点 在 Cesium 中,可以通过 `Cesium.EllipseGeometry` 来获取圆上的点集合。假设圆心为 `center`,半径为 `radius`,并且希望生成一个近似圆形的多边形,可以通过如下方式获取圆上的点: ```javascript const numPoints = 36; // 圆上采样点的数量 const positions = Cesium.EllipseGeometry.computeCirclePositions( center, radius, numPoints, false ); ``` 该方法返回的 `positions` 是一个包含多个 `Cartesian3` 坐标的数组,表示圆周上的点。 ### 转换为 WKT 格式 将上述点集转换为 WKT 格式的多边形(Polygon),需要将这些点的经纬度转换为字符串形式,并按照 WKT格式进行拼接。例如,构造一个 WKT 表示的圆形多边形: ```javascript function positionsToWKT(positions, ellipsoid = Cesium.Ellipsoid.WGS84) { const coordinates = positions.map(pos => { const cartographic = ellipsoid.cartesianToCartographic(pos); const longitude = Cesium.Math.toDegrees(cartographic.longitude); const latitude = Cesium.Math.toDegrees(cartographic.latitude); return `${longitude} ${latitude}`; }); return `POLYGON((${coordinates.join(', ')}))`; } ``` ### 示例 结合上述方法,完整的代码示例如下: ```javascript const center = Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883); // 示例中心点 const radius = 100000.0; // 半径,单位为米 const numPoints = 36; const positions = Cesium.EllipseGeometry.computeCirclePositions(center, radius, numPoints, false); const wkt = positionsToWKT(positions); console.log(wkt); ``` 该代码将输出一个表示圆形的 WKT 字符串,例如: ``` POLYGON((-75.59777 40.03883, -75.59776 40.03884, ..., -75.59777 40.03883)) ``` 需要注意的是,WKT 中的多边形要求第一个点和最后一个点相同以闭合图形,因此确保 `positions` 的首尾点一致。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值