SQLserver空间数据的保存及编辑(以Polygon为例)

本文介绍如何使用OpenLayer实现地图上的多边形绘制与编辑,并将这些空间数据保存到SQLServer数据库中。文章详细讲解了JavaScript代码的具体实现过程,包括如何处理坐标数据以符合SQLServer的要求。

注意

SQLServer 所用的Geometry一般的开发语言并不包含,所以需要转化,如图,最简便的转化是用Polygon包含。

SQL语句

//插入语句(编辑语句应该不用给出了)
INSERT INTO table_name (polygon,...) VALUES (POLYGON((X1 Y1,X2 Y2,X3 Y3,X1 Y1)),....)
//从表中读出空间数据支持传到程序中
SELECT polygon.ToString() AS geom FROM table_name WHERE ID=...

用Openlayer来交互实现保存和修改(删除太简单就不说了)

JS部分的增加,核心是弄懂openlayer对polygon的封装,而传到后台就是实现保存语句了,不同框架方式不同,不详细介绍。
    /**
     * 空间数据的增加
     * @param fenceid 唯一标识值
     */
    function addFence(fenceid){
    	//定义交互方式
		var draw = new ol.interaction.Draw({
			source: olkit.fenceSource,
			type: 'Polygon'	
		});
		map.addInteraction(draw); //添加绘制
		
		//绘制结束的回调函数
		draw.on('drawend',function(evt){
			var currentfea = evt.feature; //当前要素
			var coor = currentfea.getGeometry().getCoordinates(); //当前要素几何坐标(重要,数据库只能存坐标)
			var geoCoor  = coor[0]; //起点终点一致(解去js的封装)
			for (var i=0,l=geoCoor.length; i<l; i++){
				geoCoor[i] = geoCoor[i].join(' '); //xy用空格分隔
			}
			
			$.messager.confirm("Tips", "确定保存吗?", function (data) {
	            if (data) {
	            	draw.setActive(false); //停止绘制功能
	            	$.ajax({
            			url:  _$base + '/gis/map/addPolygon', //后台
            			type: 'POST',
            			data: {'fenceid':fenceid,'polygon':geoCoor.join(',')},//传ID及坐标
            			success: function(rs){ //rs是自定义的JSON
            				if(rs.code == "FAIL"){
                        		$.messager.alert('提示',rs.msg);
                        	}else{
                        		$.messager.alert('提示',rs.msg);
                        		window.history.go(-1); //网页后退
                        	}
            			},
            			error: true
            		});
	            }
	            else {
	            	olkit.fenceSource.clear(); //清除要素
	       			map.removeInteraction(draw); //删除绘制
	            }
			});
		});
    }
JS部分的编辑,通过modify来实现更新
/**
     * 编辑
     * @param fenceid id
     * @param polygon 空间数据
     */
    function editFence(fenceid,polygon){
    	$.messager.confirm("Tips", "确定进行编辑吗?", function (data) {
            if (data) {
            	//利用已知坐标进行绘制
            	var gis = polygon.substring(10,polygon.length-2).split(', '); //截去Polygon包含
            	var temp = new Array();
            	var point = new Array();
            	for(var i=0;i<gis.length;i++){
            		temp[i] = gis[i].split(' ');
            		point.push([parseFloat(temp[i][0]),parseFloat(temp[i][1])]); //重要:一定要以压入的方式来生成coordinates,不然modify不响应
            	}
            	var po = [point]; //重新封装
            	var feature = new ol.Feature({
            		  geometry: new ol.geom.Polygon(po) //添加要素
            		});
            	
            	olkit.fenceSource.addFeature(feature);
            	olkit.fenceSource.refresh();

            	//定义交互方式
        		var select = new ol.interaction.Select({wrapX: false});
        		map.addInteraction(select); //添加选择
        		
        		//选中要素
                select.on('select',function(){
        			if(select.getFeatures()){
        				console.log(select.getFeatures());
        				$('#popupItem').dialog(); //打开属性设置框
        				
        				var modify = new ol.interaction.Modify({
        			        features: select.getFeatures()
        			      });
        				map.addInteraction(modify);
        				
        				//保存按钮的点击
        				$('#saveBtn').on('click',function() {
        					var currentfea = select.getFeatures().item(0);
        		        	var coor = currentfea.getGeometry().getCoordinates(); //当前要素几何坐标
        					var geoCoor  = coor[0]; //起点终点一致
        					for (var i=0,l=geoCoor.length; i<l; i++){
        						geoCoor[i] = geoCoor[i].join(' '); //xy用空格分隔
        					}

        					//传参
        					$.ajax({
            	       			url: _$base + '/gis/map/addPolygon',
            	       			type: 'POST',
            	       			data: {'fenceid':fenceid,'polygon':geoCoor.join(',')},
            	       			success: function(rs){
            	       				if(rs.code == "FAIL"){
            	                   		$.messager.alert('Tips',rs.msg);
            	                   	}else{
            	                   		$.messager.alert('Tips',rs.msg);
            	                   	}
            	       			},
            	       			error: true     
            			    });														
        				});
        				//取消按钮点击
        				$('#saveBtn').linkbutton({
        			        onClick: function() {
        			        	olkit.fenceSource.clear(); //清除围栏要素
        			        	map.removeInteraction(modify); //删除编辑
        			        	map.removeInteraction(select); //删除选择
        			        	window.history.go(-1);
        			        }
        				});
           		    }
                });
            }else{
            	window.history.go(-1);
            }
    	});
    	
    }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值