02_editFeatures.html 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. <!--********************************************************************
  2. * Copyright© 2000 - 2021 SuperMap Software Co.Ltd. All rights reserved.
  3. *********************************************************************-->
  4. <!DOCTYPE html>
  5. <html>
  6. <head>
  7. <meta charset="UTF-8">
  8. <title data-i18n="resources.title_editFeature"></title>
  9. <script type="text/javascript" src="../../dist/ol/include-ol.js"></script>
  10. <style>
  11. .editPane {
  12. position: absolute;
  13. right: 65px;
  14. top: 8px;
  15. text-align: center;
  16. background: #FFF;
  17. z-index: 1000;
  18. border-radius: 4px;
  19. }
  20. .ol-popup {
  21. position: absolute;
  22. background-color: white;
  23. -webkit-filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2));
  24. filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2));
  25. padding: 15px;
  26. border-radius: 10px;
  27. border: 1px solid #cccccc;
  28. bottom: 12px;
  29. left: -50px;
  30. min-width: 120px;
  31. }
  32. .ol-popup:after, .ol-popup:before {
  33. top: 100%;
  34. border: solid transparent;
  35. content: " ";
  36. height: 0;
  37. width: 0;
  38. position: absolute;
  39. pointer-events: none;
  40. }
  41. .ol-popup:after {
  42. border-top-color: white;
  43. border-width: 10px;
  44. left: 48px;
  45. margin-left: -10px;
  46. }
  47. .ol-popup:before {
  48. border-top-color: #cccccc;
  49. border-width: 11px;
  50. left: 48px;
  51. margin-left: -11px;
  52. }
  53. .tooltip {
  54. position: relative;
  55. background: rgba(0, 0, 0, 0.5);
  56. border-radius: 4px;
  57. color: white;
  58. padding: 4px 8px;
  59. opacity: 0.7;
  60. white-space: nowrap;
  61. }
  62. </style>
  63. </head>
  64. <body style=" margin: 0;overflow: hidden;background: #fff;width: 100%;height:100%; position: absolute;top: 0;">
  65. <div id="map" style="width: 100%;height:100%"></div>
  66. <div id="popup" class="ol-popup">
  67. <div id="popup-content"></div>
  68. </div>
  69. <div>
  70. <div class="panel panel-primary editPane" id="editPane">
  71. <div class='panel-heading'>
  72. <h5 class='panel-title text-center' data-i18n="resources.text_editSingle"></h5></div>
  73. <div class='panel-body content'>
  74. <input type='button' class='btn btn-default' data-i18n="[value]resources.btn_addMarker"
  75. onclick='addMarker()'/>&nbsp;
  76. <input type='button' class='btn btn-default' data-i18n="[value]resources.btn_undoAdd"
  77. onclick='revocationMarker()'/>
  78. <input type='button' class='btn btn-default' data-i18n="[value]resources.text_input_value_submit"
  79. onclick='commit()'/>&nbsp;
  80. <input type='button' class='btn btn-default' data-i18n="[value]resources.text_input_value_clear"
  81. onclick='clearLayer()'/>
  82. </div>
  83. </div>
  84. </div>
  85. <script type="text/javascript" include="bootstrap,widgets.alert" src="../js/include-web.js"></script>
  86. <script type="text/javascript">
  87. var map, id = [], pointFeature, vectorSource, resultLayer, editFeaturesService, alertDiv,
  88. addPointsSource, addPointsLayer,
  89. host = window.isLocal ? window.server : "https://iserver.supermap.io",
  90. baseUrl = host + "/iserver/services/map-world/rest/maps/World",
  91. url = host + "/iserver/services/data-world/rest/data",
  92. container = document.getElementById('popup'),
  93. content = document.getElementById('popup-content'),
  94. overlay = new ol.Overlay(({
  95. element: container,
  96. autoPan: true,
  97. autoPanAnimation: {
  98. duration: 250
  99. },
  100. offset: [0, -20]
  101. })),
  102. map = new ol.Map({
  103. target: 'map',
  104. controls: ol.control.defaults({attributionOptions: {collapsed: false}})
  105. .extend([new ol.supermap.control.Logo()]),
  106. view: new ol.View({
  107. center: [0, 0],
  108. zoom: 3,
  109. projection: 'EPSG:4326',
  110. multiWorld: true
  111. }),
  112. });
  113. var layer = new ol.layer.Tile({
  114. source: new ol.source.TileSuperMapRest({
  115. url: baseUrl
  116. }),
  117. projection: 'EPSG:4326'
  118. });
  119. map.addLayer(layer);
  120. //创建鼠标操作提示:
  121. var helpTooltipElement, helpTooltip, isclearPoint;
  122. createHelpTooltip();
  123. function createHelpTooltip() {
  124. if (helpTooltipElement) {
  125. helpTooltipElement.parentNode.removeChild(helpTooltipElement);
  126. }
  127. helpTooltipElement = document.createElement('div');
  128. helpTooltipElement.className = 'tooltip hidden';
  129. helpTooltip = new ol.Overlay({
  130. element: helpTooltipElement,
  131. offset: [15, 0],
  132. positioning: 'center-left'
  133. });
  134. }
  135. initFeature();
  136. loadLayer();
  137. function loadLayer() {
  138. //添加查询结果图层
  139. vectorSource = new ol.source.Vector({
  140. wrapX: false
  141. });
  142. resultLayer = new ol.layer.Vector({
  143. source: vectorSource,
  144. });
  145. //添加点图层
  146. addPointsSource = new ol.source.Vector({
  147. wrapX: false
  148. });
  149. addPointsLayer = new ol.layer.Vector({
  150. source: addPointsSource,
  151. });
  152. map.addLayer(addPointsLayer);
  153. map.addLayer(resultLayer);
  154. }
  155. editFeaturesService = new ol.supermap.FeatureService(url);
  156. function initFeature() {
  157. var polygon = new ol.geom.Polygon([[[118, 20], [120, 20], [120, 50], [-120, 50], [118, 20]]]);
  158. var featureService = new ol.supermap.FeatureService(url);
  159. var getFeatureParams = new SuperMap.GetFeaturesByGeometryParameters({
  160. toIndex: -1,
  161. datasetNames: ["World:Capitals"],
  162. geometry: polygon,
  163. spatialQueryMode: "INTERSECT"
  164. });
  165. featureService.getFeaturesByGeometry(getFeatureParams, function (serviceResult) {
  166. var features = (new ol.format.GeoJSON()).readFeatures(serviceResult.result.features);
  167. for (var i = 0; i < features.length; i++) {
  168. features[i].setStyle(new ol.style.Style({
  169. image: new ol.style.Icon(({
  170. anchor: [0.5, 0.9],
  171. src: '../img/markerbig_select.png'
  172. }))
  173. }));
  174. }
  175. //避免重复添加图层,只对一个图层进行数据更新操作:
  176. if (vectorSource.getFeatures().length > 0) {
  177. vectorSource.clear();
  178. }
  179. vectorSource.addFeatures(features);
  180. map.on('pointermove', pointermoveLinstener);
  181. });
  182. }
  183. function pointermoveLinstener(e) {
  184. var select = false;
  185. map.forEachFeatureAtPixel(e.pixel, function (feature) {
  186. if (feature.getProperties().CAPITAL) {
  187. map.getTargetElement().style.cursor = 'pointer';
  188. var contentHTML = feature.getProperties().CAPITAL;
  189. content.innerHTML = contentHTML;
  190. overlay.setPosition(feature.getGeometry().getCoordinates());
  191. map.addOverlay(overlay);
  192. select = true
  193. }
  194. }, {
  195. hitTolerance: 10
  196. });
  197. if (!select) {
  198. map.getTargetElement().style.cursor = '';
  199. overlay.setPosition(undefined);
  200. map.removeOverlay(overlay);
  201. }
  202. if (isclearPoint) {
  203. helpTooltipElement.innerHTML = resources.text_selectMarkerToDelete;
  204. helpTooltip.setPosition(e.coordinate);
  205. helpTooltipElement.classList.remove('hidden');
  206. map.addOverlay(helpTooltip);
  207. } else {
  208. helpTooltip.setPosition(undefined);
  209. helpTooltipElement.classList.add('hidden');
  210. }
  211. }
  212. function addMarker() {
  213. if (isclearPoint) {
  214. closeSelectListener();
  215. }
  216. widgets.alert.clearAlert();
  217. var xmax = 120, xmin = 100, ymax = 50, ymin = 20,
  218. point = [Math.floor(Math.random() * (xmax - xmin + 1) + xmin), Math.floor(Math.random() * (ymax - ymin + 1) + ymin)];
  219. if (!pointFeature) {
  220. ceateMarker(point)
  221. } else {
  222. addPointsSource.clear();
  223. ceateMarker(point)
  224. }
  225. function ceateMarker(point) {
  226. pointFeature = new ol.Feature(new ol.geom.Point(point));
  227. pointFeature.setStyle(new ol.style.Style({
  228. image: new ol.style.Circle({
  229. fill: new ol.style.Fill({
  230. color: [255, 0, 0, 0.5]
  231. }),
  232. stroke: new ol.style.Stroke({
  233. color: 'red',
  234. width: 2
  235. }),
  236. radius: 8
  237. })
  238. }));
  239. pointFeature.setProperties({POP: 1, CAPITAL: 'test'});
  240. //判断添加点图层已添加到地图,避免重复添加图层,只对一个图层进行数据更新操作:
  241. addPointsSource.addFeature(pointFeature);
  242. map.getView().animate({
  243. duration: 850,
  244. zoom: 5,
  245. center: point,
  246. });
  247. }
  248. }
  249. function revocationMarker() {
  250. if (isclearPoint) {
  251. closeSelectListener();
  252. }
  253. if (pointFeature) {
  254. addPointsSource.clear();
  255. pointFeature = null;
  256. } else {
  257. widgets.alert.showAlert(resources.msg_noRevocableMarker, false);
  258. }
  259. }
  260. function commit() {
  261. widgets.alert.clearAlert();
  262. if (isclearPoint) {
  263. closeSelectListener();
  264. }
  265. if (pointFeature) {
  266. var addFeatureParams = new SuperMap.EditFeaturesParameters({
  267. features: pointFeature,
  268. dataSourceName: "World",
  269. dataSetName: "Capitals",
  270. editType: "add",
  271. returnContent: true
  272. });
  273. editFeaturesService.editFeatures(addFeatureParams, function (serviceResult) {
  274. if (serviceResult.result.succeed) {
  275. id.push(serviceResult.result[0]);
  276. addPointsSource.clear();
  277. vectorSource.clear();
  278. pointFeature = null;
  279. initFeature();
  280. widgets.alert.showAlert(resources.msg_submitSuccess, true);
  281. }
  282. });
  283. } else {
  284. widgets.alert.showAlert(resources.msg_noMarkerToSubmit, false);
  285. }
  286. }
  287. function clearLayer() {
  288. widgets.alert.clearAlert();
  289. isclearPoint = true;
  290. map.on('click', selectListener);
  291. }
  292. function selectListener(e) {
  293. var deletedId = null;
  294. map.forEachFeatureAtPixel(e.pixel, function (feature) {
  295. //只删选中第一个要素:
  296. if (!deletedId) {
  297. deletedId = feature.getId();
  298. var deleteParams = new SuperMap.EditFeaturesParameters({
  299. dataSourceName: "World",
  300. dataSetName: "Capitals",
  301. IDs: [deletedId],
  302. editType: "delete"
  303. });
  304. editFeaturesService.editFeatures(deleteParams, function (serviceResult) {
  305. if (serviceResult.result.succeed) {
  306. initFeature();
  307. vectorSource.clear();
  308. isclearPoint = false;
  309. closeSelectListener();
  310. widgets.alert.showAlert(resources.text_deleteSuccess, true);
  311. } else {
  312. widgets.alert.showAlert(resources.msg_deleteFailed, false)
  313. }
  314. });
  315. }
  316. }, {
  317. hitTolerance: 1
  318. });
  319. }
  320. function closeSelectListener() {
  321. isclearPoint = false;
  322. map.un('click', selectListener);
  323. helpTooltip.setPosition(undefined);
  324. map.removeOverlay(helpTooltip);
  325. helpTooltipElement.classList.add('hidden');
  326. }
  327. </script>
  328. </body>
  329. </html>