1. 程式人生 > >OpenLayer學習之繪圖與線上編輯

OpenLayer學習之繪圖與線上編輯

有時候找到真正想要的真的很難,凡事豈能兩全,唉,你又能如何確定那個選擇才是對的。開車開車,今天寫的是將繪製幾何圖形和修改幾何圖形綜合的一塊。主要用到的是ol.interaction.Draw、ol.interaction.Select、ol.interaction.Modify三個互動。

一、繪圖函式封裝

function Draw() {
               var value = $("#type option:selected").val();
               draw = new ol.interaction.Draw({
                   source: sourceVector,
                   type: value,
                   wrapX: false,
                   active: false,
                   style: new ol.style.Style({
                       fill: new ol.style.Fill({
                           color: 'rgba(255, 255, 255, 0.2)'
                       }),
                       stroke: new ol.style.Stroke({
                           color: '#ffcc33',
                           width: 2
                       }),
                       image: new ol.style.Circle({
                           radius: 7,
                           fill: new ol.style.Fill({
                               color: '#ffcc33'
                           })
                       })
                   })
               });
               draw.setActive(result);
               map.addInteraction(draw);
           }

二、Select和Modify互動封裝初始化

 function init() {
               //初始化一個互動選擇控制元件,並新增到地圖容器中
               select = new ol.interaction.Select();
               map.addInteraction(select);
               //初始化一個互動編輯控制元件,並新增到地圖容器中
               modify = new ol.interaction.Modify({
                   features: select.getFeatures()//選中的要素
               });
               map.addInteraction(modify);
               //設定幾何圖形變更的處理
               setEvents(select);
           };

三、feature選中處理

           function setEvents(select) {
               var selectedFeatures = select.getFeatures(); //選中的要素
               //新增選中要素變更事件
               select.on('change:active', function () {
                   selectedFeatures.forEach(selectedFeatures.remove, selectedFeatures);
               });
           };

這個函式算是稍微有點難

四、全部原始碼

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>繪圖和修改</title>
</head>
<link href="Script/ol.css" rel="stylesheet" />
<script src="Script/ol.js"></script>
<script src="../Scripts/jquery-1.7.1.js"></script>
 
<body>
    <select id="type">
        <option value="Point">Point</option>
        <option value="LineString">LineString</option>
        <option value="Polygon">Polygon</option>
        <option value="Circle">Circle</option>
    </select>
    <input type="button" id="draw" name="name" value="繪圖" />
    <input type="button" id="modify" name="name" value="修改" />
    <div id="map"></div>
       <script>
           //變數
           var select;
           var modify;
           var draw;
           var typeSelect = $("#type");
           var result = false;
           //var featureArray = new ol.Collection();
           var sourceTile = new ol.source.OSM();
           var layerTile = new ol.layer.Tile({
               source: sourceTile
           });
           var sourceVector = new ol.source.Vector();
           var layerVector = new ol.layer.Vector({
               source: sourceVector,
           });

           //map函式
           var map = new ol.Map({
               layers: [layerTile],
               view: new ol.View({
                   // 設定成都為地圖中心,此處進行座標轉換, 把EPSG:4326的座標,轉換為EPSG:3857座標,因為ol預設使用的是EPSG:3857座標
                   center: ol.proj.transform([104.06, 30.67], 'EPSG:4326', 'EPSG:3857'),
                   zoom: 8
               }),
               target: 'map'
           });
           map.addLayer(layerVector);

           //繪圖控制元件
           function Draw() {
               var value = $("#type option:selected").val();
               draw = new ol.interaction.Draw({
                   source: sourceVector,
                   type: value,
                   wrapX: false,
                   active: false,
                   style: new ol.style.Style({
                       fill: new ol.style.Fill({
                           color: 'rgba(255, 255, 255, 0.2)'
                       }),
                       stroke: new ol.style.Stroke({
                           color: '#ffcc33',
                           width: 2
                       }),
                       image: new ol.style.Circle({
                           radius: 7,
                           fill: new ol.style.Fill({
                               color: '#ffcc33'
                           })
                       })
                   })
               });
               draw.setActive(result);
               map.addInteraction(draw);
           }
           //初始化控制元件
           function init() {
               //初始化一個互動選擇控制元件,並新增到地圖容器中
               select = new ol.interaction.Select();
               map.addInteraction(select);
               //初始化一個互動編輯控制元件,並新增到地圖容器中
               modify = new ol.interaction.Modify({
                   features: select.getFeatures()//選中的要素
               });
               map.addInteraction(modify);
               //設定幾何圖形變更的處理
               setEvents(select);
           };
           //設定啟用變更處理
           function setEvents(select) {
               var selectedFeatures = select.getFeatures(); //選中的要素
               //新增選中要素變更事件
               select.on('change:active', function () {
                   selectedFeatures.forEach(selectedFeatures.remove, selectedFeatures);
               });
           };
           init();
           //啟用選擇控制元件
           function setActive(active, select, modify) {
               select.setActive(active);//啟用選擇要素控制元件
               modify.setActive(active);//啟用修改要素控制元件
           };
           //下拉框改變事件
           typeSelect.change(function () {
               map.removeInteraction(draw);
               Draw();
           });
           //繪圖工具初始化
           Draw();
           //禁用修改控制元件
           setActive(false,select, modify);
           $("#draw").click(function () {
               result = true;               
               Draw();
               setActive(false, select, modify);
           });
           $("#modify").click(function () {
               result = false;
             //初始化幾何圖形修改控制元件
               setActive(true, select, modify); //啟用幾何圖形修改控制元件;
               map.removeInteraction(draw);
           });
    </script>
</body>
</html>

說好的進行封裝呢,又特麼整一坨了,全部原始碼主要事件有點繞,整體的思路:當頁面初始化的時候,繪圖、修改、選中都是禁用狀態,當點選繪圖按鈕,繪圖可用,修改,選中禁用,重新載入Draw函式,當選擇修改時,修改、選中互動可用,繪圖移除(當然也可以禁用),這裡我沒有寫完整,其實應該先判斷sourceVector的feature是否為空,再進行是否啟用修改、選擇互動互,我感覺寫的有點亂不要噴我,再次基礎上可以進行再次封裝。

五、效果圖


六、總結

功能很簡單,就是中間把source單詞給寫錯了一直載入不出來,浪費了很多的時間