http://blog.csdn.net/gisshixisheng/article/details/46054949

概述:

在前面有篇博文讲述了基于Arcgis for js和wkt实现在线数据的采集和编辑功能,在本文讲述如何在openlayers实现类似的功能。上一篇博文的地址为:

http://blog.csdn.net/gisshixisheng/article/details/44310765

思路:

前后台的数据交互以wkt的形式,加载已完成对象用wkt,对象更新完成之后将geometry转换为wkt传给后台,将信息保存到数据库中。实现在线编辑主要为OpenLayers.Control.ModifyFeature。

实现:

1、新建vector图层

  1. var renderer = OpenLayers.Util.getParameters(window.location.href).renderer;
  2. renderer = (renderer) ? [renderer] : OpenLayers.Layer.Vector.prototype.renderers;
  3. vectors = new OpenLayers.Layer.Vector("Vector Layer", {
  4. renderers: renderer
  5. });
  6. map1.addLayer(vectors);

2、添加wkt对象

  1. var wkts = [
  2. "POINT(107.5758285931443 29.7822116459692)",
  3. "LINESTRING(120.18304604073 30.3305841465568,108.805692477062 32.0850224203499)",
  4. "POLYGON((102.797302689433 36.5936423859273,105.519115206186 29.4789248520356,100.346180647351 19.9699202912212))"
  5. ];
  6. var wktFormat = new OpenLayers.Format.WKT();
  7. for(var i= 0,dl=wkts.length;i<dl;i++){
  8. var geometry = wktFormat.read(wkts[i]);
  9. vectors.addFeatures(geometry);
  10. }
  11. }

3、添加编辑控件

  1. var editor = new OpenLayers.Control.ModifyFeature(vectors);
  2. map1.addControl(editor);
  3. editor.activate();

4、给vector添加编辑完成事件

  1. vectors.events.on({
  2. "afterfeaturemodified":editEnd
  3. });
  4. function editEnd(evt){
  5. if(evt.modified){
  6. console.log("发生变化");
  7. var geom = evt.feature.geometry;
  8. var wkt = new OpenLayers.Format.WKT(geom);
  9. console.log(wkt.toString());
  10. }
  11. else{
  12. console.log("未发生变化");
  13. }
  14. }

实现完整代码如下:

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title>openlayers map</title>
  6. <link rel="stylesheet" href="http://localhost/olapi/theme/default/style.css" type="text/css">
  7. <style>
  8. html, body{
  9. padding:0;
  10. margin:0;
  11. height:100%;
  12. width:100%;
  13. overflow: hidden;
  14. font-size: 12px;
  15. }
  16. #map1{
  17. width: 100%;
  18. height: 100%;
  19. float: left;
  20. border-right: 1px solid #000000;
  21. }
  22. </style>
  23. <script src="http://localhost/olapi/OpenLayers.js"></script>
  24. <script src="http://localhost/olapi/lib/OpenLayers/Lang/zh-CN.js"></script>
  25. <script src="http://localhost/jquery/jquery-1.8.3.js"></script>
  26. <script>
  27. var map1, vectors;
  28. OpenLayers.Feature.Vector.style['default']['strokeWidth'] = '2';
  29. $(function(){
  30. var bounds = new OpenLayers.Bounds(
  31. 73.45100463562233, 18.16324718764174,
  32. 134.97679764650596, 53.531943152223576
  33. );
  34. var options = {
  35. controls: [],
  36. maxExtent: bounds,
  37. maxResolution: 0.2403351289487642,
  38. projection: "EPSG:4326",
  39. units: 'degrees'
  40. };
  41. map1 = new OpenLayers.Map('map1', options);
  42. map1.addLayer(getWms("china"));
  43. map1.addControl(new OpenLayers.Control.Zoom());
  44. map1.addControl(new OpenLayers.Control.Navigation());
  45. map1.zoomToExtent(bounds);
  46. addVectors();
  47. addEditor();
  48. });
  49. function getWms(layer){
  50. return new OpenLayers.Layer.WMS(
  51. "Geoserver layers - Tiled",
  52. "http://localhost:8081/geoserver/lzugis/wms",
  53. {
  54. "LAYERS": layer,
  55. "STYLES": '',
  56. format: 'image/png'
  57. },
  58. {
  59. buffer: 0,
  60. displayOutsideMaxExtent: true,
  61. isBaseLayer: true,
  62. yx : {'EPSG:4326' : true}
  63. }
  64. );
  65. }
  66. function addVectors(){
  67. var renderer = OpenLayers.Util.getParameters(window.location.href).renderer;
  68. renderer = (renderer) ? [renderer] : OpenLayers.Layer.Vector.prototype.renderers;
  69. vectors = new OpenLayers.Layer.Vector("Vector Layer", {
  70. renderers: renderer
  71. });
  72. map1.addLayer(vectors);
  73. vectors.events.on({
  74. "afterfeaturemodified":editEnd
  75. });
  76. var wkts = [
  77. "POINT(107.5758285931443 29.7822116459692)",
  78. "LINESTRING(120.18304604073 30.3305841465568,108.805692477062 32.0850224203499)",
  79. "POLYGON((102.797302689433 36.5936423859273,105.519115206186 29.4789248520356,100.346180647351 19.9699202912212))"
  80. ];
  81. var wktFormat = new OpenLayers.Format.WKT();
  82. for(var i= 0,dl=wkts.length;i<dl;i++){
  83. var geometry = wktFormat.read(wkts[i]);
  84. vectors.addFeatures(geometry);
  85. }
  86. }
  87. function addEditor(){
  88. var editor = new OpenLayers.Control.ModifyFeature(vectors);
  89. map1.addControl(editor);
  90. editor.activate();
  91. }
  92. function editEnd(evt){
  93. if(evt.modified){
  94. console.log("发生变化");
  95. var geom = evt.feature.geometry;
  96. var wkt = new OpenLayers.Format.WKT(geom);
  97. console.log(wkt.toString());
  98. }
  99. else{
  100. console.log("未发生变化");
  101. }
  102. }
  103. </script>
  104. </head>
  105. <body>
  106. <div id="map1"></div>
  107. </body>
  108. </html>

实现效果:

编辑状态
编辑完成

(转)openlayers实现在线编辑的更多相关文章

  1. Microsoft Azure Web Sites应用与实践【3】—— 通过Visual Studio Online在线编辑Microsoft Azure 网站

    Microsoft Azure Web Sites应用与实践 系列: [1]—— 打造你的第一个Microsoft Azure Website [2]—— 通过本地IIS 远程管理Microsoft ...

  2. 小讲堂:在线编辑在Mobox文档管理软件中的意义

    今天我们来讨论一下,mobox文档管理软件中的在线编辑的这个功能,相信这个功能是用户在日常的文档维护中非常需要的. 文档管理软件的诸多功能中,在线编辑是一块很重要的功能点,因为在线编辑可以说是提高工作 ...

  3. Office word excel电子表格在线编辑的实现方法

    Office xp之后的版本支持通过webdav协议(http的扩展)直接编辑服务器上的文件. IIS(6.0)支持webdav,这在IIS管理器的web服务扩展中可以看到.利用IIS作为webdav ...

  4. RunJS - 在线编辑、展示、分享、交流你的 JavaScript 代码

    发现一个很好玩,很强大的网站 RunJS - 在线编辑.展示.分享.交流你的 JavaScript 代码   http://runjs.cn/ 比如: http://runjs.cn/detail/l ...

  5. [前端插件]Bootstrap Table服务器分页与在线编辑应用总结

    先看Bootstrap Table应用效果: 表格用来显示数据库中的数据,数据通过AJAX从服务器加载,同时分页功能有服务器实现,避免客户端分页,在加载大量数据时造成的用户体验不好.还可以设置查询数据 ...

  6. icon在线编辑和查找工具

    1.www.iconpng.com 2.在线编辑http://www.ico.la/ 3.小图标查找 http://icomoon.io/app/ 4.20个免费的psd http://www.osc ...

  7. word在线编辑\生成图片(包含截图与合并)

    1.业务原因 word编辑后的文章复制到html编辑器(fck等)会发生排版错乱的情况,于是混沌了.需要有一个新的方法来终结,于是产生了word能不能在线编辑,后台保存,前台显示灯一系列问题. 2.首 ...

  8. Office文档在线编辑的实现之二

    讲述了如何通过iis的webdav支持实现客户端的office直接编辑服务器上的文件,本篇将讲解如何实现客户端的office直接编辑数据库中的二进制形式保存的office文件. 实现的关键:模拟IIS ...

  9. Office文档在线编辑的实现之一

    因为项目的关系,研究了一下Office的在线编辑功能,写出来共享一下. Office xp之后的版本支持通过webdav协议(http的扩展)直接编辑服务器上的文件. IIS(6.0)支持webdav ...

随机推荐

  1. 【Codeforces 161D】Distance in Tree

    [链接] 我是链接,点我呀:) [题意] 问你一棵树上有多少条长度为k的路径 [题解] 树形dp 设 size[i]表示以节点i为根节点的子树的节点个数 dp[i][k]表示以i为根节点的子树里面距离 ...

  2. AngularJS:添加检查密码输入是否一致的功能

    感谢作者(http://blog.brunoscopelliti.com/angularjs-directive-to-check-that-passwords-match) 利用AngularJS的 ...

  3. c++实现数据结构1.顺序表

    头文件seqlist.h #ifndef _SEQLIST_H_ #define _SEQLIST_H_ #include<iostream> using namespace std; t ...

  4. 一键解决ScrollView嵌套ListView仅仅显示一行的问题

    /** * 解决ScrollView嵌套ListView仅仅显示一行的问题 * * @param listView */ private void setListViewHeightBasedOnCh ...

  5. IE新发现

    近期用thinkphp写的小程序在IE上測试的时候偶然发现原来IE不兼容的不止是样式啊!!! 震惊哭了~ 在火狐上面嗖嗖的一点bug也没有,在IE上面跟死水一样.. .. 那么问题来了:我的问题是出如 ...

  6. cannot find -l****问题的解决的方法

    在ubuntu下编译C或cpp文件时,可能会出现找不到链接库的问题,其形式为: cannot find -l**** 这里的**通常是指的链接库.比方,刚刚装好opencv,依照网上教程一步步编译好了 ...

  7. 【 D3.js 进阶系列 — 2.2 】 力学图的參数

    力学图的布局中有非常多參数.本文将逐个说明. D3 中的力学图布局是使用韦尔莱积分法计算的.这是一种用于求解牛顿运动方程的数值方法,被广泛应用于分子动力学模拟以及视频游戏中. 定义布局的代码例如以下: ...

  8. 新随笔(三)什么时候使用button,什么时候使用文字链接

    新随笔(三)什么时候使用button.什么时候使用文字链接 你为什么在这个地方用button而不用文字链接呢? 这是刚才我问一个设计师的问题. 她抬头看我,眼神迷茫.说:"没什么为什么呀,我 ...

  9. Choose the best route HDU杭电2680【dijkstra算法 || SPFA】

    http://acm.hdu.edu.cn/showproblem.php?pid=2680 Problem Description One day , Kiki wants to visit one ...

  10. Extjs grid 设置行字体颜色

    CustSuppGrid = Ext.create('Ext.grid.Panel', { title : '', // 标题头 iconCls : 'icon-grid', // 标题图标 stor ...