Map.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. <?php
  2. namespace Dcat\Admin\Form\Field;
  3. use Dcat\Admin\Admin;
  4. use Dcat\Admin\Form\Field;
  5. class Map extends Field
  6. {
  7. /**
  8. * Column name.
  9. *
  10. * @var array
  11. */
  12. protected $column = [];
  13. /**
  14. * Get assets required by this field.
  15. *
  16. * @return void
  17. */
  18. public static function collectAssets()
  19. {
  20. switch (config('admin.map_provider')) {
  21. case 'tencent':
  22. $js = '//map.qq.com/api/js?v=2.exp&key='.env('TENCENT_MAP_API_KEY');
  23. break;
  24. case 'google':
  25. $js = '//maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&key='.env('GOOGLE_API_KEY');
  26. break;
  27. case 'yandex':
  28. $js = '//api-maps.yandex.ru/2.1/?lang=ru_RU';
  29. break;
  30. default:
  31. $js = '//maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&key='.env('GOOGLE_API_KEY');
  32. }
  33. Admin::js($js);
  34. }
  35. public function __construct($column, $arguments)
  36. {
  37. $this->column['lat'] = (string) $column;
  38. $this->column['lng'] = (string) $arguments[0];
  39. array_shift($arguments);
  40. $this->label = $this->formatLabel($arguments);
  41. $this->id = $this->formatId($this->column);
  42. /*
  43. * Google map is blocked in mainland China
  44. * people in China can use Tencent map instead(;
  45. */
  46. switch (config('admin.map_provider')) {
  47. case 'tencent':
  48. $this->useTencentMap();
  49. break;
  50. case 'google':
  51. $this->useGoogleMap();
  52. break;
  53. case 'yandex':
  54. $this->useYandexMap();
  55. break;
  56. default:
  57. $this->useGoogleMap();
  58. }
  59. }
  60. public function useGoogleMap()
  61. {
  62. $this->script = <<<JS
  63. (function() {
  64. function initGoogleMap(name) {
  65. var lat = $('#{$this->id['lat']}');
  66. var lng = $('#{$this->id['lng']}');
  67. var LatLng = new google.maps.LatLng(lat.val(), lng.val());
  68. var options = {
  69. zoom: 13,
  70. center: LatLng,
  71. panControl: false,
  72. zoomControl: true,
  73. scaleControl: true,
  74. mapTypeId: google.maps.MapTypeId.ROADMAP
  75. }
  76. var container = document.getElementById("map_"+name);
  77. var map = new google.maps.Map(container, options);
  78. var marker = new google.maps.Marker({
  79. position: LatLng,
  80. map: map,
  81. title: 'Drag Me!',
  82. draggable: true
  83. });
  84. google.maps.event.addListener(marker, 'dragend', function (event) {
  85. lat.val(event.latLng.lat());
  86. lng.val(event.latLng.lng());
  87. });
  88. }
  89. initGoogleMap('{$this->id['lat']}{$this->id['lng']}');
  90. })();
  91. JS;
  92. }
  93. public function useTencentMap()
  94. {
  95. $this->script = <<<JS
  96. (function() {
  97. function initTencentMap(name) {
  98. var lat = $('#{$this->id['lat']}');
  99. var lng = $('#{$this->id['lng']}');
  100. var center = new qq.maps.LatLng(lat.val(), lng.val());
  101. var container = document.getElementById("map_"+name);
  102. var map = new qq.maps.Map(container, {
  103. center: center,
  104. zoom: 13
  105. });
  106. var marker = new qq.maps.Marker({
  107. position: center,
  108. draggable: true,
  109. map: map
  110. });
  111. if( ! lat.val() || ! lng.val()) {
  112. var citylocation = new qq.maps.CityService({
  113. complete : function(result){
  114. map.setCenter(result.detail.latLng);
  115. marker.setPosition(result.detail.latLng);
  116. }
  117. });
  118. citylocation.searchLocalCity();
  119. }
  120. qq.maps.event.addListener(map, 'click', function(event) {
  121. marker.setPosition(event.latLng);
  122. });
  123. qq.maps.event.addListener(marker, 'position_changed', function(event) {
  124. var position = marker.getPosition();
  125. lat.val(position.getLat());
  126. lng.val(position.getLng());
  127. });
  128. }
  129. initTencentMap('{$this->id['lat']}{$this->id['lng']}');
  130. })();
  131. JS;
  132. }
  133. public function useYandexMap()
  134. {
  135. $this->script = <<<JS
  136. (function() {
  137. function initYandexMap(name) {
  138. ymaps.ready(function(){
  139. var lat = $('#{$this->id['lat']}');
  140. var lng = $('#{$this->id['lng']}');
  141. var myMap = new ymaps.Map("map_"+name, {
  142. center: [lat.val(), lng.val()],
  143. zoom: 18
  144. });
  145. var myPlacemark = new ymaps.Placemark([lat.val(), lng.val()], {
  146. }, {
  147. preset: 'islands#redDotIcon',
  148. draggable: true
  149. });
  150. myPlacemark.events.add(['dragend'], function (e) {
  151. lat.val(myPlacemark.geometry.getCoordinates()[0]);
  152. lng.val(myPlacemark.geometry.getCoordinates()[1]);
  153. });
  154. myMap.geoObjects.add(myPlacemark);
  155. });
  156. }
  157. initYandexMap('{$this->id['lat']}{$this->id['lng']}');
  158. })();
  159. JS;
  160. }
  161. }