通过坐标点 半径生成椭圆
function computeCircle(x0: number, y0: number, radius1: number, radius2: number, route: number) {
var positions = [];
let dx = Math.PI * 2 * 6371000
const r1 = radius1 * 360 / dx
const r2 = radius2 * 360 / dx
for (var i = 0; i <= 360; i++) {
var radians = CesiumMath.toRadians(i);
let x1 = x0 + r1 * Math.cos(radians)
let y1 = y0 + r2 * Math.sin(radians)
let theta = CesiumMath.toRadians(-route);
let x = (x1 - x0) * Math.cos(theta) - (y1 - y0) * Math.sin(theta) + x0
let y = (x1 - x0) * Math.sin(theta) + (y1 - y0) * Math.cos(theta) + y0
positions.push([x, y]);
}
return positions;
}
turf 生成多边形多边形并计算合并图形
const createConvexHull = (points: Array<any>) => {
let buffers: Array<any> = []
points.forEach((point) => {
let ps = computeCircle(point.longitude, point.latitude, point.radii[0], point.radii[1], point.rotation || 0)
buffers.push(turf.polygon([ps]));
})
if (buffers.length < 1) {
return null
} else if (buffers.length == 1) {
buffers[0]
} else {
let p2 = buffers[buffers.length - 1]
for (let i = 0; i < buffers.length - 1; i++) {
let p1 = buffers[i]
p2 = turf.union(p2, p1)
}
return p2
}
}
cesium 绘制多边形图元图形
let primitiveCollection = new PrimitiveCollection()
let geojson = createConvexHull(points)
if (geojson && geojson.geometry) {
let instances: any = []
let polygons = geojson.geometry.coordinates
if (geojson.geometry.type == "MultiPolygon") {
polygons.forEach((polygon: any) => {
polygon.forEach((ring: any) => {
const polygonArr = ring.toString().split(',')
polygonArr.forEach((item: string, index: number) => {
polygonArr[index] = parseFloat(item)
})
let instance = new GeometryInstance({
geometry: new PolylineGeometry({
positions: Cartesian3.fromDegreesArray(polygonArr),
width: 2.5,
vertexFormat: PolylineColorAppearance.VERTEX_FORMAT
}),
attributes: {
color: ColorGeometryInstanceAttribute.fromColor(CesiumColor.fromCssColorString('#df2b2b'))
}
})
instances.push(instance)
})
})
} else if (geojson.geometry.type == "Polygon") {
polygons.forEach((ring: any) => {
const polygonArr = ring.toString().split(',')
polygonArr.forEach((item: string, index: number) => {
polygonArr[index] = parseFloat(item)
})
let instance = new GeometryInstance({
geometry: new PolylineGeometry({
positions: Cartesian3.fromDegreesArray(polygonArr),
width: 2.5,
vertexFormat: PolylineColorAppearance.VERTEX_FORMAT
}),
attributes: {
color: ColorGeometryInstanceAttribute.fromColor(CesiumColor.fromCssColorString('#df2b2b'))
}
})
instances.push(instance)
})
}
let primitive = new Primitive({
geometryInstances: instances,
appearance: new PolylineColorAppearance({
translucent: false,
})
})
primitiveCollection.add(primitive)
viewer.scene.primitives.add(primitiveCollection)
}
效果图