mirror of
https://github.com/visgl/react-map-gl.git
synced 2026-01-25 16:02:50 +00:00
90 lines
2.5 KiB
JavaScript
90 lines
2.5 KiB
JavaScript
import * as React from 'react';
|
|
import {useState, useRef, useCallback} from 'react';
|
|
import {render} from 'react-dom';
|
|
import MapGL from 'react-map-gl';
|
|
import {Editor, DrawPolygonMode, EditingMode} from 'react-map-gl-draw';
|
|
|
|
import ControlPanel from './control-panel';
|
|
import {getFeatureStyle, getEditHandleStyle} from './style';
|
|
|
|
const TOKEN = ''; // Set your mapbox token here
|
|
|
|
export default function App() {
|
|
const [viewport, setViewport] = useState({
|
|
longitude: -91.874,
|
|
latitude: 42.76,
|
|
zoom: 12
|
|
});
|
|
const [mode, setMode] = useState(null);
|
|
const [selectedFeatureIndex, setSelectedFeatureIndex] = useState(null);
|
|
const editorRef = useRef(null);
|
|
|
|
const onSelect = useCallback(options => {
|
|
setSelectedFeatureIndex(options && options.selectedFeatureIndex);
|
|
}, []);
|
|
|
|
const onDelete = useCallback(() => {
|
|
if (selectedFeatureIndex !== null && selectedFeatureIndex >= 0) {
|
|
editorRef.current.deleteFeatures(selectedFeatureIndex);
|
|
}
|
|
}, [selectedFeatureIndex]);
|
|
|
|
const onUpdate = useCallback(({editType}) => {
|
|
if (editType === 'addFeature') {
|
|
setMode(new EditingMode());
|
|
}
|
|
}, []);
|
|
|
|
const drawTools = (
|
|
<div className="mapboxgl-ctrl-top-left">
|
|
<div className="mapboxgl-ctrl-group mapboxgl-ctrl">
|
|
<button
|
|
className="mapbox-gl-draw_ctrl-draw-btn mapbox-gl-draw_polygon"
|
|
title="Polygon tool (p)"
|
|
onClick={() => setMode(new DrawPolygonMode())}
|
|
/>
|
|
<button
|
|
className="mapbox-gl-draw_ctrl-draw-btn mapbox-gl-draw_trash"
|
|
title="Delete"
|
|
onClick={onDelete}
|
|
/>
|
|
</div>
|
|
</div>
|
|
);
|
|
|
|
const features = editorRef.current && editorRef.current.getFeatures();
|
|
const selectedFeature =
|
|
features && (features[selectedFeatureIndex] || features[features.length - 1]);
|
|
|
|
return (
|
|
<>
|
|
<MapGL
|
|
{...viewport}
|
|
width="100%"
|
|
height="100%"
|
|
mapStyle="mapbox://styles/mapbox/satellite-v9"
|
|
mapboxApiAccessToken={TOKEN}
|
|
onViewportChange={setViewport}
|
|
>
|
|
<Editor
|
|
ref={editorRef}
|
|
style={{width: '100%', height: '100%'}}
|
|
clickRadius={12}
|
|
mode={mode}
|
|
onSelect={onSelect}
|
|
onUpdate={onUpdate}
|
|
editHandleShape={'circle'}
|
|
featureStyle={getFeatureStyle}
|
|
editHandleStyle={getEditHandleStyle}
|
|
/>
|
|
{drawTools}
|
|
</MapGL>
|
|
<ControlPanel polygon={selectedFeature} />
|
|
</>
|
|
);
|
|
}
|
|
|
|
export function renderToDom(container) {
|
|
render(<App />, container);
|
|
}
|