Files
sdk4.0/src/Obj/Base/GeoJson/index2.js
2025-07-03 13:54:01 +08:00

146 lines
3.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @name: index
* @author: Administrator
* @date: 2023-03-04 10:39
* @descriptionindex
* @update: 2023-03-04 10:39
*/
import { getHost } from "../../../on";
import Base from '../index'
import Tools from '../../../Tools'
class GeoJson extends Base {
/**
* @constructor
* @param sdk
* @param options {object} 参数
* @param options.id {string} id
* @param options.url {string} geojson地址
* @param [options.color=#ef0606] {string} 线条颜色
* @param [options.width=1] {number} 线条宽度
* @example new YJ.Obj.GeoJson(earth,{id:"123",url:""})
* */
constructor(sdk, options = {}) {
super(sdk, options)
this.primitive = undefined
this.positions = []
this.loading = true
}
setDefaultValue() {
super.setDefaultValue()
this.options.host = this.options.host || getHost()
let url = this.options.url
if(this.options.host) {
let o = new URL(this.options.url, this.options.host)
url = o.href
}
this.options.url = url
this.options.color = this.options.color || '#ef0606'
this.options.width = this.options.width || 1
}
get show() {
if (this.primitive) return this.primitive.show
return undefined
}
set show(status) {
if (this.primitive) {
this.primitive.show = status
}
}
async on() {
let rsp = await fetch(this.options.url)
let json = await rsp.json()
return GeoJson.addDataToGlobe(this, json.features)
}
/*geojosn暂时只用线的形式*/
static addDataToGlobe(that, features) {
const instances = []
for (let i = 0; i < features.length; i++) {
let positions = []
if ('LineString' === features[i].geometry.type) {
features[i].geometry.coordinates.forEach(c => {
that.positions.push({ lng: c[0], lat: c[1] })
positions.push(c[0], c[1])
})
}
if ('Polygon' === features[i].geometry.type) {
features[i].geometry.coordinates.forEach(polygon => {
polygon.forEach(c => {
that.positions.push({ lng: c[0], lat: c[1] })
positions.push(c[0], c[1])
})
})
}
const polyline = new Cesium.GroundPolylineGeometry({
positions: Cesium.Cartesian3.fromDegreesArray(positions),
width: that.options.width //线宽
// vertexFormat: Cesium.PolylineColorAppearance.VERTEX_FORMAT
})
// let geometry = Cesium.PolylineGeometry.createGeometry(polyline)
instances.push(
new Cesium.GeometryInstance({
geometry: polyline
// attributes: {
// color: Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.BLUE),
// },
})
)
}
that.primitive = new Cesium.GroundPolylinePrimitive({
geometryInstances: instances,
// appearance: new Cesium.PerInstanceColorAppearance({ // 为每个instance着色
// translucent: true,
// closed: false
// }),
appearance: new Cesium.PolylineMaterialAppearance({
material: Cesium.Material.fromType('Color', {
color: Cesium.Color.fromCssColorString(that.options.color)
})
}),
asynchronous: false, // 确定基元是异步创建还是阻塞直到准备就绪
show: that.options.show ?? true
})
that.viewer.scene.primitives.add(that.primitive)
that.loading = false
}
remove() {
if (this.primitive) {
super.remove()
this.viewer.scene.primitives.remove(this.primitive)
this.primitive = null
}
}
flyTo() {
if (!this.loading) {
if (this.positions) {
let arr = new Tools().cal_envelope(this.positions)
var rectangle = new Cesium.Rectangle.fromDegrees(
arr[0][0],
arr[0][1],
arr[2][0],
arr[2][1]
)
this.viewer.camera.flyTo({
destination: rectangle
})
}
}
}
flicker() {}
}
export default GeoJson