| New file |
| | |
| | | import * as Cesium from 'cesium' |
| | | import jaGeojsonRaw from '@/assets/geojson/ja.geojson?raw' |
| | | |
| | | const DEFAULT_OPTIONS = { |
| | | strokeColor: '#00F9EC', |
| | | strokeWidth: 2, |
| | | fillColor: '#FFFFFF', |
| | | fillAlpha: 0.05, |
| | | labelFont: '14px Source Han Sans CN', |
| | | labelFill: '#FFFFFF', |
| | | labelOutline: '#18305C', |
| | | labelOutlineAlpha: 1, |
| | | zoomTo: true, |
| | | } |
| | | |
| | | export const loadJaAdminBoundary = async (viewer, options = {}) => { |
| | | if (!viewer) return null |
| | | const config = { ...DEFAULT_OPTIONS, ...options } |
| | | const geojson = JSON.parse(jaGeojsonRaw) |
| | | |
| | | const boundarySource = await Cesium.GeoJsonDataSource.load(geojson, { |
| | | stroke: Cesium.Color.fromCssColorString(config.strokeColor), |
| | | strokeWidth: config.strokeWidth, |
| | | fill: Cesium.Color.fromCssColorString(config.fillColor).withAlpha(config.fillAlpha), |
| | | clampToGround: true, |
| | | }) |
| | | viewer.dataSources.add(boundarySource) |
| | | |
| | | const lineSource = new Cesium.CustomDataSource('jaBoundaryLineSource') |
| | | boundarySource.entities.values.forEach(entity => { |
| | | const polygon = entity.polygon |
| | | if (!polygon) return |
| | | const hierarchy = polygon.hierarchy?.getValue?.(viewer.clock.currentTime) |
| | | const positions = hierarchy?.positions |
| | | if (!positions?.length) return |
| | | lineSource.entities.add({ |
| | | polyline: { |
| | | positions, |
| | | clampToGround: true, |
| | | width: config.strokeWidth, |
| | | material: Cesium.Color.fromCssColorString(config.strokeColor), |
| | | }, |
| | | }) |
| | | }) |
| | | viewer.dataSources.add(lineSource) |
| | | |
| | | const labelSource = new Cesium.CustomDataSource('jaBoundaryLabelSource') |
| | | geojson.features?.forEach(feature => { |
| | | const name = feature?.properties?.name |
| | | const point = feature?.properties?.centroid || feature?.properties?.center |
| | | if (!name || !Array.isArray(point) || point.length < 2) return |
| | | labelSource.entities.add({ |
| | | position: Cesium.Cartesian3.fromDegrees(point[0], point[1]), |
| | | label: { |
| | | text: name, |
| | | font: config.labelFont, |
| | | fillColor: Cesium.Color.fromCssColorString(config.labelFill), |
| | | outlineColor: Cesium.Color.fromCssColorString(config.labelOutline).withAlpha( |
| | | config.labelOutlineAlpha |
| | | ), |
| | | outlineWidth: 2, |
| | | style: Cesium.LabelStyle.FILL_AND_OUTLINE, |
| | | heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, |
| | | verticalOrigin: Cesium.VerticalOrigin.CENTER, |
| | | horizontalOrigin: Cesium.HorizontalOrigin.CENTER, |
| | | disableDepthTestDistance: Number.POSITIVE_INFINITY, |
| | | }, |
| | | }) |
| | | }) |
| | | viewer.dataSources.add(labelSource) |
| | | |
| | | if (config.zoomTo) { |
| | | await viewer.flyTo(boundarySource, { |
| | | duration: 0, |
| | | offset: new Cesium.HeadingPitchRange(0, Cesium.Math.toRadians(-75), 0), |
| | | }) |
| | | } |
| | | |
| | | return { boundarySource, lineSource, labelSource } |
| | | } |
| | | |
| | | export const removeJaAdminBoundary = (viewer, sources) => { |
| | | if (!viewer || !sources) return |
| | | const { boundarySource, lineSource, labelSource } = sources |
| | | if (boundarySource) viewer.dataSources.remove(boundarySource) |
| | | if (lineSource) viewer.dataSources.remove(lineSource) |
| | | if (labelSource) viewer.dataSources.remove(labelSource) |
| | | } |