1、增加getAllDraw()方法
2、增加默认初始化参数2dMap的功能,设置为true,表示默认为2d地图
3、修改线在加载地形的时候会出现空间断层的问题
4、修复动态修改颜色的bug
5、简标文本与详标文本对齐
6、修复扇形与面的显示问题
9 files modified
1 files added
| | |
| | | "@ant-design/icons": "^4.0.0", |
| | | "antd": "^4.24.16", |
| | | "echarts": "^5.6.0", |
| | | "iclient3d-plot-diy": "^1.0.17", |
| | | "iclient3d-plot-diy-attachment": "^1.0.1", |
| | | "iclient3d-plot-diy": "^1.0.22", |
| | | "iclient3d-plot-diy-attachment": "^1.0.2", |
| | | "jquery": "^3.7.1", |
| | | "react-draggable": "^3.3.2", |
| | | "react-router-dom": "^5.3.4", |
| | |
| | | ### 构建参数 |
| | | |
| | | | 参数 | 说明 | 类型 | 默认值 | |
| | | |-------------------|-------------------------------------------------------------------------------------------------------------------------------------------|-----------------|----------| |
| | | |--------------------------|-------------------------------------------------------------------------------------------------------------------------------------------|-----------------|----------| |
| | | | mapRef | 父组件引用 | React.Component | - | |
| | | | showDefaultLayer | 显示默认图层(国内天地图) | boolean | true | |
| | | | addressSearchUrl | 地址查询基础服务 | string | - | |
| | |
| | | | toolbars | 自定义工具栏,例子:['global', 'fullscreen', {key: 'seethrough2',icon: 'seethrough',titleI18n: 'seethrough2',handleClick: () => {alert('通视分析2') }}] | string | object[] | - | |
| | | | language | 语言 | string | - | |
| | | | i18nObj | obj对象,参考多语言例子 | object | - | |
| | | | defaultSelectedEdit | 是否启用点击就进入编辑 | object | - | |
| | | | defaultShowPropertyPanel | 进入编辑是否显示属性编辑面板 | object | - | |
| | | | useSvgIcon | 是否使用svg图标,启用svg图标后,允许动态使用图标边框和颜色 | boolean | - | | object | - | |
| | | |
| | | |
| | | ### 工具栏功能介绍 |
| | |
| | | import {interval, take} from "rxjs"; |
| | | import {Bp} from "iclient3d-plot-diy"; |
| | | |
| | | const {Cesium} = window; |
| | | const Cesium = window['Cesium']; |
| | | |
| | | export default class ExampleFlyPage extends Component { |
| | | |
| | |
| | | |
| | | |
| | | | 属性 | 英文 | 备注 | |
| | | |-----------------|-----------------|-----------------------------------------| |
| | | |------------------|-----------------|-----------------------------------------| |
| | | | 唯一标识 | code | 唯一标识,如果不传会动态生成一个唯一标识 | |
| | | | 军标代码类型 | type | 1001,1002... | |
| | | | 显示图标文本 | showText | false | |
| | | | 图标文本 | text | 空 | |
| | | | 图标文本颜色 | textColor | #000000 | |
| | | | 标注 | bz | 是否有标柱 | |
| | | | 图标大小 | tbdx | 数字数组,例如[64,64]表示宽64px,高64px | |
| | | | 标注类型 | bzlx | 详标(detail)、简标(simple)、正常(normal), | |
| | |
| | | import ExampleDefaultSelectPage from "./example/ExampleDefaultSelectPage"; |
| | | import ExampleFlyPage from "./example/ExampleFlyPage"; |
| | | import ExampleDynamicDlcPage from "./example/ExampleDynamicBlcPage"; |
| | | import ExampleSimpleEventPage from "./example/ExampleSimpleEventPage"; |
| | | import ExampleAggregatorPage from "./example/ExampleAggregatorPage"; |
| | | |
| | | function App() { |
| | | return ( |
| | |
| | | <Route path="/example/hideToolBar" exact component={ExampleHideToolBarPage}/> |
| | | <Route path="/example/defaultSelect" exact component={ExampleDefaultSelectPage}/> |
| | | <Route path="/example/fly" exact component={ExampleFlyPage}/> |
| | | <Route path="/example/simpleEvent" exact component={ExampleSimpleEventPage}/> |
| | | <Route path="/example/dynamicBlc" exact component={ExampleDynamicDlcPage}/> |
| | | <Route path="/example/aggregator" exact component={ExampleAggregatorPage}/> |
| | | <Route path="/doc" exact component={DocPage}/> |
| | | <Route path="/doc/:page" exact component={DocPage}/> |
| | | <Route path="/test" exact component={TestPage}/> |
| New file |
| | |
| | | import React, {Component} from 'react' |
| | | import './ExampleDrawPage.css' |
| | | import {GIS} from "iclient3d-plot-diy"; |
| | | |
| | | export default class ExampleAggregatorPage extends Component { |
| | | |
| | | |
| | | constructor(props) { |
| | | super(props); |
| | | this.state = { |
| | | htmlString: '<h3>正在加载中...</h3>', |
| | | }; |
| | | } |
| | | |
| | | componentDidMount() { |
| | | fetch('./example/ExampleAggregatorPage.md') |
| | | .then(response => response.text()) |
| | | .then(mdText => { |
| | | this.setState({htmlString: window.marked.parse(mdText)}); |
| | | }); |
| | | |
| | | const randomPoints = this.generateRandomPointsInRadius(35.9042, 112.4074, 10, 200); |
| | | |
| | | let options = []; |
| | | for (let i = 0; i < randomPoints.length; i++) { |
| | | options.push({ |
| | | type: "2002", |
| | | useModify: false, |
| | | lon: randomPoints[i].lng, |
| | | lat: randomPoints[i].lat, |
| | | }); |
| | | } |
| | | this.mapFunction.mapApiService.showDrawDatas(options); |
| | | } |
| | | |
| | | /** |
| | | * 生成指定中心点周围100公里内的2000个随机点 |
| | | * @param {number} centerLat - 中心点纬度(度) |
| | | * @param {number} centerLng - 中心点经度(度) |
| | | * @param {number} radiusKm - 半径(公里) |
| | | * @param {number} count - 生成点数 |
| | | * @returns {Array<{lat: number, lng: number}>} 随机点数组 |
| | | */ |
| | | generateRandomPointsInRadius(centerLat, centerLng, radiusKm = 100, count = 2000) { |
| | | const points = []; |
| | | const earthRadius = 6371; // 地球半径(公里) |
| | | |
| | | for (let i = 0; i < count; i++) { |
| | | // 1. 生成随机方向(0-2π) |
| | | const angle = Math.random() * 2 * Math.PI; |
| | | |
| | | // 2. 生成随机距离(考虑平方根确保均匀分布) |
| | | const distance = Math.sqrt(Math.random()) * radiusKm; |
| | | |
| | | // 3. 将距离转换为弧度 |
| | | const distanceRad = distance / earthRadius; |
| | | |
| | | // 4. 计算新点坐标(哈弗辛公式) |
| | | const latRad = centerLat * Math.PI / 180; |
| | | const lngRad = centerLng * Math.PI / 180; |
| | | |
| | | const newLat = Math.asin( |
| | | Math.sin(latRad) * Math.cos(distanceRad) + |
| | | Math.cos(latRad) * Math.sin(distanceRad) * Math.cos(angle) |
| | | ); |
| | | |
| | | const newLng = lngRad + Math.atan2( |
| | | Math.sin(angle) * Math.sin(distanceRad) * Math.cos(latRad), |
| | | Math.cos(distanceRad) - Math.sin(latRad) * Math.sin(newLat) |
| | | ); |
| | | |
| | | // 5. 转换为度数并存储 |
| | | points.push({ |
| | | lat: newLat * 180 / Math.PI, |
| | | lng: newLng * 180 / Math.PI |
| | | }); |
| | | } |
| | | |
| | | return points; |
| | | } |
| | | |
| | | render() { |
| | | return ( |
| | | <div className={"example_draw_container"}> |
| | | <h3>自动聚合</h3> |
| | | <div className={"map_wrapper"}> |
| | | <GIS refs={e => { |
| | | this.mapFunction = e |
| | | }} |
| | | useSvgIcon={true} |
| | | mapRef={this} |
| | | global={[112, 35, 113, 36]} |
| | | /> |
| | | </div> |
| | | <div className={"code_wrapper"}> |
| | | <div dangerouslySetInnerHTML={{__html: this.state.htmlString}}></div> |
| | | </div> |
| | | </div> |
| | | ) |
| | | } |
| | | } |
| | | |
| | | |
| | |
| | | bz: true, |
| | | bzlx: 'simple', |
| | | jbwb: "P:00019", |
| | | type: "fx", |
| | | type: "2010", |
| | | useModify: false, |
| | | lon: 102.76054539488224, lat: 31.000468100060593, height: 0, |
| | | points: [{lon: 102.76554539488224, lat: 31.000468100060593, height: 0}, { |
| | |
| | | bzlx: 'detail', |
| | | jbwb: 'P:00019', |
| | | xbwb: "F16-1\n美国\n16:45:56\nR:00019\nC:00019", |
| | | type: "fx", |
| | | type: "2010", |
| | | useModify: false, |
| | | lon: 102.73054539488224, lat: 31.001068100060593, height: 0, |
| | | points: [{lon: 102.73554539488224, lat: 31.001068100060593, height: 0}, { |
| | |
| | | delete option.lon; |
| | | delete option.lat; |
| | | delete option.height; |
| | | let p = await this.mapFunction.mapApiService.draw(option) |
| | | let p = await this.mapFunction.mapApiService.draw(option); |
| | | p.drawEnd.subscribe(value => { |
| | | alert(p.export()); |
| | | }) |
| | | this.drawOps.push(p); |
| | | } |
| | | |
| | |
| | | this.mapFunction = e |
| | | } |
| | | } |
| | | useSvgIcon={true} |
| | | iconScales={[[0, 2000], [2000, 10000], [10000, 5000000]]} |
| | | plotUrl={this.state.plotUrl} |
| | | mapRef={this} |
| | |
| | | render() { |
| | | return ( |
| | | <div className={"example_draw_container"}> |
| | | <h3>切换比例尺</h3> |
| | | <h3>动态比例尺</h3> |
| | | <div className={"map_wrapper"}> |
| | | <GIS refs={(e) => this.mapFunction = e} |
| | | plotUrl={this.state.plotUrl} |
| | |
| | | import {interval, take} from "rxjs"; |
| | | import {Bp} from "iclient3d-plot-diy"; |
| | | |
| | | const {Cesium} = window; |
| | | const Cesium = window['Cesium']; |
| | | |
| | | export default class ExampleFlyPage extends Component { |
| | | |
| | |
| | | import {Button, Input} from "antd"; |
| | | import {updateLanguage} from "iclient3d-plot-diy"; |
| | | |
| | | ; |
| | | |
| | | export default class ExamplePage extends Component { |
| | | constructor(props) { |
| | |
| | | <li><NavLink to='/example/defaultSelect'>初始化事件</NavLink></li> |
| | | <li><NavLink to='/example/fly'>飞行</NavLink></li> |
| | | <li><NavLink to='/example/dynamicBlc'>动态比例尺</NavLink></li> |
| | | <li><NavLink to='/example/simpleEvent'>简单事件</NavLink></li> |
| | | <li><NavLink to='/example/aggregator'>自动聚合</NavLink></li> |
| | | </ul> |
| | | <div className={"button_wrapper"}> |
| | | |