OpenLayers 3-4-5,提取用户绘制几何的坐标
OpenLayer 3-4-5, extract coordinates of user drawned geometry
我正在研究在我的地图中绘制的可能性。
我实现了集成绘图元素(点、线、多边形等),并提取绘制元素的坐标。
我的工作地图非常复杂,有很多其他功能和模块。这就是为什么我在这里工作以解决我在 OL4 示例上的问题。
我测试的最终结果是显示用户绘制的元素的坐标,并将它们存储在 PHP 中,在我的 GDB 中。
我有几个问题:
- 多边形和折线的坐标不考虑 2 个第一个节点
- 控制台和 html 中显示了 2 个以上的节点,但坐标错误,即使我尝试重新投影它们也是如此
我取得了什么:
- 在我绘制的事件上打开监听器
- 在我的地图上显示绘制的元素
- 提取日志中点的坐标并html显示(使用document.getElementById('point').innerHTML)
这是我的完整代码:
var raster = new ol.layer.Tile({
source: new ol.source.OSM()
});
var projection = ol.proj.get('EPSG:3857');
var projection2 = ol.proj.get('EPSG:4326');
var source = new ol.source.Vector({wrapX: false});
var vector = new ol.layer.Vector({
source: source
});
var map = new ol.Map({
layers: [raster, vector],
target: 'map',
view: new ol.View({
center: [-11000000, 4600000],
zoom: 4,
projection: projection
})
});
var typeSelect = document.getElementById('type');
var draw; // global so we can remove it later
function addInteraction() {
var value = typeSelect.value;
if (value !== 'None') {
draw = new ol.interaction.Draw({
source: source,
type: typeSelect.value
});
map.addInteraction(draw);
draw.on('drawend', function(evt){
new ol.proj.transform(draw, projection, projection2);
var feature = evt.feature;
var p = feature.getGeometry();
console.log(new ol.proj.transform(p.getCoordinates(), projection, projection2));
document.getElementById('point').innerHTML = new ol.proj.transform(p.getCoordinates(), projection, projection2);
});
}
}
/**
* Handle change event.
*/
typeSelect.onchange = function() {
map.removeInteraction(draw);
addInteraction();
};
addInteraction();
这是我的问题所在:
draw.on('drawend', function(evt){
new ol.proj.transform(draw, projection, projection2);
var feature = evt.feature;
var p = feature.getGeometry();
console.log(new ol.proj.transform(p.getCoordinates(), projection, projection2));
document.getElementById('point').innerHTML = new ol.proj.transform(p.getCoordinates(), projection, projection2);
});
帮助非常可观。
最佳
ol.proj.transform
仅适用于单个坐标对,不是构造函数,因此不需要 new
。如果您转换几何体的副本(克隆),您将获得预期的坐标。
var p = feature.getGeometry().clone().transform(projection, projection2);
console.log(p.getCoordinates());
我正在研究在我的地图中绘制的可能性。 我实现了集成绘图元素(点、线、多边形等),并提取绘制元素的坐标。 我的工作地图非常复杂,有很多其他功能和模块。这就是为什么我在这里工作以解决我在 OL4 示例上的问题。 我测试的最终结果是显示用户绘制的元素的坐标,并将它们存储在 PHP 中,在我的 GDB 中。
我有几个问题:
- 多边形和折线的坐标不考虑 2 个第一个节点
- 控制台和 html 中显示了 2 个以上的节点,但坐标错误,即使我尝试重新投影它们也是如此
我取得了什么:
- 在我绘制的事件上打开监听器
- 在我的地图上显示绘制的元素
- 提取日志中点的坐标并html显示(使用document.getElementById('point').innerHTML)
这是我的完整代码:
var raster = new ol.layer.Tile({
source: new ol.source.OSM()
});
var projection = ol.proj.get('EPSG:3857');
var projection2 = ol.proj.get('EPSG:4326');
var source = new ol.source.Vector({wrapX: false});
var vector = new ol.layer.Vector({
source: source
});
var map = new ol.Map({
layers: [raster, vector],
target: 'map',
view: new ol.View({
center: [-11000000, 4600000],
zoom: 4,
projection: projection
})
});
var typeSelect = document.getElementById('type');
var draw; // global so we can remove it later
function addInteraction() {
var value = typeSelect.value;
if (value !== 'None') {
draw = new ol.interaction.Draw({
source: source,
type: typeSelect.value
});
map.addInteraction(draw);
draw.on('drawend', function(evt){
new ol.proj.transform(draw, projection, projection2);
var feature = evt.feature;
var p = feature.getGeometry();
console.log(new ol.proj.transform(p.getCoordinates(), projection, projection2));
document.getElementById('point').innerHTML = new ol.proj.transform(p.getCoordinates(), projection, projection2);
});
}
}
/**
* Handle change event.
*/
typeSelect.onchange = function() {
map.removeInteraction(draw);
addInteraction();
};
addInteraction();
这是我的问题所在:
draw.on('drawend', function(evt){
new ol.proj.transform(draw, projection, projection2);
var feature = evt.feature;
var p = feature.getGeometry();
console.log(new ol.proj.transform(p.getCoordinates(), projection, projection2));
document.getElementById('point').innerHTML = new ol.proj.transform(p.getCoordinates(), projection, projection2);
});
帮助非常可观。 最佳
ol.proj.transform
仅适用于单个坐标对,不是构造函数,因此不需要 new
。如果您转换几何体的副本(克隆),您将获得预期的坐标。
var p = feature.getGeometry().clone().transform(projection, projection2);
console.log(p.getCoordinates());