import { useCallback, useEffect, useRef, useState } from 'react' import 'ol/ol.css' import Map from 'ol/Map' import View from 'ol/View' import { Draw, Modify, Select, Snap, Translate } from 'ol/interaction' import { ImageStatic, OSM, Vector as VectorSource, XYZ } from 'ol/source' import { Tile as TileLayer, Vector as VectorLayer } from 'ol/layer' import { click, never, platformModifierKeyOnly, primaryAction, shiftKeyOnly } from 'ol/events/condition' import Feature from 'ol/Feature' import { IRectCoords, SatelliteMapsProvider } from '../../interfaces/map' import { Extent } from 'ol/extent' import { drawingLayerStyle, highlightStyleRed, highlightStyleYellow, overlayStyle, regionsLayerStyle } from './MapStyles' import { googleMapsSatelliteSource, regionsLayerSource, yandexMapsSatelliteSource } from './MapSources' import { mapCenter } from './MapConstants' import ImageLayer from 'ol/layer/Image' import VectorImageLayer from 'ol/layer/VectorImage' import { LineString, Point } from 'ol/geom' import { fromExtent } from 'ol/geom/Polygon' import Collection from 'ol/Collection' import { Coordinate } from 'ol/coordinate' import { addInteractions, calculateCenter, loadFeatures, processFigure, processLine, regionsInit, saveFeatures, updateImageSource } from './mapUtils' import MapBrowserEvent from 'ol/MapBrowserEvent' import { get, transform } from 'ol/proj' import useSWR from 'swr' import { fetcher } from '../../http/axiosInstance' import { BASE_URL } from '../../constants' import { Accordion, ActionIcon, Autocomplete, Box, CloseButton, Flex, Select as MantineSelect, Text as MantineText, MantineStyleProp, rem, ScrollAreaAutosize, Slider, useMantineColorScheme, Portal, Tree, Group, TreeNodeData, Button, useTree, Timeline, Text, Stack, Overlay } from '@mantine/core' import { IconChevronDown, IconPlus, IconSettings, IconTable, IconUpload } from '@tabler/icons-react' import { getGridCellPosition } from './mapUtils' import { IFigure, ILine } from '../../interfaces/gis' import axios from 'axios' import ObjectParameter from './ObjectParameter' import { IObjectData, IObjectList, IObjectParam } from '../../interfaces/objects' import ObjectData from './ObjectData' import MapToolbar from './MapToolbar/MapToolbar' import MapStatusbar from './MapStatusbar/MapStatusbar' import { measureStyleFunction, modifyStyle } from './Measure/MeasureStyles' import { useMapStore } from '../../store/map' import { MapTreeCheckbox } from './MapTree/MapTreeCheckbox' import { v4 as uuidv4 } from 'uuid' const MapComponent = () => { const mapState = useMapStore() const [currentCoordinate, setCurrentCoordinate] = useState(null) const [currentZ, setCurrentZ] = useState(undefined) const [currentX, setCurrentX] = useState(undefined) const [currentY, setCurrentY] = useState(undefined) const [file, setFile] = useState(null) const [polygonExtent, setPolygonExtent] = useState(undefined) const [rectCoords, setRectCoords] = useState(undefined) // Measure const measureSource = useRef(new VectorSource()) const measureModify = useRef(new Modify({ source: measureSource.current, style: modifyStyle })) const measureLayer = useRef(new VectorLayer({ source: measureSource.current, style: function (feature) { return measureStyleFunction(feature); }, properties: { id: uuidv4(), type: 'measure', name: 'Линейка' } })) const measureDraw = useRef(null) ///// const mapElement = useRef(null) const map = useRef(null) const [satMapsProvider, setSatMapsProvider] = useState('custom') const gMapsSatSource = useRef(googleMapsSatelliteSource) const customMapSource = useRef(new XYZ({ url: `${import.meta.env.VITE_API_EMS_URL}/tiles/tile/custom/{z}/{x}/{y}`, attributions: 'Custom map data' })) const yMapsSatSource = useRef(yandexMapsSatelliteSource) const satLayer = useRef(new TileLayer({ source: gMapsSatSource.current, properties: { id: uuidv4(), name: 'Спутник' } })) const draw = useRef(null) const snap = useRef(null) const selectFeature = useRef