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 ( ) } } //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 = () => ( )