Mapbox.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import React from "react";
  2. import ReactMapboxGl, {
  3. Layer,
  4. Feature,
  5. ZoomControl,
  6. ScaleControl,
  7. RotationControl,
  8. } from "react-mapbox-gl";
  9. import mapboxToken from "./../config/mapboxToken.js";
  10. import {calcDistance} from "./../helpers/distance";
  11. import {longitude, latitude, mapWidth, mapHeight} from "./../config/variables";
  12. import {Button} from "reactstrap";
  13. import {getRoute} from "./../helpers/mapboxHelper";
  14. import PathButtons from "./../PathButtons";
  15. const Map = ReactMapboxGl({ accessToken: mapboxToken });
  16. export default class Mapbox extends React.Component{
  17. constructor(props){
  18. super(props);
  19. this.state = {
  20. latitude: latitude,
  21. longitude: longitude,
  22. zoom: [15],
  23. path: [[longitude, latitude], [longitude+0.003, latitude]],
  24. distance: 0,
  25. center: [longitude, latitude]
  26. }
  27. this.getRoute = getRoute.bind(this)
  28. }
  29. updateState = (key, value) => {
  30. this.setState({[key]: value})
  31. this.getDistance()
  32. }
  33. addMarker = (event, click) => {
  34. const lng = click.lngLat.lng
  35. const lat = click.lngLat.lat
  36. this.getRoute(lng, lat);
  37. // let pathCopy = this.state.path.slice();
  38. // pathCopy.push([lng, lat]);
  39. // this.setState({path: pathCopy})
  40. this.getDistance()
  41. }
  42. updateMarker = (idx, event) => {
  43. const lng = event.lngLat.lng
  44. const lat = event.lngLat.lat
  45. let pathCopy = this.state.path.slice();
  46. pathCopy[idx] = [lng, lat]
  47. this.setState({path: pathCopy})
  48. this.getDistance()
  49. }
  50. getDistance = () => {
  51. let dst = calcDistance(this.state.path)
  52. this.setState({distance: dst})
  53. }
  54. clearPath = () => {
  55. this.setState({path: [], distance: 0})
  56. }
  57. render() {
  58. return (
  59. <div>
  60. <div className="map">
  61. <Map
  62. style="mapbox://styles/mapbox/bright-v9"
  63. containerStyle={{
  64. height: mapHeight,
  65. width: mapWidth
  66. }}
  67. center={this.state.center}
  68. zoom={this.state.zoom}
  69. onClick={(e, c) => this.addMarker(e, c)}
  70. >
  71. <Layer type="symbol" id="marker" layout={{"icon-image": "marker-15" }}>
  72. {this.state.path.map((pos, idx) =>
  73. <Feature
  74. coordinates={pos}
  75. key={idx} draggable={true}
  76. onDragEnd={(e) => this.updateMarker(idx, e)}
  77. />
  78. )}
  79. </Layer>
  80. <ZoomControl position={"top-right"}/>
  81. <ScaleControl position={"bottom-right"}/>
  82. <RotationControl position={"top-right"}/>
  83. </Map>
  84. </div>
  85. <div className="mapInfo">
  86. <Button onClick={this.clearPath}>Clear path</Button>
  87. <Button onClick={this.getDistance}>Calculate Distance</Button>
  88. <p>
  89. Distanz: {Math.round(this.state.distance*100)/100} km
  90. </p>
  91. <PathButtons updateState={this.updateState} path={this.state.path} switchLatLng={true}/>
  92. </div>
  93. </div>
  94. );
  95. }
  96. }