基础模板

基础

  1. import React, { createRef, useEffect, useRef } from 'react';
  2. import { Map, View, Feature, Overlay } from 'ol';
  3. import reactDom from 'react-dom';
  4. import TileLayer from 'ol/layer/Tile';
  5. import { OSM } from 'ol/source';
  6. import { Point, LineString } from 'ol/geom'; //点
  7. import { Icon, Stroke, Style } from 'ol/style';
  8. import VectorLayer from 'ol/layer/Vector';
  9. import VectorSource from 'ol/source/Vector';
  10. import 'ol/ol.css';
  11. import styles from './index.less';
  12. import poiImg from '@/assets/images/house.png';
  13. import ycdl from '../json/ycdl.json'
  14. const Index: React.FC = () => {
  15. // 地图
  16. const map = useRef
  17. // 地图容器
  18. const mapDom = createRef
  19. useEffect(() => {
  20. // 初始化地图
  21. initMap()
  22. // 加载标注
  23. createFeature(ycdl.features[0].geometry.coordinates, poiImg, 'iconFeature');
  24. //加载线
  25. createLine(ycdl.features[0].geometry.coordinates, poiImg, 'lineFeature');
  26. //加载信息框
  27. createInfo()
  28. * 初始化地图
  29. const initMap = () => {
  30. map.current = new Map({
  31. target: 'map',
  32. layers: [
  33. new TileLayer({
  34. source: new OSM(),
  35. }),
  36. ],
  37. view: new View({
  38. center: [111.286962, 30.69217],
  39. projection: 'EPSG:4326',
  40. zoom: 14,
  41. }),
  42. //创建标注
  43. const createFeature = (featureData: Array) => {
  44. , featureImg: string, layerId: string
  45. // 创建标注
  46. if (featureData.length > 0) {
  47. let iconFeatures: any;
  48. iconFeatures = new Array();
  49. featureData.forEach((v, index) => {
  50. iconFeatures.push(new Feature({
  51. geometry: new Point([...v])
  52. iconFeatures[index].setId(`icon ${index}`)
  53. // 将标注属性添加到矢量数据源中
  54. let iconSource = new VectorSource({
  55. features: iconFeatures
  56. //将标注矢量数据源添加到矢量层
  57. let iconLayer = new VectorLayer({
  58. source: iconSource,
  59. zIndex: 3,
  60. style: () => {
  61. return new Style({
  62. image: new Icon({
  63. anchor: [0.5, 1],
  64. scale: 0.12,
  65. src: featureImg
  66. // 将矢量层添加到地图
  67. map.current.addLayer(iconLayer);
  68. * 创建线
  69. const createLine = (lineData: Array) => {
  70. , lineColor: string, layerId: string
  71. let lineFeature: any;
  72. if (lineData.length > 0) {
  73. lineFeature = new Feature({
  74. geometry: new LineString([...lineData])
  75. // 将划线属性添加到矢量数据源中
  76. let lineSource = new VectorSource({})
  77. lineSource.addFeature(lineFeature);
  78. let lineLayer = new VectorLayer({
  79. source: lineSource,
  80. zIndex: 2,
  81. style: () => {
  82. return new Style({
  83. stroke: new Stroke({
  84. width: 4,
  85. color: 'rgb(0,255,0)'
  86. // 将矢量层添加到地图
  87. map.current.addLayer(lineLayer);
  88. * 创建信息框
  89. const createInfo = () => {
  90. //创建overlay容器
  91. const overlayDom = document.createElement('div');
  92. overlayDom.className = 'overlayDom';
  93. mapDom.current?.appendChild(overlayDom);
  94. //创建内部信息容器
  95. const overlayInfo = document.createElement('div');
  96. overlayInfo.className = 'overlayInfo';
  97. overlayDom.appendChild(overlayInfo)
  98. //创建overlay
  99. const overlay = new Overlay({
  100. element: overlayDom, // overlay包含的DOM
  101. autoPan: true, // 当overlay超出地图边界时,地图自动移动
  102. positioning: 'bottom-center',
  103. offset: [0, -50], // 偏移量,单位像素
  104. stopEvent: true, // 事件传播
  105. autoPanAnimation: {
  106. // 设置autoPan的动画
  107. duration: 500
  108. },
  109. autoPanMargin: 150
  110. //将overlay添加到地图
  111. map.current.addOverlay(overlay)
  112. //设置地图左键点击事件
  113. map.current.on('click', (event: any) => {
  114. if (overlayInfo.innerHTML !== ' ') {
  115. // 清空
  116. reactDom.unmountComponentAtNode(overlayInfo);
  117. const feature = map.current.forEachFeatureAtPixel(event.pixel, function (feature: any, vectorLayer: any) {
  118. return feature;
  119. if (feature && feature.id_ != undefined) {
  120. const infoData = feature.getGeometry().flatCoordinates;
  121. const infoDom = (

  122. 经度: {infoData[0]}, 维度:{infoData[1]}
  123. div>
  124. //将overlayInfo插入infoDom
  125. reactDom.render(infoDom, overlayInfo);
  126. // 设置overlay位置
  127. overlay.setPosition(infoData)
  128. return (
  129. span>
  130. export default Index