ui_areapicker.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. function latlngToArray(e)
  2. {
  3. if(e && e.lng && e.lat)
  4. return [e.lng, e.lat];
  5. return [0,0];
  6. }
  7. function latlngArrayToArray(e)
  8. {
  9. var out=[];
  10. for(var i=0; i<e.length; i++)
  11. out.push(latlngToArray(e[i]));
  12. return out;
  13. }
  14. function arrayToLatlng(e)
  15. {
  16. return [e[1], e[0]];
  17. }
  18. function arrayToLatlngArray(e)
  19. {
  20. var out=[];
  21. for(var i=0; i<e.length; i++)
  22. out.push(arrayToLatlng(e[i]));
  23. return out;
  24. }
  25. class UIAreaPicker extends UIContainer {
  26. initHtml()
  27. {
  28. var t = this;
  29. var btn_row = HTMLBuilder.row();
  30. this.root.append(btn_row);
  31. var btn_rm_poly = HTMLBuilder.button('Effacer la zone',
  32. {class: "red "+_col_class(3,2)},
  33. function(){t.removePolygon()});
  34. btn_row.append(btn_rm_poly);
  35. var btn_rm_point = HTMLBuilder.button('Effacer le point',
  36. {class: "red "+_col_class(3,2)}
  37. , function(){t.removeMarker()});
  38. btn_row.append(btn_rm_point);
  39. this.root.append(HTMLBuilder.areaPicker(this.rootId));
  40. }
  41. initEnd()
  42. {
  43. var id= this.rootId+"_map";
  44. this.mapData={
  45. polygon: null,
  46. marker: null,
  47. point: null,
  48. lines: [],
  49. map: null
  50. }
  51. this.initHtml();
  52. this.mapData.map=L.map(id).setView([48.505, -3.09], 13);
  53. L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', {
  54. maxZoom: 18,
  55. attribution: 'Map data &copy; <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, ' +
  56. '<a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, ' +
  57. 'Imagery © <a href="https://www.mapbox.com/">Mapbox</a>',
  58. id: 'mapbox.streets'
  59. }).addTo(this.mapData.map);
  60. var t = this;
  61. this.mapData.map.on('click', function(e){t.onClick(e)})
  62. this.mapData.map.on('contextmenu', function(e){t.onRightClick(e)})
  63. }
  64. onClick(e)
  65. {
  66. this.mapData.lines.push(e.latlng);
  67. this.update();
  68. }
  69. onRightClick(e)
  70. {
  71. this.mapData.point=e.latlng;
  72. this.update();
  73. }
  74. update()
  75. {
  76. if(this.mapData.marker)
  77. this.mapData.marker.remove();
  78. if(this.mapData.polygon)
  79. this.mapData.polygon.remove();
  80. if(this.mapData.lines.length>1)
  81. {
  82. this.mapData.polygon = new L.polygon(this.mapData.lines, {
  83. color: 'red',
  84. weight: 3,
  85. opacity: 0.5,
  86. smoothFactor: 1
  87. });
  88. this.mapData.polygon.addTo(this.mapData.map);
  89. }
  90. if(this.mapData.point!=null)
  91. {
  92. this.mapData.marker = new L.circleMarker(this.mapData.point);
  93. this.mapData.marker.addTo(this.mapData.map);
  94. }
  95. }
  96. removePolygon()
  97. {
  98. if(this.mapData.polygon)
  99. this.mapData.polygon.remove();
  100. this.mapData.lines=[];
  101. }
  102. removeMarker()
  103. {
  104. if(this.mapData.marker)
  105. this.mapData.marker.remove();
  106. this.mapData.point=null;
  107. }
  108. getJson()
  109. {
  110. return {
  111. coordinates: [latlngArrayToArray(this.mapData.lines)],
  112. point: {
  113. coordinates: latlngToArray(this.mapData.point)
  114. }
  115. }
  116. }
  117. setJson(obj)
  118. {
  119. this.mapData.lines=arrayToLatlngArray(obj.coordinates);
  120. this.mapData.point=arrayToLatlng(obj.point.coordinates);
  121. this.update();
  122. if(this.mapData.point)
  123. this.mapData.map.setView(this.mapData.point);
  124. else if(this.mapData.lines.length>0)
  125. this.mapData.map.setView(this.mapData.lines[0]);
  126. }
  127. }
  128. registerUiClass("areapicker", UIAreaPicker);