edit | blame | history | raw

ExampleDrawDy2Page 代码

import React, {Component} from 'react'
import './ExampleDrawPage.css'
import {GIS} from "iclient3d-plot-diy";
import {Button, Input} from "antd";
import {timer} from "rxjs";


export default class ExampleDrawDy2Page extends Component {


    optionObjs = {
        "目标简标": {
            allowPicking: false,
            code: '123123',
            bz: true,
            bzColor: '#e000ff',
            bzLineColor: '#ff0000',
            bzlx: 'simple',
            jbwb: 'R:00017',
            type: "2002",
            returnHeight: true,
            useModify: false,
            lon: 102.73054539488224, lat: 31.005468100060593, height: 0,
            points: [],
            iconSize: [[20, 20], [30, 30], [40, 40]]
        },
        "目标醒目": {
            allowPicking: false,
            bz: true,
            bzColor: '#0000FF',
            bzLineColor: '#000000',
            bzlx: 'simple',
            jbwb: 'R:00017',
            xz: true,
            xzColor: '#00ff00',
            xx: true,
            xxColor: '#ff0000',
            type: "2002",
            iconColor: '#dddddd',
            returnHeight: true,
            useModify: false,
            lon: 102.73554539488224, lat: 31.005068100060593, height: 0,
            points: []
        },
        "目标详标": {
            allowPicking: false,
            bz: true,
            bzlx: 'detail',
            jbwb: 'R:00017',
            xbwb: "17/10/2019\n16:45:8\n9260.00-10400.00MHZ",
            type: "2002",
            useModify: false,
            lon: 102.70054539488224, lat: 31.000468100060593, height: 0,
            points: [],
            iconSize: [[20, 20], [30, 30], [40, 40]]
        },
        "飞行简标": {
            allowPicking: false,
            bz: true,
            bzlx: 'simple',
            jbwb: "P:00019",
            type: "2010",
            useModify: false,
            lon: 102.76054539488224, lat: 31.000468100060593, height: 0,
            points: [{lon: 102.76554539488224, lat: 31.000468100060593, height: 0}, {
                lon: 102.76904539488224,
                lat: 30.992468100060593,
                height: 0
            }],
            iconSize: [[20, 20], [30, 30], [40, 40]]
        },
        "飞行详标": {
            allowPicking: false,
            bz: true,
            bzlx: 'detail',
            jbwb: 'P:00019',
            xbwb: "F16-1\n美国\n16:45:56\nR:00019\nC:00019",
            type: "2010",
            useModify: false,
            lon: 102.73054539488224, lat: 31.001068100060593, height: 0,
            points: [
                {lon: 102.73554539488224, lat: 31.001068100060593, height: 0},
                {lon: 102.73904539488224, lat: 30.992468100060593, height: 0}
            ],
            iconSize: [[20, 20], [30, 30], [40, 40]]
        },
        "雷达对抗侦察区域": {
            allowPicking: false,
            type: "lddkzcqy",
            bj: 1,
            qsjd: 30,
            zzjd: 75,
            lon: 102.72004539488224, lat: 31.001068100060593, height: 0,
            useModify: false,
            iconSize: [[20, 20], [30, 30], [40, 40]]
        },
        "雷达对抗干扰波束": {
            allowPicking: false,
            type: 'lddkgrps',
            bj: 1,
            qsjd: 30,
            zzjd: 75,
            lon: 102.72004539488224, lat: 30.991068100060593, height: 0,
            useModify: false,
            iconSize: [[20, 20], [30, 30], [40, 40]]
        },
        "雷达对抗测向线": {
            allowPicking: false,
            type: "lddkcxx",
            kcwb: "10110",
            kcgls: 1,
            kcjd: 30,
            useModify: false,
            lon: 102.76054539488224, lat: 31.011068100060593, height: 0,
            points: []
        },
        "雷达对抗关系": {
            allowPicking: false,
            type: "lddkgx",
            kcwb: "10110",
            kcgls: 1,
            kcjd: 30,
            useModify: false,
            lon: 102.78054539488224,
            lat: 31.015068100060593,
            height: 0,
            points: []
        },
        "雷达对目标探测": {
            allowPicking: false,
            type: "lddmbtc",
            bj: 0.5,
            qsjd: 0,
            zzjd: 360,
            lon: 102.71004539488224, lat: 30.990068100060593, height: 0,
            useModify: false,
        },
        "通信对抗侦察区域": {
            allowPicking: false,
            type: "txdkzcqy",
            bj: 0.5,
            qsjd: 0,
            zzjd: 360,
            lon: 102.69804539488224, lat: 30.990068100060593, height: 0,
            useModify: false,
        },
        "通信对抗干扰波束": {
            allowPicking: false,
            type: "txdkgrps",
            bj: 1,
            qsjd: 30,
            zzjd: 75,
            lon: 102.76004539488224, lat: 30.991068100060593, height: 0,
            useModify: false,
        },
        "通信对抗测向线": {
            allowPicking: false,
            type: "txdkcxx",
            kcgls: 1,
            kcjd: 30,
            kcwb: "10110",
            useModify: false,
            lon: 102.76854539488224, lat: 31.009068100060593, height: 0,
            points: []
        },
        "通信畅通区域": {
            allowPicking: false,
            type: 'txctqy',
            bj: 0.5,
            qsjd: 0,
            zzjd: 360,
            lon: 102.71504539488224, lat: 30.980068100060593, height: 0,
            useModify: false,
        },
        "通信网标绘": {
            type: "txw",
            allowPicking: false,
            useModify: false,
            lon: 102.70854539488224, lat: 31.0098468100060593, height: 0,
            points: []
        },
        "光电对抗侦察区域": {
            type: 'gddkzcqy',
            allowPicking: false,
            bj: 0.5,
            qsjd: 0,
            zzjd: 360,
            lon: 102.69054539488224, lat: 31.0098468100060593, height: 0,
            useModify: false,
        },
        "光电有源对抗干扰波束": {
            allowPicking: false,
            type: 'gdyydkgrbs',
            kcgls: 1,
            kcjd: 30,
            lon: 102.67054539488224, lat: 31.0098468100060593, height: 0,
            useModify: false,
        },
        "漫反射干扰区域": {
            allowPicking: false,
            type: 'mfsgrqy',
            bj: 1,
            qsjd: 30,
            zzjd: 75,
            lon: 102.67054539488224, lat: 31.0028468100060593, height: 0,
            useModify: false,
        },
        '烟幕形成区域': {
            allowPicking: false,
            type: 'ymxcqy',
            points: [{lon: 102.64984, lat: 30.99237, height: 0},
                {lon: 102.66012682459443, lat: 30.995109020954718, height: 0},
                {lon: 102.67126799815856, lat: 30.98766239848537, height: 0},
                {lon: 102.64984, lat: 30.983747593478107, height: 0},
                {lon: 102.64984, lat: 30.99237, height: 0}],
            useModify: false,
        },
        "掩护区域": {
            allowPicking: false,
            type: 'yhqy',
            points: [{lon: 102.642853926199, lat: 31.012509646376447, height: 0},
                {lon: 102.65927322610115, lat: 31.01540811637356, height: 0},
                {lon: 102.66192135373299, lat: 31.005988487769518, height: 0},
                {lon: 102.64755620178961, lat: 31.00246196283815, height: 0},
                {lon: 102.642853926199, lat: 31.012509646376447, height: 0}],
            useModify: false,
        },
        "协同关系": {
            allowPicking: false,
            type: 'xtgx',
            points: [{lon: 102.642853926199, lat: 31.012509646376447, height: 0},
                {lon: 102.66192135373299, lat: 31.005988487769518, height: 0}],
            useModify: false,
        },
        "干扰线": {
            allowPicking: false,
            type: 'grx',
            points: [{lon: 102.732420985008, lat: 30.97556325857848, height: 0},
                {lon: 102.73983041603873, lat: 30.97504986175468, height: 0}],
            useModify: false
        },
        "预警线": {
            allowPicking: false,
            type: 'yjx',
            useModify: false,
            points: [{lon: 102.732420985008, lat: 30.97956325857848, height: 0},
                {lon: 102.73983041603873, lat: 30.98004986175468, height: 0}]
        },
        "目标分配线": {
            allowPicking: false,
            type: 'mbfpx',
            useModify: false,
            points: [{lon: 102.732420985008, lat: 30.97756325857848, height: 0},
                {lon: 102.73983041603873, lat: 30.97804986175468, height: 0}]
        },

        "干扰关系线": {
            type: "grgxx",
            color: '#ffff00',
            useModify: false,
            points: [{
                lon: 104.73554539488224,
                lat: 31.005068100060593,
                height: 0,
            }, {
                lon: 103.73554539488224,
                lat: 32.005068100060593,
                height: 0,
            }]
        },

        "单色线": {
            type: "line",
            bklx: 'solid',
            bkkd: 4,
            color: '#64c324',
            useModify: false,
            points: [{
                lon: 103.73554539488224,
                lat: 31.005068100060593,
                height: 0,
            }, {
                lon: 104.73554539488224,
                lat: 32.005068100060593,
                height: 0,
            }]
        },
        "双色线": {
            type: "line",
            bklx: 'double',
            bkkd: 4,
            color: '#ff0000',
            color2: '#0000ff',
            useModify: false,
            points: [{
                lon: 103.73554539488224,
                lat: 31.005068100060593,
                height: 0,
            }, {
                lon: 104.73554539488224,
                lat: 32.005068100060593,
                height: 0,
            }]
        },
        "通信抗测向线2": {
            type: "txdkcxx2",
            kcjd: 120,
            kcgls: 10,
            kcwb: '123123',
            color: '#0059FFA3',
            lon: 103.73554539488224,
            lat: 31.005068100060593,
            height: 0,
            useModify: false,
            points: []
        },
        "团指任务分界线": {
            type: "tzrwfjx",
            color: '#D5013A',
            useModify: false,
            points: [{
                lon: 102.73554539488224,
                lat: 31.005068100060593,
                height: 0,
            }, {
                lon: 103.73554539488224,
                lat: 32.005068100060593,
                height: 0,
            }]
        },
        "连指任务分界线": {
            type: "lzrwfjx",
            color: '#D5013A',
            useModify: false,
            points: [{
                lon: 102.45554539488224,
                lat: 31.005068100060593,
                height: 0,
            }, {
                lon: 103.45554539488224,
                lat: 32.005068100060593,
                height: 0,
            }]
        },
        "干扰波束": {
            type: "grbs",
            color: '#D5013A',
            useModify: false,
            lon: 102.23554539488224,
            lat: 31.005068100060593,
            height: 0,
            qsjd: 30,
            zzjd: 130,
            bj: 100
        }
    }

    drawOps = [];
    timer = null;

    constructor(props) {
        super(props);
        this.state = {
            htmlString: '<h3>正在加载中...</h3>',
            rate: 1000,
            drawCount: 100
        };
    }

    componentDidMount() {
        fetch('./example/ExampleDrawDyPage.md')
            .then(response => response.text())
            .then(mdText => {
                this.setState({htmlString: window.marked.parse(mdText)});
            });
    }


    async draw(option) {
        this.closeUpdate();
        option.useModify = true;
        delete option.points;
        delete option.lon;
        delete option.lat;
        delete option.height;
        let p = await this.mapFunction.mapApiService.draw(option);
        p.drawEnd.subscribe(value => {
            // alert(p.export());
        })
        this.drawOps.push(p);
    }

    arr2;

    startTimer() {
        if (this.timer) {
            clearInterval(this.timer);
            this.timer = null;
        }

        let arr = [];
        let index = 0;
        for (let key in this.optionObjs) {
            if (!this.optionObjs[key].code) {
                this.optionObjs[key].code = this.optionObjs[key].type + (index++);
            }
            arr.push(this.optionObjs[key]);
            // if (this.optionObjs[key] && this.optionObjs[key].lat) {
            //     arr.push(this.optionObjs[key]);
            // }
        }
        let arr2 = [];
        for (let i = 0; i < parseInt(this.state.drawCount + ''); i++) {
            let index = i % arr.length;
            let option = JSON.parse(JSON.stringify(arr[index]));
            option.lat = arr[index].lat + i * 0.0001;
            option.lon = arr[index].lon + i * 0.0001;
            option.code = option.type + i;
            arr2.push(option);
        }
        this.mapFunction.mapApiService.showDrawDatas(arr2);
        this.arr2 = arr2;

        let i = 0;
        this.timer = setInterval(() => {
            i++;
            for (let one of arr2) {
                let option;
                if (one && one.lat) {
                    // 表示航迹
                    if (one.points && one.points.length > 0) {
                        option = Object.assign({}, one);
                        one.points.push({
                            lat: one.lat,
                            lon: one.lon,
                            height: one.height,
                        });
                        one.lat = one.lat + 0.0001;
                        one.lon = one.lon + 0.0001;

                        option = one;
                    } else {
                        one.lat = one.lat + 0.0001;
                        option = one;
                        // option = {
                        //     lat: one.lat,
                        //     lon: one.lon + i * 0.0001,
                        //     height: one.height,
                        //     allowPicking: one.allowPicking,
                        // }
                    }
                } else if (one && one.points) {
                    one.points = one.points.map(point => {
                        return {
                            lat: point.lat,
                            lon: point.lon + i * 0.0001,
                            height: point.height,
                        }
                    })
                    option = one;
                }


                if (i % 10 == 0) {
                    this.mapFunction.mapApiService.removeDraw(one.code);
                    this.mapFunction.mapApiService.showDrawDatas([one]);
                } else {
                    this.mapFunction.mapApiService.updateDraw(one.code, option);
                }
            }
        }, parseInt(this.state.rate + '') || 1000);
    }

    stopTimer() {
        if (this.timer) {
            clearInterval(this.timer);
            this.timer = null;
        }
        if (this.arr2) {
            for (let one of this.arr2) {
                this.mapFunction.mapApiService.removeDraw(one.code);
            }
            this.arr2 = null;
        }
    }


    updateOption(i) {
        for (let d of this.drawOps) {
            let dd = d.export();

            let op = {};
            if (dd.jbwb) {
                op.jbwb = '更新' + i;
            }
            if (dd.bj) {
                op.bj = dd.bj + 0.01;
            }
            if (dd.kcwb) {
                op.kcwb = '更新' + i;
            }

            if (dd.lon && dd.lat) {
                dd.lon = dd.lon + 0.001;
                dd.lat = dd.lat + 0.0001;
                op.lon = dd.lon;
                op.lat = dd.lat;
            }

            if (dd.points) {
                op.points = dd.points;
                for (let point of op.points) {
                    point.lon = point.lon + 0.001;
                    point.lat = point.lat + 0.0001;
                }
            }
            this.mapFunction.mapApiService.updateDraw(d.code, op);
        }
    }

    changSize() {
        if (this.timer) {
            clearInterval(this.timer);
            this.timer = null;
        }
        let i = 10;
        let draws = this.mapFunction.mapApiService.drawPlotObjs;
        this.timer = setInterval(() => {
            i = i + 1;
            for (let key in draws) {
                let d = draws[key];
                this.mapFunction.mapApiService.dyPlotService.changSize(d, i, i);
            }
        }, 1000);
    }

    changColor() {
        this.mapFunction.mapApiService.dyPlotService.changeLineColor("#00FFE5");
    }

    setDrawScaleOptions() {
        let options = [
            {
                scales: [0, 50],
                width: 20,
                height: 20
            },
            {
                scales: [50, 500],
                width: 32,
                height: 32
            },
            {
                scales: [500, 10000],
                width: 64,
                height: 64
            }
        ]
        this.mapFunction.mapApiService.setDrawScaleOptions(options);
        alert('设置成功!')
    }

    render() {
        return (
            <div className={"example_draw_container"}>
                <h3>军标绘制/展示已有的军标数据</h3>
                <div className={"map_wrapper"}>
                    <GIS refs={
                        e => {
                            this.mapFunction = e
                        }
                    }
                         map2_5D={true}
                         useSvgIcon={true}
                         iconScales={[[0, 2000], [2000, 10000], [10000, 5000000]]}
                         plotUrl={this.state.plotUrl}
                         mapRef={this}
                         showDefaultLayer={true}
                    />
                </div>

                <p>

                    <span>条数:</span>
                    <Input
                        style={{width: '100px', display: 'inline-block'}}
                        placeholder={'请输入条数'}
                        defaultValue={this.state['drawCount']}
                        onChange={(v) => this.setState({drawCount: v.target.value})}
                    />
                </p>
                <p>

                    <span>频率(ms):</span>
                    <Input
                        style={{width: '100px', display: 'inline-block'}}
                        placeholder={'请输入频率(ms)'}
                        defaultValue={this.state['rate']}
                        onChange={(v) => this.setState({rate: v.target.value})}
                    />
                    <br/>
                </p>
                <Button type="primary" onClick={this.startTimer.bind(this)}>开始</Button>
                <Button type="primary" onClick={this.stopTimer.bind(this)}>结束</Button>
                <div className={"code_wrapper"}>
                    <div dangerouslySetInnerHTML={{__html: this.state.htmlString}}></div>
                </div>
            </div>
        )
    }
}