02_editFeatures.html 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. <!--********************************************************************
  2. * Copyright© 2000 - 2021 SuperMap Software Co.Ltd. All rights reserved.
  3. *********************************************************************-->
  4. <!DOCTYPE html>
  5. <html lang="en">
  6. <head>
  7. <meta charset="UTF-8">
  8. <title data-i18n="resources.title_editFeature"></title>
  9. <style>
  10. .editPane {
  11. position: absolute;
  12. right: 10px;
  13. top: 10px;
  14. text-align: center;
  15. background: #FFF;
  16. z-index: 1000;
  17. }
  18. </style>
  19. </head>
  20. <body style=" margin: 0;overflow: hidden;background: #fff;width: 100%;height:100%;position: absolute;top: 0;">
  21. <div id="map" style="margin:0 auto;width: 100%;height: 100%"></div>
  22. <div>
  23. <div class="panel panel-primary editPane" id="editPane">
  24. <div class='panel-heading'>
  25. <h5 class='panel-title text-center' data-i18n="resources.text_editSingle"></h5></div>
  26. <div class='panel-body content'>
  27. <input type='button' class='btn btn-default' data-i18n="[value]resources.btn_addMarker" onclick='addMarker()'/>&nbsp;
  28. <input type='button' class='btn btn-default' data-i18n="[value]resources.btn_undoAdd" onclick='revocationMarker()'/>
  29. <input type='button' class='btn btn-default' data-i18n="[value]resources.text_input_value_submit" onclick='commit()'/>&nbsp;
  30. <input type='button' class='btn btn-default' data-i18n="[value]resources.text_input_value_clear" onclick='clearLayer()'/>
  31. </div>
  32. </div>
  33. </div>
  34. <script type="text/javascript" include="bootstrap,widgets.alert" src="../js/include-web.js"></script>
  35. <script type="text/javascript" src="../../dist/mapboxgl/include-mapboxgl.js"></script>
  36. <script>
  37. var map, id = [], pointFeature, alertDiv, featureService,
  38. baseUrl = (window.isLocal ? window.server : "https://iserver.supermap.io") + "/iserver/services/map-world/rest/maps/World",
  39. mapUrl = baseUrl + "/zxyTileImage.png?z={z}&x={x}&y={y}",
  40. dataUrl = (window.isLocal ? window.server : "https://iserver.supermap.io") + "/iserver/services/data-world/rest/data";
  41. var attribution = "<a href='https://www.mapbox.com/about/maps/' target='_blank'>© Mapbox </a>" +
  42. " with <span>© <a href='https://iclient.supermap.io' target='_blank'>SuperMap iClient</a> | </span>" +
  43. " Map Data <span>© <a href='http://support.supermap.com.cn/product/iServer.aspx' target='_blank'>SuperMap iServer</a></span> ";
  44. map = new mapboxgl.Map({
  45. container: 'map',
  46. style: {
  47. "version": 8,
  48. "sources": {
  49. "raster-tiles": {
  50. "attribution": attribution,
  51. "type": "raster",
  52. "tiles": [mapUrl],
  53. "tileSize": 256
  54. }
  55. },
  56. "layers": [{
  57. "id": "simple-tiles",
  58. "type": "raster",
  59. "source": "raster-tiles",
  60. }]
  61. },
  62. center: [0, 0],
  63. zoom: 2
  64. });
  65. map.addControl(new mapboxgl.NavigationControl(), 'top-left');
  66. map.addControl(new mapboxgl.supermap.LogoControl(), 'bottom-right');
  67. featureService = new mapboxgl.supermap.FeatureService(dataUrl);
  68. var sourceFeatures = {},
  69. addPointFeaturesData = {
  70. "type": "FeatureCollection",
  71. "features": []
  72. };
  73. map.loadImage('../img/marker-icon.png', function (error, image) {
  74. if (error) throw error;
  75. map.addImage('positionPoint', image);
  76. });
  77. initFeature();
  78. function initFeature() {
  79. var polygon = {
  80. "type": "Polygon",
  81. "coordinates": [[[118, 20], [120, 20], [120, 50], [-120, 50], [118, 20]]]
  82. };
  83. var getFeatureParams = new SuperMap.GetFeaturesByGeometryParameters({
  84. toIndex: -1,
  85. datasetNames: ["World:Capitals"],
  86. geometry: polygon,
  87. spatialQueryMode: "INTERSECT"
  88. });
  89. featureService.getFeaturesByGeometry(getFeatureParams, function (serviceResult) {
  90. sourceFeatures = serviceResult.result.features;
  91. if (!map.getSource("queryDatas")) {
  92. map.addSource("queryDatas", {
  93. "type": "geojson",
  94. "data": sourceFeatures
  95. });
  96. } else {
  97. map.getSource("queryDatas").setData(sourceFeatures);
  98. }
  99. map.addLayer({
  100. "id": "queryDatasLayer",
  101. "type": "symbol",
  102. "source": "queryDatas",
  103. "layout": {
  104. "icon-image": "positionPoint",
  105. "icon-size": 0.8,
  106. "icon-offset": [0, -15] //设置偏移量
  107. },
  108. });
  109. var popup = new mapboxgl.Popup({
  110. anchor: 'bottom',
  111. closeButton: false,
  112. offset: {
  113. 'bottom': [0, -20],
  114. }
  115. });
  116. map.on('mousemove', "queryDatasLayer", function (e) {
  117. popup.setLngLat(e.lngLat).setHTML(e.features[0].properties.CAPITAL).addTo(map);
  118. map.getCanvas().style.cursor = 'pointer';
  119. });
  120. map.on('mouseout', "queryDatasLayer", function () {
  121. map.getCanvas().style.cursor = '';
  122. popup.remove();
  123. })
  124. });
  125. }
  126. //添加地物
  127. function addMarker() {
  128. closeClearListener();
  129. widgets.alert.clearAlert();
  130. addPointFeaturesData.features = [];
  131. var xmax = 120, xmin = 100, ymax = 50, ymin = 20;
  132. var addPoint = [Math.floor(Math.random() * (xmax - xmin + 1) + xmin), Math.floor(Math.random() * (ymax - ymin + 1) + ymin)];
  133. pointFeature = {
  134. "type": "Feature",
  135. "geometry": {
  136. "type": "Point",
  137. "coordinates": addPoint
  138. },
  139. "properties": {POP: 1, CAPITAL: 'test'}
  140. };
  141. addPointFeaturesData.features.push(pointFeature);
  142. if (!map.getLayer("addPoint")) {
  143. map.addSource("addPointsSource", {
  144. "type": "geojson",
  145. "data": addPointFeaturesData
  146. });
  147. map.addLayer({
  148. "id": "addPoint",
  149. "type": "circle",
  150. "source": "addPointsSource",
  151. 'paint': {
  152. 'circle-radius': 8,
  153. 'circle-color': 'rgba(255, 0, 0, 0.2)',
  154. "circle-stroke-color": 'red',
  155. "circle-stroke-width": 2,
  156. // "circle-translate": [0, 13] //设置偏移量
  157. },
  158. });
  159. } else {
  160. map.getSource("addPointsSource").setData(addPointFeaturesData);
  161. }
  162. map.flyTo({
  163. center: addPoint,
  164. zoom: 5,
  165. bearing: 0,
  166. speed: 1.2,
  167. curve: 1,
  168. easing: function (t) {
  169. return t;
  170. }
  171. });
  172. }
  173. function revocationMarker() {
  174. closeClearListener();
  175. if (pointFeature) {
  176. addPointFeaturesData.features = [];
  177. map.getSource("addPointsSource").setData(addPointFeaturesData);
  178. pointFeature = null;
  179. } else {
  180. widgets.alert.showAlert(resources.msg_noRevocableMarker, false);
  181. }
  182. }
  183. //提交添加
  184. function commit() {
  185. closeClearListener();
  186. widgets.alert.clearAlert();
  187. if (!pointFeature) {
  188. widgets.alert.showAlert(resources.msg_noMarkerToSubmit, false);
  189. return;
  190. }
  191. //更新添加的source
  192. var addFeatureParams = new SuperMap.EditFeaturesParameters({
  193. features: pointFeature,
  194. dataSourceName: "World",
  195. dataSetName: "Capitals",
  196. editType: "add",
  197. returnContent: true
  198. });
  199. featureService.editFeatures(addFeatureParams, function (serviceResult) {
  200. if (serviceResult.result.succeed) {
  201. addPointFeaturesData.features = [];
  202. map.getSource("addPointsSource").setData(addPointFeaturesData);
  203. pointFeature = null;
  204. map.removeLayer("queryDatasLayer");
  205. widgets.alert.showAlert(resources.msg_submitSuccess, true);
  206. pointFeature = null;
  207. initFeature();
  208. }
  209. });
  210. }
  211. var popup = new mapboxgl.Popup({
  212. anchor: 'left',
  213. closeButton: false,
  214. offset: {'left': [10, 10]}
  215. });
  216. function clearLayer() {
  217. closeClearListener();
  218. widgets.alert.clearAlert();
  219. map.on('mousemove', mousemoveListener);
  220. map.on('click', 'queryDatasLayer', dataClickListener);
  221. }
  222. function mousemoveListener(e) {
  223. popup.setLngLat(e.lngLat).setHTML(resources.msg_selectDeletePoint).addTo(map);
  224. }
  225. function dataClickListener(e) {
  226. var deleteParams = new SuperMap.EditFeaturesParameters({
  227. dataSourceName: "World",
  228. dataSetName: "Capitals",
  229. IDs: [e.features[0].id],
  230. editType: "delete"
  231. });
  232. featureService.editFeatures(deleteParams, function (serviceResult) {
  233. if (serviceResult.result.succeed) {
  234. map.removeLayer("queryDatasLayer");
  235. //重载数据默认集
  236. initFeature();
  237. map.getCanvas().style.cursor = '';
  238. closeClearListener();
  239. widgets.alert.showAlert(resources.text_deleteSuccess, true);
  240. } else {
  241. widgets.alert.showAlert(resources.msg_deleteFailed, false);
  242. }
  243. });
  244. }
  245. function closeClearListener() {
  246. popup.remove();
  247. map.off('mousemove', mousemoveListener);
  248. map.off('click', 'queryDatasLayer', dataClickListener);
  249. }
  250. </script>
  251. </body>
  252. </html>