import * as React from 'react'; import * as Leaflet from 'leaflet'; import { Component, PropTypes } from 'react'; import { Circle, CircleMarker, FeatureGroup, LayerGroup, LayersControl, Map, MapInstance, Marker, MarkerInstance, Pane, Polygon, Polyline, Popup, Rectangle, TileLayer, Tooltip, WMSTileLayer, ZoomControl } from 'react-leaflet'; const { BaseLayer, Overlay } = LayersControl; /// animate.js export class AnimateExample extends Component { state = { animate: false, hasLocation: false, latlng: { lat: 51.505, lng: -0.09, }, }; handleClick = (e: Leaflet.MouseEvent) => { this.setState({ latlng: e.latlng, }); } toggleAnimate = () => { this.setState({ animate: !this.state.animate, }); } render() { const marker = this.state.hasLocation ? ( You are here ) : null; return (
{marker}
); } } // bounds.js const outer: Array<[number, number]> = [ [50.505, -29.09], [52.505, 29.09], ]; const inner: Array<[number, number]> = [ [49.505, -2.09], [53.505, 2.09], ]; export class BoundsExample extends Component { state = { bounds: outer, }; onClickInner = () => { this.setState({ bounds: inner }); } onClickOuter = () => { this.setState({ bounds: outer }); } render() { return ( ); } } // custom-component.js const SomeFn = (asd: string) => ( asd + asd ); const MyPopupMarker = ({ children, position }: any) => ( {children} ); /*(MyPopupMarker as any).propTypes = { children: MapPropTypes.children, position: MapPropTypes.latlng, }*/ const MyMarkersList = ({ markers }: any) => { const items = markers.map(({ key, ...props }: any) => ( )); return
{items}
; }; (MyMarkersList as any).propTypes = { markers: PropTypes.array.isRequired, }; export class CustomComponent extends Component { state = { lat: 51.505, lng: -0.09, zoom: 13, }; render() { const center: [number, number] = [this.state.lat, this.state.lng]; const markers = [ { key: 'marker1', position: [51.5, -0.1], children: 'My first popup' }, { key: 'marker2', position: [51.51, -0.1], children: 'My second popup' }, { key: 'marker3', position: [51.49, -0.05], children: 'My third popup' }, ]; return ( ); } } export class MarkerWithDivIconExample extends Component { render() { return ( ) } } // draggable-marker.js export class DraggableExample extends Component { state = { center: { lat: 51.505, lng: -0.09, }, marker: { lat: 51.505, lng: -0.09, }, zoom: 13, draggable: true, }; toggleDraggable = () => { this.setState({ draggable: !this.state.draggable }); } updatePosition = () => { const { lat, lng } = (this.refs['marker'] as MarkerInstance).leafletElement.getLatLng(); this.setState({ marker: { lat, lng }, }); } render() { const position: [number, number] = [this.state.center.lat, this.state.center.lng]; const markerPosition: [number, number] = [this.state.marker.lat, this.state.marker.lng]; return ( {this.state.draggable ? 'DRAG MARKER' : 'MARKER FIXED'} ); } } // events.js export class EventsExample extends Component { state = { hasLocation: false, latlng: { lat: 51.505, lng: -0.09, }, }; handleClick = () => { (this.refs['map'] as MapInstance).leafletElement.locate(); } handleLocationFound = (e: Leaflet.LocationEvent) => { this.setState({ hasLocation: true, latlng: e.latlng, }); } render() { const marker = this.state.hasLocation ? ( You are here ) : null; return ( {marker} ); } } // layers-control.js export class LayersControlExample extends Component { render() { const center: [number, number] = [51.505, -0.09]; const rectangle: Array<[number, number]> = [ [51.49, -0.08], [51.5, -0.06], ]; return ( A pretty CSS3 popup.
Easily customizable.
Popup in FeatureGroup
); } } // other-layers.js export class OtherLayersExample extends Component { render() { const center: [number, number] = [51.505, -0.09]; const rectangle: Array<[number, number]> = [ [51.49, -0.08], [51.5, -0.06], ]; return ( Popup in FeatureGroup ); } } // pane.js export class PaneExample extends Component { state = { render: true, }; componentDidMount() { setInterval(() => { this.setState({ render: !this.state.render, }); }, 5000); } render() { return ( {this.state.render ? ( ) : null} ); } } // simple.js export class SimpleExample extends Component { state = { lat: 51.505, lng: -0.09, zoom: 13, }; render() { const position: [number, number] = [this.state.lat, this.state.lng]; return ( A pretty CSS3 popup.
Easily customizable.
); } } // tooltip.js export class TooltipExample extends Component { state = { clicked: 0, }; onClickCircle = () => { this.setState({ clicked: this.state.clicked + 1 }); } render() { const center: [number, number] = [51.505, -0.09]; const multiPolygon: Array> = [ [[51.51, -0.12], [51.51, -0.13], [51.53, -0.13]], [[51.51, -0.05], [51.51, -0.07], [51.53, -0.07]], ]; const rectangle: Array<[number, number]> = [ [51.49, -0.08], [51.5, -0.06], ]; const clickedText = this.state.clicked === 0 ? 'Click this Circle to change the Tooltip text' : `Circle click: ${this.state.clicked}`; return ( {clickedText} Tooltip for CircleMarker sticky Tooltip for Polygon permanent Tooltip for Rectangle ); } } // vector-layers.js export class VectorLayersExample extends Component { render() { const center: [number, number] = [51.505, -0.09]; const polyline: Array<[number, number]> = [ [51.505, -0.09], [51.51, -0.1], [51.51, -0.12], ]; const multiPolyline: Array> = [ [[51.5, -0.1], [51.5, -0.12], [51.52, -0.12]], [[51.5, -0.05], [51.5, -0.06], [51.52, -0.06]], ]; const polygon: Array<[number, number]> = [ [51.515, -0.09], [51.52, -0.1], [51.52, -0.12], ]; const multiPolygon: Array> = [ [[51.51, -0.12], [51.51, -0.13], [51.53, -0.13]], [[51.51, -0.05], [51.51, -0.07], [51.53, -0.07]], ]; const rectangle: Array<[number, number]> = [ [51.49, -0.08], [51.5, -0.06], ]; return ( Popup in CircleMarker ); } } // wms-tile-layer.js export class WMSTileLayerExample extends Component { state = { lat: 51.505, lng: -0.09, zoom: 5, bluemarble: false, }; onClick = () => { this.setState({ bluemarble: !this.state.bluemarble, }); } render() { return ( ); } } // zoom-control.js const ZoomControlExample = () => ( );