|
@@ -1,17 +1,17 @@
|
|
|
-import React, {useEffect, useState} from 'react'
|
|
|
+import React from 'react'
|
|
|
import { Color } from "csstype"
|
|
|
import * as Cesium from 'cesium'
|
|
|
-import { WebMapTileServiceImageryProvider, GeographicTilingScheme } from 'cesium'
|
|
|
-import * as Ol from 'ol'
|
|
|
import createMVTWithStyle from './mvt'
|
|
|
import style from './style.module.css'
|
|
|
|
|
|
declare global {
|
|
|
- interface Window { CESIUM_BASE_URL: any; }
|
|
|
+ interface Window { CESIUM_BASE_URL: any; ol: any }
|
|
|
}
|
|
|
|
|
|
window.CESIUM_BASE_URL = './'
|
|
|
|
|
|
+const ol = window.ol
|
|
|
+
|
|
|
export interface LayerStyle {
|
|
|
lineColor: Color,
|
|
|
lineWidth: number,
|
|
@@ -25,8 +25,11 @@ interface Props extends LayerStyle {
|
|
|
height: number
|
|
|
}
|
|
|
|
|
|
+interface State {
|
|
|
+ viewer: any
|
|
|
+}
|
|
|
+
|
|
|
function createStyle (style: LayerStyle) {
|
|
|
- let ol = Ol as any
|
|
|
return new ol.style.Style({
|
|
|
fill: new ol.style.Fill({
|
|
|
color: style.fillColor,
|
|
@@ -36,33 +39,34 @@ function createStyle (style: LayerStyle) {
|
|
|
color: style.lineColor,
|
|
|
width: style.lineWidth,
|
|
|
lineCap: "round",
|
|
|
-
|
|
|
}),
|
|
|
});
|
|
|
}
|
|
|
|
|
|
-//天地图影像服务
|
|
|
-const tdtImagerLayerProvider = new WebMapTileServiceImageryProvider({
|
|
|
- url: "http://{s}.tianditu.gov.cn/img_c/wmts?tk=463a3e5ee4e35c17ae02564f18f95655&service=wmts&request=GetTile&version=1.0.0" +
|
|
|
- "&LAYER=img&tileMatrixSet=c&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}" +
|
|
|
- "&style=default&format=tiles",
|
|
|
- layer: "tdtImg_c",
|
|
|
- style: "default",
|
|
|
- format: "tiles",
|
|
|
- tileMatrixSetID: "c",
|
|
|
- subdomains: ["t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7"],
|
|
|
- tilingScheme: new GeographicTilingScheme(),
|
|
|
- tileMatrixLabels: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19"],
|
|
|
- maximumLevel: 50
|
|
|
-})
|
|
|
-
|
|
|
-function VectorView(props: Props) {
|
|
|
- const initViewer = void 0 as unknown as Cesium.Viewer
|
|
|
- const [viewer, setViewer] = useState(initViewer)
|
|
|
-
|
|
|
-
|
|
|
- useEffect(() => {
|
|
|
- let lviewer = new Cesium.Viewer('cesiumContainer', {
|
|
|
+class VectorView extends React.Component<Props, State> {
|
|
|
+ clipLayer: any
|
|
|
+
|
|
|
+ constructor(props: Props) {
|
|
|
+ super(props)
|
|
|
+ this.state = { viewer: null }
|
|
|
+ }
|
|
|
+
|
|
|
+ componentDidUpdate () {
|
|
|
+ if (!this.state.viewer) return;
|
|
|
+ if (this.clipLayer) {
|
|
|
+ this.state.viewer.imageryLayers.remove(this.clipLayer, true)
|
|
|
+ }
|
|
|
+
|
|
|
+ this.clipLayer = createMVTWithStyle(Cesium, ol, {
|
|
|
+ url: this.props.url,
|
|
|
+ style: createStyle(this.props)
|
|
|
+ }) as any;
|
|
|
+
|
|
|
+ this.state.viewer.imageryLayers.addImageryProvider(this.clipLayer);
|
|
|
+ }
|
|
|
+
|
|
|
+ componentDidMount () {
|
|
|
+ let viewer = new Cesium.Viewer('cesiumContainer', {
|
|
|
baseLayerPicker: false,
|
|
|
geocoder: false,
|
|
|
homeButton: false,
|
|
@@ -70,36 +74,25 @@ function VectorView(props: Props) {
|
|
|
timeline: false,
|
|
|
animation: false,
|
|
|
navigationHelpButton: false,
|
|
|
- imageryProvider: tdtImagerLayerProvider
|
|
|
});
|
|
|
- lviewer.camera.flyTo({
|
|
|
+ viewer.camera.flyTo({
|
|
|
duration: 1,
|
|
|
- destination: Cesium.Cartesian3.fromDegrees(props.lng, props.lat, props.height)
|
|
|
+ destination: Cesium.Cartesian3.fromDegrees(this.props.lng, this.props.lat, this.props.height)
|
|
|
});
|
|
|
- lviewer.scene.globe.baseColor = new Cesium.Color(1.0, 1.0, 1.0, 1.0);
|
|
|
- setViewer(lviewer)
|
|
|
- }, [1])
|
|
|
-
|
|
|
-
|
|
|
- useEffect(() => {
|
|
|
- if (!viewer) return;
|
|
|
-
|
|
|
- return;
|
|
|
- const clipLayer = createMVTWithStyle(Cesium, Ol, {
|
|
|
- url: props.url,
|
|
|
- style: createStyle(props)
|
|
|
- }) as any;
|
|
|
-
|
|
|
- viewer.imageryLayers.addImageryProvider(clipLayer);
|
|
|
-
|
|
|
- return () => {
|
|
|
- viewer.imageryLayers.remove(clipLayer, true)
|
|
|
+ viewer.scene.globe.baseColor = new Cesium.Color(1.0, 1.0, 1.0, 1.0);
|
|
|
+ this.setState({ viewer })
|
|
|
+ }
|
|
|
+
|
|
|
+ componentWillUnmount() {
|
|
|
+ if (this.state.viewer) {
|
|
|
+ this.state.viewer.imageryLayers.remove(this.clipLayer, true)
|
|
|
+ this.state.viewer.destroy()
|
|
|
}
|
|
|
- })
|
|
|
+ }
|
|
|
|
|
|
- return (
|
|
|
- <div id="cesiumContainer" className={style.layer}></div>
|
|
|
- )
|
|
|
+ render() {
|
|
|
+ return <div id="cesiumContainer" className={style.layer}></div>
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
export default VectorView
|