openlayers实现在线编辑

概述:

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

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

思路:

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

实现:

1、新建vector图层

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

2、添加wkt对象

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

3、添加编辑控件

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

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

        vectors.events.on({
            "afterfeaturemodified":editEnd
        });
        function editEnd(evt){
            if(evt.modified){
                console.log("发生变化");
                var geom = evt.feature.geometry;
                var wkt = new OpenLayers.Format.WKT(geom);
                console.log(wkt.toString());
            }
            else{
                console.log("未发生变化");
            }
        }

实现完整代码如下:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>openlayers map</title>
    <link rel="stylesheet" href="http://localhost/olapi/theme/default/style.css" type="text/css">
    <style>
        html, body{
            padding:0;
            margin:0;
            height:100%;
            width:100%;
            overflow: hidden;
            font-size: 12px;
        }
        #map1{
            width: 100%;
            height: 100%;
            float: left;
            border-right: 1px solid #000000;
        }
    </style>
    <script src="http://localhost/olapi/OpenLayers.js"></script>
    <script src="http://localhost/olapi/lib/OpenLayers/Lang/zh-CN.js"></script>
    <script src="http://localhost/jquery/jquery-1.8.3.js"></script>
    <script>
        var map1, vectors;
        OpenLayers.Feature.Vector.style['default']['strokeWidth'] = '2';
        $(function(){
            var bounds = new OpenLayers.Bounds(
                    73.45100463562233, 18.16324718764174,
                    134.97679764650596, 53.531943152223576
            );
            var options = {
                controls: [],
                maxExtent: bounds,
                maxResolution: 0.2403351289487642,
                projection: "EPSG:4326",
                units: 'degrees'
            };
            map1 = new OpenLayers.Map('map1', options);

            map1.addLayer(getWms("china"));
            map1.addControl(new OpenLayers.Control.Zoom());
            map1.addControl(new OpenLayers.Control.Navigation());
            map1.zoomToExtent(bounds);
            addVectors();
            addEditor();
        });

        function getWms(layer){
            return new OpenLayers.Layer.WMS(
                    "Geoserver layers - Tiled",
                    "http://localhost:8081/geoserver/lzugis/wms",
                    {
                        "LAYERS": layer,
                        "STYLES": '',
                        format: 'image/png'
                    },
                    {
                        buffer: 0,
                        displayOutsideMaxExtent: true,
                        isBaseLayer: true,
                        yx : {'EPSG:4326' : true}
                    }
            );
        }

        function addVectors(){
            var renderer = OpenLayers.Util.getParameters(window.location.href).renderer;
            renderer = (renderer) ? [renderer] : OpenLayers.Layer.Vector.prototype.renderers;
            vectors = new OpenLayers.Layer.Vector("Vector Layer", {
                renderers: renderer
            });
            map1.addLayer(vectors);
            vectors.events.on({
                "afterfeaturemodified":editEnd
            });
            var wkts = [
                "POINT(107.5758285931443 29.7822116459692)",
                "LINESTRING(120.18304604073 30.3305841465568,108.805692477062 32.0850224203499)",
                "POLYGON((102.797302689433 36.5936423859273,105.519115206186 29.4789248520356,100.346180647351 19.9699202912212))"
            ];
            var wktFormat = new OpenLayers.Format.WKT();
            for(var i= 0,dl=wkts.length;i<dl;i++){
                var geometry = wktFormat.read(wkts[i]);
                vectors.addFeatures(geometry);
            }
        }

        function addEditor(){
            var editor = new OpenLayers.Control.ModifyFeature(vectors);
            map1.addControl(editor);
            editor.activate();
        }

        function editEnd(evt){
            if(evt.modified){
                console.log("发生变化");
                var geom = evt.feature.geometry;
                var wkt = new OpenLayers.Format.WKT(geom);
                console.log(wkt.toString());
            }
            else{
                console.log("未发生变化");
            }
        }

    </script>
</head>
<body>
    <div id="map1"></div>
</body>
</html>

实现效果:

编辑状态

编辑完成

时间: 2024-11-06 03:03:05

openlayers实现在线编辑的相关文章

shell——bash在线编辑

无意中发现了一个bash在线编辑的网址,初学者可以用这个试着学习shell http://www.runoob.com/try/runcode.php?filename=helloworld&type=bash

ArcGIS JavaScript在线编辑

代码: <html> <head>     <meta http-equiv="Content-Type" content="text/html; charset=utf-8">     <title>Demo:Edit Features</title>     <link rel="stylesheet" href="https://js.arcgis.com/3.17

常见的web在线编辑工具

         在线编辑工具      JSbin http://jsbin.com/优点:不需要登录,即发即预览缺点:速度不靠谱 RUN JShttp://runjs.cn/code优点:国内访问速度快,可以上传图片(左下角)缺点:需要登录,用户名

Node.js 切近实战(九) 之Excel在线(在线编辑)

最近实在是太想去西藏了,我自己总是喜欢人少的旅游地,喜欢一望无垠,喜欢蓝天白云大草原. 之前有一节我给大家讲过文件列表,如下,今天我们要讲的就是Excel在线编辑. 当我们双击文件图标的时候会跳转到一个Excel修改界面,如下. ok,这里我们使用的依然是Telerik Kendo UI中的SpreadSheet,看一下这个Spread Sheet是如何用的. 我们定义一个spreadsheet的div,我们看一下这个div怎么生成sheet. $("#spreadsheet").ke

【网页在线编辑】图文发送的模式

1.需求 网页在线编辑第三方插件很多,我需要做一个手机上发布图片+文字的精简版的编辑器,文字和图片就自上而下排列就完了. iframe的实现架构很多. 2.实现 2.1 iframe定义 2.2 编辑模式设置和焦点获取 ifEdit = this.getElementByXid("ifEdit").contentWindow;                //编辑模式        ifEdit.document.designMode = "on";       

NET中weboffice组件在线编辑文档并保存到服务器上

页面中组件的引用以及控件触发事件: <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="9" background="images/tab_12.gif"> <asp:Button ID="btnuploadsave"

java 在线编辑模版 代码编辑器 兼容手机平板PC freemaker 静态引擎 网站源码

java 企业网站源码 前后台都有 静态模版引擎, 代码生成器大大提高开发效率 前台: 支持三套模版, 可以在后台切换 系统介绍: 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站后台采用freemaker静态化模版引擎生成html 2.因为是生成的html,所以访问速度快,轻便,对服务器负担小 3.网站前端采用主流的响应式布局,同一页面同时支持PC.平板.手机(三合一)浏览器访问 4.springmvc +spring4.2.5+ mybaits3.3  SSM 普通java we

Jcrop ,.net仿百度上传在线编辑头像

(源码下载链接: http://pan.baidu.com/s/1pJVxMAn 密码: gbuz)  个人习惯,代码不贴出来,自己去云盘下. 我们先看一下百度上传头像的页面.如下图. 再 看看我做的效果. 图1 图2 上面是我做出的效果,灰色是一个400X400的背景,图片会自动适应 (图1和图2 一个横向一个是纵向),宽度和高度始终能放入这个背景中. 介绍一下使用的技术,Jquery, Jcrop ,ajaxfileupload.js . 我们先看一下百度上传头像的页面.如下图. 再 看看我

99行Swift完成Markdown在线编辑服务器

本项目展示了如何使用Perfect HTTP服务器.Perfect Markdown渲染组件和Perfect WebSocket搭建一个在线的Markdown文本编辑器.全部源代码可以在https://github.com/PerfectExamples/Perfect-Markdown-Editor直接下载 请确保您的系统已经安装了Swift 3.1工具链. 完整教学视频 关于本案例完整的教学视频请参考这里:99行Swift完成Markdown在线编辑服务器 快速上手 请使用下列bash命令下