feat(geoportal): selection modes (click/rectangle/freehand) + export DXF/GPKG only
- Selection toolbar: 3 modes — Click (individual), Dreptunghi (area), Desen (freehand) - Each mode has tooltip explaining usage - Export: removed GeoJSON, only DXF + GPKG. GPKG labeled "cu metadata" - DXF export fix: -s_srs + -t_srs (was -a_srs + -t_srs) Note: rectangle and freehand drawing on map not yet implemented (UI ready, map interaction coming next session). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -5,7 +5,7 @@ import dynamic from "next/dynamic";
|
||||
import { LayerPanel, getDefaultVisibility } from "./layer-panel";
|
||||
import { BasemapSwitcher } from "./basemap-switcher";
|
||||
import { SearchBar } from "./search-bar";
|
||||
import { SelectionToolbar } from "./selection-toolbar";
|
||||
import { SelectionToolbar, type SelectionMode } from "./selection-toolbar";
|
||||
import { FeatureInfoPanel } from "./feature-info-panel";
|
||||
import type { MapViewerHandle } from "./map-viewer";
|
||||
import type {
|
||||
@@ -29,7 +29,7 @@ export function GeoportalModule() {
|
||||
const [basemap, setBasemap] = useState<BasemapId>("liberty");
|
||||
const [layerVisibility, setLayerVisibility] = useState<LayerVisibility>(getDefaultVisibility);
|
||||
const [clickedFeature, setClickedFeature] = useState<ClickedFeature | null>(null);
|
||||
const [selectionMode, setSelectionMode] = useState(false);
|
||||
const [selectionMode, setSelectionMode] = useState<SelectionMode>("off");
|
||||
const [selectedFeatures, setSelectedFeatures] = useState<SelectedFeature[]>([]);
|
||||
const [flyTarget, setFlyTarget] = useState<{ center: [number, number]; zoom?: number } | undefined>();
|
||||
|
||||
@@ -48,14 +48,12 @@ export function GeoportalModule() {
|
||||
}
|
||||
}, []);
|
||||
|
||||
const handleToggleSelectionMode = useCallback(() => {
|
||||
setSelectionMode((prev) => {
|
||||
if (prev) {
|
||||
mapHandleRef.current?.clearSelection();
|
||||
setSelectedFeatures([]);
|
||||
}
|
||||
return !prev;
|
||||
});
|
||||
const handleSelectionModeChange = useCallback((mode: SelectionMode) => {
|
||||
if (mode === "off") {
|
||||
mapHandleRef.current?.clearSelection();
|
||||
setSelectedFeatures([]);
|
||||
}
|
||||
setSelectionMode(mode);
|
||||
}, []);
|
||||
|
||||
return (
|
||||
@@ -64,7 +62,7 @@ export function GeoportalModule() {
|
||||
ref={mapHandleRef}
|
||||
className="h-full w-full"
|
||||
basemap={basemap}
|
||||
selectionMode={selectionMode}
|
||||
selectionMode={selectionMode !== "off"}
|
||||
onFeatureClick={handleFeatureClick}
|
||||
onSelectionChange={setSelectedFeatures}
|
||||
layerVisibility={layerVisibility}
|
||||
@@ -81,7 +79,7 @@ export function GeoportalModule() {
|
||||
{/* Top-right: basemap switcher + feature panel (aligned) */}
|
||||
<div className="absolute top-3 right-14 z-10 flex flex-col items-end gap-2">
|
||||
<BasemapSwitcher value={basemap} onChange={setBasemap} />
|
||||
{clickedFeature && !selectionMode && (
|
||||
{clickedFeature && selectionMode === "off" && (
|
||||
<FeatureInfoPanel feature={clickedFeature} onClose={() => setClickedFeature(null)} />
|
||||
)}
|
||||
</div>
|
||||
@@ -91,7 +89,7 @@ export function GeoportalModule() {
|
||||
<SelectionToolbar
|
||||
selectedFeatures={selectedFeatures}
|
||||
selectionMode={selectionMode}
|
||||
onToggleSelectionMode={handleToggleSelectionMode}
|
||||
onSelectionModeChange={handleSelectionModeChange}
|
||||
onClearSelection={() => { mapHandleRef.current?.clearSelection(); setSelectedFeatures([]); }}
|
||||
/>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user