基于Arcgis for Js的web GIS数据在线采集简介

在前一篇博文“Arcgis for js之WKT和geometry转换”中实现了wkt和geometry之间的相互转化,博文原文地址为:http://blog.csdn.net/gisshixisheng/article/details/44057453。在本节,接上文,简单讲述基于Arcgis for Js的web GIS数据在线采集。


实现数据的在线采集,最主要的是数据的存储,即将采集到的数据的geometry对象保存下来,并后续可以转换为shp数据。在本文,我的处理方式为将前段绘制的geometry对象转换为wkt形式存储在数据库中,在oracle数据库中,用clob存储wkt即可。


其次,数据在线采集还需满足一下需求:

1、对象绘制;

2、对象的编辑;

3、对象的删除;

4、对象的展示。


下面,看看首先后的效果:

技术分享

主窗口

技术分享

选择编辑

技术分享

绘制完成后提示

技术分享

点集对象开始编辑

技术分享

单击地图提示编辑信息

技术分享

删除提示

技术分享

删除后的结果

至此,数据的在线采集基本完成,接下来说说实现步骤吧。

1、对象的绘制

对象的绘制是通过Edit来实现的,如下:

        var edit = new Edit(map);
            var select;
            edit.on("deactivate",function(evt){
                var geom = evt.graphic.geometry;
                var wkt = null;
                switch(geom.type){
                    case "polyline":{
                        wkt = LineToWKT(geom);
                        break;
                    }
                    case "polygon":{
                        wkt = PolygonToWKT(geom);
                        break;
                    }
                    default :{
                        wkt = PointToWKT(geom);
                        break;
                    }
                }
                if(confirm('是否编辑?')){
                    console.log("编辑:"+wkt);
                }
            });
            map.on("click", function(evt){
                edit.deactivate();
            });

        editItem = function(td){
                var tr = td.parentElement;
                var objType = tr.id;
                var id = tr.cells[0].innerHTML;
                var title = tr.cells[1].innerHTML;
                $("#itemTitle").html("").html(title);
                $("#itemType").val("point");
                $("#itemObjtype").val(objType)
                $("#editWindow").show();

                var draw = new Draw(map);
                draw.on("draw-end", function(evt){
                    map.setMapCursor("default");
                    var symbol = null,wkt;
                    switch(evt.geometry.type){
                        case "polyline":{
                            symbol = new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
                                    new Color([255,0,0]), 3);
                            wkt = LineToWKT(evt.geometry);
                            break;
                        }
                        case "polygon":{
                            symbol = new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID,
                                    new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
                                            new Color([255,0,0]), 2),
                                    new Color([200,200,200,0.5]));
                            wkt = PolygonToWKT(evt.geometry);
                            break;
                        }
                        default :{
                            symbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.STYLE_SQUARE, 10,
                                    new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
                                            new Color([255,0,0]), 1),
                                    new Color([0,255,0,0.25]));
                            wkt = PointToWKT(evt.geometry);
                            break;
                        }
                    }
                    var graphic = new Graphic(evt.geometry, symbol,{id:$("#itemObjtype").val(),name:$("#itemTitle").html()});
                    editLayer.add(graphic);
                    draw.deactivate();
                    if(confirm('是否绘制?')){
                        console.log("新建:"+wkt);
                    }
                });
                on(dom.byId("editBtn"), "click",function(){
                    var objType = $("#itemType").val();
                    switch(objType){
                        case "polyline":{
                            draw.activate(esri.toolbars.Draw.POLYLINE);
                            break;
                        }
                        case "polygon":{
                            draw.activate(esri.toolbars.Draw.POLYGON);
                            break;
                        }
                        default :{
                            draw.activate(esri.toolbars.Draw.POINT);
                            break;
                        }
                    }
                    map.setMapCursor("corsshair");
                    $("#editWindow").hide();
                 });
            }

2、对象的编辑

对象的编辑是通过Edit实现的,如下:

            var edit = new Edit(map);
            var select;
            edit.on("deactivate",function(evt){
                var geom = evt.graphic.geometry;
                var wkt = null;
                switch(geom.type){
                    case "polyline":{
                        wkt = LineToWKT(geom);
                        break;
                    }
                    case "polygon":{
                        wkt = PolygonToWKT(geom);
                        break;
                    }
                    default :{
                        wkt = PointToWKT(geom);
                        break;
                    }
                }
                if(confirm('是否编辑?')){
                    console.log("编辑:"+wkt);
                }
            });
            map.on("click", function(evt){
                edit.deactivate();
            });
            editLayer.on("click", function(evt) {
                event.stop(evt);
                activateToolbar(evt.graphic);
            });
            function activateToolbar(graphic) {
                var tool = 15;
                var options = {allowAddVertices: "true", allowDeleteVertices: "true", uniformScaling: "true"};
                edit.activate(tool, graphic, options);
                select = graphic;
            }

3、对象的删除

            delItem = function(td){
                if(confirm('是否删除?')){
                    var id = tr.cells[0].innerHTML;
                    var graphics = editLayer.graphics;
                    for(var i= 0, dl=graphics.length; i<dl; i++){
                        var graphic = graphics[i];
                        if(graphic.attributes.id===id){
                            editLayer.remove(graphic);
                            break;
                        }
                    }
                }
            }


最后,就是将绘制的geometry传给后台,主要有两个地方,一个是绘制完成之后,代码中体现在draw的draw-end事件中,一个是在编辑完成之后,代码中体现在edit的deactivate事件中。


技术分享


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。