Openlayers在線編輯

在BS端可能有這樣的需求——對發(fā)布的地圖進(jìn)行修改(例如行政邊界變化锋爪、路網(wǎng)變化副硅、建筑物的變化)梗摇。樣就必須對發(fā)布的地圖數(shù)據(jù)進(jìn)行重新修改,重新發(fā)布想许。這樣太麻煩且不方便伶授。

Openlayers提供對WFS數(shù)據(jù)進(jìn)行修改的方法

在Openlayers中提供了ol.interaction方法對矢量瓦片進(jìn)行修改。對于矢量服務(wù)流纹,主要用于feature選中(點(diǎn)擊糜烹、鼠標(biāo)懸浮等),做出相應(yīng)的操作漱凝,例如高亮顯示什么的疮蹦,改變渲染樣式∪壮矗看一下其中的方法:

(節(jié)選翻譯)Interaction for selecting vector features. By default, selected features are styled differently, so this interaction can be used for visual highlighting, as well as selecting features for other actions, such as modification or output. There are three ways of controlling which features are selected: using the browser event as defined by the condition and optionally the toggle, add/remove, and multi options; a layers filter; and a further feature filter using the filter option.
交互操作是為了選擇適量要素愕乎。默認(rèn)情況下,被選擇要素的樣式顯示會不同壁公,所以這種交互操作可以用于可視化高亮顯示感论,以及為其他操作(如修改或輸出)選擇特性。這里有三種方法控制選擇哪些要素:使用瀏覽器事件作為條件以及可選的切換紊册、添加/刪除和多個(gè)選項(xiàng)比肄。選擇更多的要素去操作。

  • ol.interaction.Modify
    interaction.Modify方法

    ol.interaction.Modify提供對矢量要素的修改方法。

實(shí)現(xiàn)思路

(一)因?yàn)槭菍?shí)現(xiàn)在線編輯芳绩,不是用GeoJSON數(shù)據(jù)掀亥。在PostGIS將自己的數(shù)據(jù)進(jìn)行發(fā)布。發(fā)布的格式是WFS的矢量格式的地圖服務(wù)妥色;
(二)記錄發(fā)布的工作區(qū)的URL地址和名稱(這個(gè)兩個(gè)參數(shù)尤為重要搪花,保證了數(shù)據(jù)修改提交是否成功):


工作區(qū)的地址和名稱

(三)編寫代碼進(jìn)行修改和編輯。

代碼思路

(一)使用Openlayers方法進(jìn)行加載發(fā)布的矢量圖層嘹害;
(二)使用interaction方法選擇撮竿、修改矢量要素;

//選擇要素
var selectInteraction=new ol.interaction.Select({
        style:new ol.style.Style({
            stroke:new ol.style.Stroke({
                color: 'red',
                width: 2
            })
        })
    });
//修改要素
    var modifyInteraction = new ol.interaction.Modify({
        style:new ol.style.Style({
            stroke:new ol.style.Stroke({
                color: 'black',
                width: 2
            })
        }),
        features: selectInteraction.getFeatures()
    });

(三)對修改的要素提交到GeoServer進(jìn)行保存吼拥,相當(dāng)于重新發(fā)布(實(shí)質(zhì)是通過XML進(jìn)行數(shù)據(jù)的重新提交)

 function queryWfs() {
        // 支持重新查詢
        if (wfsVectorLayer) {
            map.removeLayer(wfsVectorLayer);
        }

        // 創(chuàng)建新的圖層來加載wfs的要素
        wfsVectorLayer = new ol.layer.Vector({
            source: new ol.source.Vector({
                format: new ol.format.GeoJSON({
                    geometryName: 'geom' // 將shp格式矢量文件導(dǎo)入PostgreGIS數(shù)據(jù)庫中,對應(yīng)的表中增加了一個(gè)字段名為geom的字段线衫,所有這里的名稱就是數(shù)據(jù)庫表中增加的那個(gè)字段名稱
                }),                                                                                              //PostgreGIS:xian_polygon為工作空間:圖層名
         
                url:''//圖層地址
          }),
            style: function(feature, resolution) {
                return new ol.style.Style({
                    stroke: new ol.style.Stroke({
                        color: 'blue',
                        width:2
                    })
                });
            }
        });
        map.addLayer(wfsVectorLayer);
    }

// 保存已經(jīng)編輯的要素
    function onSave() {
        if (modifiedFeatures && modifiedFeatures.getLength() > 0) {

            // 轉(zhuǎn)換坐標(biāo)
            var modifiedFeature = modifiedFeatures.item(0).clone();
            // 注意ID是必須凿可,通過ID才能找到對應(yīng)修改的feature
            modifiedFeature.setId(modifiedFeatures.item(0).getId());
            // 調(diào)換經(jīng)緯度坐標(biāo),以符合wfs協(xié)議中經(jīng)緯度的位置
            modifiedFeature.getGeometry().applyTransform(function(flatCoordinates, flatCoordinates2, stride) {
                for (var j = 0; j < flatCoordinates.length; j += stride) {
                    var y = flatCoordinates[j];
                    var x = flatCoordinates[j + 1];
                    flatCoordinates[j] = x;
                    flatCoordinates[j + 1] = y;
                }
            });
            modifyWfs([modifiedFeature]);
        }
    }

    // 把修改提交到服務(wù)器端
    function modifyWfs(features) {
    
        var WFSTSerializer = new ol.format.WFS();
        var featObject = WFSTSerializer.writeTransaction(null,
            features, null, {
                featureType: '',  //圖層名
                featureNS: '',  // 注意這個(gè)值必須為創(chuàng)建工作區(qū)時(shí)的命名空間URI
                srsName: 'EPSG:4326'
            });
        // 轉(zhuǎn)換為xml內(nèi)容發(fā)送到服務(wù)器端
        var serializer = new XMLSerializer();
        var featString = serializer.serializeToString(featObject);
        var request = new XMLHttpRequest();
        request.open('POST', '');//URL地址
        // 指定內(nèi)容為xml類型
        request.setRequestHeader('Content-Type', 'text/xml');
        request.send(featString);
    }
// 在服務(wù)器端刪除feature
    function deleteWfs(features) {
      var WFSTSerializer = new ol.format.WFS();
      var featObject = WFSTSerializer.writeTransaction(null,
        null, features, {
          featureType: '',  //圖層名
                featureNS: '',  // 注意這個(gè)值必須為創(chuàng)建工作區(qū)時(shí)的命名空間URI
                srsName: 'EPSG:4326'
        });
      var serializer = new XMLSerializer();
      var featString = serializer.serializeToString(featObject);
      var request = new XMLHttpRequest();
      request.open('POST', '');
      request.setRequestHeader('Content-Type', 'text/xml');
      request.send(featString);
    }

最后即可完成在BS端完成矢量要素的在線編輯操作授账。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末枯跑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子白热,更是在濱河造成了極大的恐慌敛助,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屋确,死亡現(xiàn)場離奇詭異纳击,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)攻臀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門焕数,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人刨啸,你說我怎么就攤上這事堡赔。” “怎么了设联?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵善已,是天一觀的道長。 經(jīng)常有香客問我离例,道長换团,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任宫蛆,我火速辦了婚禮啥寇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己辑甜,他們只是感情好衰絮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著磷醋,像睡著了一般猫牡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上邓线,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天淌友,我揣著相機(jī)與錄音,去河邊找鬼骇陈。 笑死震庭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的你雌。 我是一名探鬼主播器联,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼婿崭!你這毒婦竟也來了拨拓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤氓栈,失蹤者是張志新(化名)和其女友劉穎渣磷,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體授瘦,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡醋界,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了提完。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片物独。...
    茶點(diǎn)故事閱讀 39,731評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖氯葬,靈堂內(nèi)的尸體忽然破棺而出挡篓,到底是詐尸還是另有隱情,我是刑警寧澤帚称,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布官研,位于F島的核電站,受9級特大地震影響闯睹,放射性物質(zhì)發(fā)生泄漏戏羽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一楼吃、第九天 我趴在偏房一處隱蔽的房頂上張望始花。 院中可真熱鬧妄讯,春花似錦、人聲如沸酷宵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浇垦。三九已至炕置,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間男韧,已是汗流浹背朴摊。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留此虑,地道東北人甚纲。 一個(gè)月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像朦前,于是被迫代替她去往敵國和親介杆。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Samples 通過EPSG.io搜索進(jìn)行二次投影 視圖(View)動(dòng)畫 使用動(dòng)態(tài) ArcGIS REST Map...
    changhr2013閱讀 15,342評論 0 8
  • OGC——Open Geospatial Consortium——開放地理信息聯(lián)盟况既,是一個(gè)非盈利的志愿的國際標(biāo)準(zhǔn)化...
    fangxu622閱讀 2,309評論 0 3
  • source 是 Layer 的重要組成部分这溅,表示圖層的來源组民,也就是服務(wù)地址棒仍。除了在構(gòu)造函數(shù)中指定外,還可以使用 ...
    changhr2013閱讀 10,357評論 1 1
  • 樂活的狀態(tài) 乍之一聽臭胜,好似一種優(yōu)酸乳莫其,其實(shí)我們一直所要尋找的生活態(tài)度也無非如此。 不知不覺已到了而立之年耸三,然而在他...
    最憶韭菜盒子閱讀 116評論 0 0
  • 連翹12g浙貝母10g胖大海二枚乱陡,羅漢果20g甘草5g蘆根25g制何首烏12g韭菜子10g一劑 連翹12g浙貝母1...
    KG5閱讀 136評論 0 0