MapGL.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import React from "react";
  2. import ReactMapGL from "react-map-gl";
  3. import {
  4. Marker,
  5. NavigationControl,
  6. FullscreenControl,
  7. ScaleControl,
  8. GeolocateControl
  9. } from "react-map-gl";
  10. import "./css/maps.css";
  11. import mapboxToken from './config/mapboxToken.js';
  12. import {calcDistance} from './helpers/distance';
  13. const ICON = `M20.2,15.7L20.2,15.7c1.1-1.6,1.8-3.6,1.8-5.7c0-5.6-4.5-10-10-10S2,4.5,2,10c0,2,0.6,3.9,1.6,5.4c0,0.1,0.1,0.2,0.2,0.3
  14. c0,0,0.1,0.1,0.1,0.2c0.2,0.3,0.4,0.6,0.7,0.9c2.6,3.1,7.4,7.6,7.4,7.6s4.8-4.5,7.4-7.5c0.2-0.3,0.5-0.6,0.7-0.9
  15. C20.1,15.8,20.2,15.8,20.2,15.7z`;
  16. const LONGITUDE = 14.320570
  17. const LATITUDE = 48.336950
  18. export default class MapGL extends React.Component{
  19. state = {
  20. viewport: {
  21. width: 600,
  22. height: 400,
  23. latitude: LATITUDE,
  24. longitude: LONGITUDE,
  25. zoom: 15,
  26. bearing: 0,
  27. pitch: 0
  28. },
  29. path: []
  30. };
  31. addMarker = event => {
  32. const lng = event.lngLat[0]
  33. const lat = event.lngLat[1]
  34. console.log("Clicked at", lat, "/", lng)
  35. let pathCopy = this.state.path.slice();
  36. pathCopy.push([lat, lng]);
  37. this.setState({path: pathCopy})
  38. this.getDistance()
  39. }
  40. updateMarker = (idx, event) => {
  41. const lng = event.lngLat[0]
  42. const lat = event.lngLat[1]
  43. console.log(lat, lng, idx)
  44. let pathCopy = this.state.path.slice();
  45. pathCopy[idx] = [lat, lng]
  46. this.setState({path: pathCopy})
  47. this.getDistance()
  48. }
  49. getDistance = () => {
  50. let dst = calcDistance(this.state.path)
  51. this.setState({distance: dst})
  52. }
  53. clearPath = () => {
  54. this.setState({path: [], distance: 0})
  55. }
  56. render() {
  57. return (
  58. <div>
  59. <ReactMapGL
  60. {...this.state.viewport}
  61. onViewportChange={(viewport) => this.setState({viewport})}
  62. mapboxApiAccessToken={mapboxToken}
  63. mapStyle="mapbox://styles/mapbox/streets-v11"
  64. onClick={this.addMarker}
  65. >
  66. {this.state.path.map((pos, idx) =>
  67. <Marker
  68. longitude={pos[1]}
  69. latitude={pos[0]}
  70. captureClick={false}
  71. draggable={true}
  72. offsetTop={-20}
  73. offsetLeft={-8}
  74. key={idx}
  75. onDragEnd={(e) => this.updateMarker(idx, e)}
  76. >
  77. <svg height={20} viewBox="0 0 24 24" style={{fill: "#343a40", stroke: "none"}}>
  78. <path d={ICON} />
  79. </svg>
  80. </Marker>
  81. )}
  82. <Marker
  83. longitude={LONGITUDE}
  84. latitude={LATITUDE}
  85. captureClick={false}
  86. draggable={false}
  87. offsetTop={-20}
  88. offsetLeft={-8}
  89. >
  90. <svg height={20} viewBox="0 0 24 24" style={{fill: "#343a40", stroke: "none"}}>
  91. <path d={ICON} />
  92. </svg>
  93. </Marker>
  94. <div className="controllers">
  95. <GeolocateControl />
  96. <FullscreenControl />
  97. <NavigationControl />
  98. <ScaleControl />
  99. <small> {'\u00A9'} Mapbox {'\u00A9'} OpenStreetMap </small>
  100. </div>
  101. </ReactMapGL>
  102. <div>
  103. <button onClick={this.clearPath}>Clear path</button>
  104. <button onClick={this.getDistance}>Calculate Distance</button>
  105. <p>
  106. Distanz: {Math.round(this.state.distance*100)/100} km
  107. </p>
  108. </div>
  109. </div>
  110. );
  111. }
  112. }