features selection & moving

This commit is contained in:
2025-12-22 14:48:53 +09:00
parent 677709c1bf
commit e21f75f5e0
2 changed files with 56 additions and 3 deletions

View File

@ -15,7 +15,7 @@ import { ImageStatic } from "ol/source";
import { ICitySettings, IFigure, ILine } from "../../interfaces/gis"; import { ICitySettings, IFigure, ILine } from "../../interfaces/gis";
import { fromCircle, fromExtent } from "ol/geom/Polygon"; import { fromCircle, fromExtent } from "ol/geom/Polygon";
import { measureStyleFunction, modifyStyle } from "./Measure/MeasureStyles"; import { measureStyleFunction, modifyStyle } from "./Measure/MeasureStyles";
import { getCurrentTool, getDraw, getDrawingLayerSource, getImageLayer, getMap, getMeasureClearPrevious, getMeasureDraw, getMeasureModify, getMeasureSource, getMeasureType, getOverlayLayerSource, getSnap, getTipPoint, getTranslate, PrintOrientation, setDraw, setFile, setMeasureDraw, setPolygonExtent, setRectCoords, setSnap, setTranslate, useMapStore } from "../../store/map"; import { getCurrentTool, getDraw, getDrawingLayerSource, getImageLayer, getMap, getMeasureClearPrevious, getMeasureDraw, getMeasureModify, getMeasureSource, getMeasureType, getOverlayLayerSource, getSelectedFeatures, getSnap, getTipPoint, getTranslate, PrintOrientation, setDraw, setFile, setMeasureDraw, setPolygonExtent, setRectCoords, setSnap, setTranslate, useMapStore } from "../../store/map";
import Collection from "ol/Collection"; import Collection from "ol/Collection";
import { SketchCoordType } from "ol/interaction/Draw"; import { SketchCoordType } from "ol/interaction/Draw";
import VectorImageLayer from "ol/layer/VectorImage"; import VectorImageLayer from "ol/layer/VectorImage";
@ -590,7 +590,9 @@ export const addInteractions = (
} }
if (currentTool == 'Mover') { if (currentTool == 'Mover') {
setTranslate(map_id, new Translate()) setTranslate(map_id, new Translate({
features: new Collection(getSelectedFeatures(map_id))
}))
const translate = getTranslate(map_id) const translate = getTranslate(map_id)
if (translate) { if (translate) {

View File

@ -27,6 +27,7 @@ import { getSelectedRegion, setCurrentObjectId, setSelectedDistrict, setSelected
import View from 'ol/View'; import View from 'ol/View';
import { getPrintOrientation } from './print'; import { getPrintOrientation } from './print';
import { getDistrictsData, getRegionsData } from './regions'; import { getDistrictsData, getRegionsData } from './regions';
import { fromExtent } from 'ol/geom/Polygon';
export type Mode = 'edit' | 'view' | 'print' export type Mode = 'edit' | 'view' | 'print'
@ -96,6 +97,7 @@ interface MapState {
printScaleLine: boolean; printScaleLine: boolean;
selectionDragBox: DragBox; selectionDragBox: DragBox;
capitalsLayer: VectorLayer capitalsLayer: VectorLayer
selectedFeatures: Feature<Geometry>[]
}>; }>;
} }
@ -271,6 +273,40 @@ export const initializeMapState = (
condition: noModifierKeys condition: noModifierKeys
}) })
selectionDragBox.on('boxend', (e) => {
const extent = selectionDragBox.getGeometry().getExtent()
const figuresSource = figuresLayer.getSource()
const linesSource = linesLayer.getSource()
if (figuresSource && linesSource) {
const featuresFigures = figuresSource.getFeaturesInExtent(extent);
const featuresLines = linesSource.getFeaturesInExtent(extent);
const intersectingFigures = featuresFigures.filter(feature => {
const geometry = feature.getGeometry();
if (!geometry) return false;
// Create polygon from extent
// Check for intersection
return geometry.intersectsExtent(extent);
})
const intersectingLines = featuresLines.filter(feature => {
const geometry = feature.getGeometry();
if (!geometry) return false;
// Create polygon from extent
// Check for intersection
return geometry.intersectsExtent(extent);
});
setSelectedFeatures(id, [...intersectingFigures, ...intersectingLines])
}
})
const map = new Map({ const map = new Map({
controls: [], controls: [],
layers: [ layers: [
@ -487,7 +523,8 @@ export const initializeMapState = (
printScale: '250', printScale: '250',
printScaleLine: true, printScaleLine: true,
selectionDragBox: selectionDragBox, selectionDragBox: selectionDragBox,
capitalsLayer: capitalsLayer capitalsLayer: capitalsLayer,
selectedFeatures: []
} }
} }
} }
@ -845,4 +882,18 @@ export const setTypeRoles = (id: string, typeRoles: TypeRole[] | null) => useMap
[id]: { ...state.id[id], typeRoles: typeRoles } [id]: { ...state.id[id], typeRoles: typeRoles }
} }
} }
})
export const getSelectedFeatures = (id: string) => useMapStore.getState().id[id].selectedFeatures
export const setSelectedFeatures = (id: string, selectedFeatures: Feature<Geometry>[]) => useMapStore.setState((state) => {
// set default style for previously selected features
state.id[id].selectedFeatures.map(f => f.setStyle(undefined))
selectedFeatures.map(f => f.setStyle(highlightStyleYellow))
return {
id: {
...state.id,
[id]: { ...state.id[id], selectedFeatures: selectedFeatures }
}
}
}) })