2016-10-01 52 views
1

我是OL的newbee。我只需要在地圖上放一些點,理想情況下提出一些關於將這一點寫入db的信息的請求,但現在我只想提醒(coords)。所以,我找到了一個例子,我可以在地圖上放一些點,線和多邊形。Openlayers 3 Coords

var raster = new ol.layer.Tile({ 
 
    source: new ol.source.OSM() 
 
    }); 
 

 
    var map = new ol.Map({ 
 
    layers: [raster], 
 
    target: 'map', 
 
    view: new ol.View({ 
 
     center: [-11000000, 4600000], 
 
     zoom: 4 
 
    }) 
 
    }); 
 

 
    var features = new ol.Collection(); 
 
    var featureOverlay = new ol.layer.Vector({ 
 
    source: new ol.source.Vector({features: features}), 
 
    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' 
 
     }) 
 
     }) 
 
    }) 
 
    }); 
 
    featureOverlay.setMap(map); 
 

 
    var modify = new ol.interaction.Modify({ 
 
    features: features, 
 
    // the SHIFT key must be pressed to delete vertices, so 
 
    // that new vertices can be drawn at the same position 
 
    // of existing vertices 
 
    deleteCondition: function(event) { 
 
     //var feature = event.element; 
 
     //var coord = event.feature.getGeometry().getCoordinates(); 
 
     //coord = ol.proj.transform(coord, 'EPSG:3857', 'EPSG:4326'); 
 
     // alert(coord); 
 
     return ol.events.condition.shiftKeyOnly(event) && 
 
      ol.events.condition.singleClick(event); 
 
    } 
 
    }); 
 
    map.addInteraction(modify); 
 

 
    var draw; // global so we can remove it later 
 
    var typeSelect = document.getElementById('type'); 
 

 
    function addInteraction() { 
 

 
    draw = new ol.interaction.Draw({ 
 
     features: features, 
 
     type: /** @type {ol.geom.GeometryType} */ (typeSelect.value) 
 
    /*draw.on('drawend', function (event) { 
 
     // get the feature 
 
     var feature = event.element; 
 
     var coord = event.feature.getGeometry().getCoordinates(); 
 
     alert(coord);*/ 
 
    }); 
 

 

 
    map.addInteraction(draw); 
 
    } 
 

 

 
    /** 
 
    * Handle change event. 
 
    */ 
 
    typeSelect.onchange = function() { 
 
    map.removeInteraction(draw); 
 
    addInteraction(); 
 
    }; 
 

 
    addInteraction(); 
 
// Code of adding to DB our features 
 

 
    //
<?php 
 
/* @var $this yii\web\View */ 
 
use yii\helpers\Html; 
 
use sibilino\yii2\openlayers\ol; 
 
use sibilino\yii2\openlayers\OpenLayers; 
 
?> 
 
<!DOCTYPE html> 
 
<html> 
 
<head> 
 
    <title>Draw and Modify Features</title> 
 
    <link rel="stylesheet" href="http://openlayers.org/en/v3.18.2/css/ol.css" type="text/css"> 
 
    <!-- The line below is only needed for old environments like Internet Explorer and Android 4.x --> 
 
    <script src="http://cdn.polyfill.io/v2/polyfill.min.js?features=requestAnimationFrame,Element.prototype.classList,URL"></script> 
 
    <script src="http://openlayers.org/en/v3.18.2/build/ol.js"></script> 
 
</head> 
 
<body> 
 
<div id="map" class="map"></div> 
 
<form class="form-inline"> 
 
    <label>Geometry type &nbsp;</label> 
 
    <select id="type"> 
 
    <option value="Point">Point</option> 
 
    <option value="LineString">LineString</option> 
 
    <option value="Polygon">Polygon</option> 
 
    </select> 
 
</form> 
 
<script> 
 
</script> 
 
</body> 
 
</html>

它與所有的庫工作正常,我可以把點,線和polygones地圖,但我不能獲得積分,這是我放的座標。我試圖創建一些監聽器,它的評論在這段代碼,看起來像

//var feature = event.element; 
    //var coord = event.feature.getGeometry().getCoordinates(); 
    //coord = ol.proj.transform(coord, 'EPSG:3857', 'EPSG:4326'); 
    // alert(coord); 

但我瞭解這個方法監聽鼠標移動過了,我得到了一些錯誤,如:

Uncaught TypeError: Cannot read property 'getGeometry' of undefined 

如果有人有時間閱讀這個長長的問題,我能做些什麼,以及如何正確地獲取我的座標並將其保存到數據庫?

+0

嘗試'feature.getGeometry()。getCoordinates()'而不是'event.feature.getGeometry()。getCoordinates()'。 – ahocevar

+0

你知道如何將這個點加載到地圖上,或者我需要提出一個新的問題嗎? =) –

回答

0

我只需要編校驗證碼:

function addInteraction() { 

draw = new ol.interaction.Draw({ 
    features: features, 
    type: /** @type {ol.geom.GeometryType} */ (typeSelect.value) 
/*draw.on('drawend', function (event) { 
    // get the feature 
    var feature = event.element; 
    var coord = event.feature.getGeometry().getCoordinates(); 
    alert(coord);*/ 
}); 


map.addInteraction(draw); 

}

要:

function addInteraction() { 

draw = new ol.interaction.Draw({ 
    features: features, 
    type: /** @type {ol.geom.GeometryType} */ (typeSelect.value) 

}); 

// Code of adding to DB our features 

draw.on('drawend', function (event) { 
    var feature = event.element; 
    var coord = event.feature.getGeometry().getCoordinates(); 
alert(coord); 

    var title=document.getElementById('type'); 

    var url = "http://localhost/basic/web/index.php?r=sggis/create&title="+title.value+"&point="+coord; 
    function lol(){ 
    var xhr = new XMLHttpRequest(); 
    xhr.open("GET", url, false); 
    xhr.send(); 
    } 
    lol(); 
}); 

而且在yii2控制器我已經寫了剛剛獲得冠軍和COORDS只是從操作請求。這是不安全的,但是我會修改這個。 總之,我放在地圖上的每一個點,線或多邊形都將它們的座標保存到postgresSQL的數據庫中。