amap.html 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
  5. <title>地址选择器</title>
  6. <link rel="stylesheet" href="__CDN__/assets/css/frontend.min.css"/>
  7. <link rel="stylesheet" href="__CDN__/assets/libs/font-awesome/css/font-awesome.min.css"/>
  8. <style type="text/css">
  9. body {
  10. margin: 0;
  11. padding: 0;
  12. }
  13. #container {
  14. position: absolute;
  15. left: 0;
  16. top: 0;
  17. right: 0;
  18. bottom: 0;
  19. }
  20. .confirm {
  21. position: absolute;
  22. bottom: 30px;
  23. right: 4%;
  24. z-index: 99;
  25. height: 50px;
  26. width: 50px;
  27. line-height: 50px;
  28. font-size: 15px;
  29. text-align: center;
  30. background-color: white;
  31. background: #1ABC9C;
  32. color: white;
  33. border: none;
  34. cursor: pointer;
  35. border-radius: 50%;
  36. }
  37. .search {
  38. position: absolute;
  39. width: 400px;
  40. top: 0;
  41. left: 50%;
  42. padding: 5px;
  43. margin-left: -200px;
  44. }
  45. .amap-marker-label {
  46. border: 0;
  47. background-color: transparent;
  48. }
  49. .info {
  50. padding: .75rem 1.25rem;
  51. margin-bottom: 1rem;
  52. border-radius: .25rem;
  53. position: fixed;
  54. top: 2rem;
  55. background-color: white;
  56. width: auto;
  57. min-width: 22rem;
  58. border-width: 0;
  59. left: 1.8rem;
  60. box-shadow: 0 2px 6px 0 rgba(114, 124, 245, .5);
  61. }
  62. </style>
  63. </head>
  64. <body>
  65. <div class="search">
  66. <div class="input-group">
  67. <input type="text" id="place" name="q" class="form-control" placeholder="输入地点"/>
  68. <span class="input-group-btn">
  69. <button type="submit" name="search" id="search-btn" class="btn btn-success">
  70. <i class="fa fa-search"></i>
  71. </button>
  72. </span>
  73. </div>
  74. </div>
  75. <div class="confirm">确定</div>
  76. <div id="container"></div>
  77. <script type="text/javascript">
  78. window._AMapSecurityConfig = {
  79. securityJsCode: "{$config.amapsecurityjscode|default=''}",
  80. }
  81. </script>
  82. <script type="text/javascript" src="//webapi.amap.com/maps?v=1.4.11&key={$config.amapkey|default=''}&plugin=AMap.ToolBar,AMap.Autocomplete,AMap.PlaceSearch,AMap.Geocoder"></script>
  83. <!-- UI组件库 1.0 -->
  84. <script src="//webapi.amap.com/ui/1.0/main.js?v=1.0.11"></script>
  85. <script src="__CDN__/assets/libs/jquery/dist/jquery.min.js"></script>
  86. <script src="__CDN__/assets/addons/address/js/gcoord.min.js"></script>
  87. <script type="text/javascript">
  88. $(function () {
  89. var as, map, geocoder, address, fromtype, totype;
  90. address = "{$address|htmlentities}";
  91. var lng = Number("{$lng}");
  92. var lat = Number("{$lat}");
  93. fromtype = "GCJ02";
  94. totype = "{$config.coordtype|default='DEFAULT'}"
  95. totype = totype === 'DEFAULT' ? "GCJ02" : totype;
  96. if (lng && lat && fromtype !== totype) {
  97. var result = gcoord.transform([lng, lat], gcoord[totype], gcoord[fromtype]);
  98. lng = result[0] || lng;
  99. lat = result[1] || lat;
  100. }
  101. var init = function () {
  102. AMapUI.loadUI(['misc/PositionPicker', 'misc/PoiPicker'], function (PositionPicker, PoiPicker) {
  103. //加载PositionPicker,loadUI的路径参数为模块名中 'ui/' 之后的部分
  104. map = new AMap.Map('container', {
  105. zoom: parseInt('{$zoom}'),
  106. center: [lng, lat]
  107. });
  108. geocoder = new AMap.Geocoder({
  109. radius: 1000 //范围,默认:500
  110. });
  111. var positionPicker = new PositionPicker({
  112. mode: 'dragMarker',//设定为拖拽地图模式,可选'dragMap'、'dragMarker',默认为'dragMap'
  113. map: map//依赖地图对象
  114. });
  115. //输入提示
  116. var autoOptions = {
  117. input: "place"
  118. };
  119. var relocation = function (lnglat, addr) {
  120. lng = lnglat.lng;
  121. lat = lnglat.lat;
  122. map.panTo([lng, lat]);
  123. positionPicker.start(lnglat);
  124. if (addr) {
  125. // var label = '<div class="info">地址:' + addr + '<br>经度:' + lng + '<br>纬度:' + lat + '</div>';
  126. var label = '<div class="info">地址:' + addr + '</div>';
  127. positionPicker.marker.setLabel({
  128. content: label //显示内容
  129. });
  130. } else {
  131. geocoder.getAddress(lng + ',' + lat, function (status, result) {
  132. if (status === 'complete' && result.regeocode) {
  133. var address = result.regeocode.formattedAddress;
  134. // var label = '<div class="info">地址:' + address + '<br>经度:' + lng + '<br>纬度:' + lat + '</div>';
  135. var label = '<div class="info">地址:' + address + '</div>';
  136. positionPicker.marker.setLabel({
  137. content: label //显示内容
  138. });
  139. } else {
  140. console.log(JSON.stringify(result));
  141. }
  142. });
  143. }
  144. };
  145. var auto = new AMap.Autocomplete(autoOptions);
  146. //构造地点查询类
  147. var placeSearch = new AMap.PlaceSearch({
  148. map: map
  149. });
  150. //注册监听,当选中某条记录时会触发
  151. AMap.event.addListener(auto, "select", function (e) {
  152. placeSearch.setCity(e.poi.adcode);
  153. placeSearch.search(e.poi.name, function (status, result) {
  154. $(map.getAllOverlays("marker")).each(function (i, j) {
  155. j.on("click", function () {
  156. relocation(j.De.position);
  157. });
  158. });
  159. }); //关键字查询查询
  160. });
  161. AMap.event.addListener(map, 'click', function (e) {
  162. relocation(e.lnglat);
  163. });
  164. //加载工具条
  165. var tool = new AMap.ToolBar();
  166. map.addControl(tool);
  167. var poiPicker = new PoiPicker({
  168. input: 'place',
  169. placeSearchOptions: {
  170. map: map,
  171. pageSize: 6 //关联搜索分页
  172. }
  173. });
  174. poiPicker.on('poiPicked', function (poiResult) {
  175. poiPicker.hideSearchResults();
  176. $('.poi .nearpoi').text(poiResult.item.name);
  177. $('.address .info').text(poiResult.item.address);
  178. $('#address').val(poiResult.item.address);
  179. $("#place").val(poiResult.item.name);
  180. relocation(poiResult.item.location);
  181. });
  182. positionPicker.on('success', function (positionResult) {
  183. console.log(positionResult);
  184. as = positionResult.position;
  185. address = positionResult.address;
  186. lat = as.lat;
  187. lng = as.lng;
  188. });
  189. positionPicker.on('fail', function (positionResult) {
  190. address = '';
  191. });
  192. positionPicker.start();
  193. if (address) {
  194. // 添加label
  195. var label = '<div class="info">地址:' + address + '</div>';
  196. positionPicker.marker.setLabel({
  197. content: label //显示内容
  198. });
  199. }
  200. //点击搜索按钮
  201. $(document).on('click', '#search-btn', function () {
  202. if ($("#place").val() == '')
  203. return;
  204. placeSearch.search($("#place").val(), function (status, result) {
  205. $(map.getAllOverlays("marker")).each(function (i, j) {
  206. j.on("click", function () {
  207. relocation(j.De.position);
  208. });
  209. });
  210. });
  211. });
  212. });
  213. };
  214. //点击确定后执行回调赋值
  215. var close = function (data) {
  216. var index = parent.Layer.getFrameIndex(window.name);
  217. var callback = parent.$("#layui-layer" + index).data("callback");
  218. //再执行关闭
  219. parent.Layer.close(index);
  220. //再调用回传函数
  221. if (typeof callback === 'function') {
  222. callback.call(undefined, data);
  223. }
  224. };
  225. //点击搜索按钮
  226. $(document).on('click', '.confirm', function () {
  227. var zoom = map.getZoom();
  228. var data = {lat: lat, lng: lng, zoom: zoom, address: address};
  229. if (fromtype !== totype) {
  230. var result = gcoord.transform([data.lng, data.lat], gcoord[fromtype], gcoord[totype]);
  231. data.lng = (result[0] || data.lng).toFixed(5);
  232. data.lat = (result[1] || data.lat).toFixed(5);
  233. console.log(data, result, fromtype, totype);
  234. }
  235. close(data);
  236. });
  237. init();
  238. });
  239. </script>
  240. </body>
  241. </html>