我正在使用openlayers 5.3显示带有GPX轨道的地图。 OL中的跟踪点默认为MultiLineString几何类型。 GPX-example有一个gpx文件,其大小是两倍,因为所有<trkpt>
标签都被复制为<rtept>
标签。 Routepoints在OL中获得Point几何类型。
现在我想添加一个显示trkpt作为Point类型的图层,并创建弹出窗口,在我的“常规”gpx文件中显示<ele>
标签内的<time>
和<trkpt>
标签的值。
是否有快速和/或肮脏的解决方案来说服OL将我的跟踪点视为路由点,以便我可以将它们用作Point类型并从源中读取<ele>
和<time>
功能?或者是完成此操作所需的其他操作,如果是这样,我的选择是什么?
任何帮助非常感谢!
您可以从线串中的坐标创建点
var map = new ol.Map({
target: "map",
layers: [
new ol.layer.Tile({
source: new ol.source.OSM()
})
],
view: new ol.View({
center: ol.proj.fromLonLat([1.3313627, 52.1062152]),
zoom: 15
})
});
var displayFeatureInfo = function(pixel) {
var features = [];
map.forEachFeatureAtPixel(pixel, function(feature) {
features.push(feature);
}, {
layerFilter: function(candidate) { return candidate === gpxPointLayer; }
});
if (features.length > 0) {
var info = [];
var i, ii;
for (i = 0, ii = features.length; i < ii; ++i) {
// display lat, lon, ele and time from the point coordinates
var coordinates = features[i].getGeometry().getCoordinates();
var ll = ol.proj.toLonLat(coordinates.slice(0,2));
var d = new Date();
d.setTime(coordinates[3]*1000);
var llet = ll[1].toFixed(7) + ', ' + ll[0].toFixed(7) + ', ' + coordinates[2] + 'm, ' + d.toUTCString();
info.push(llet);
}
document.getElementById('info').innerHTML = info.join('<br>') || '(unknown)';
map.getTargetElement().style.cursor = 'pointer';
} else {
document.getElementById('info').innerHTML = ' ';
map.getTargetElement().style.cursor = '';
}
};
var gpxPointLayer = new ol.layer.Vector({
source: new ol.source.Vector(),
style: new ol.style.Style({
image: new ol.style.Circle({
fill: new ol.style.Fill({color: 'red'}),
radius: 4
})
})
});
gpxTrackVector = new ol.source.Vector({
url: 'https://www.mikenunn.net/data/melton2bawdsey.gpx',
format: new ol.format.GPX()
});
function addPoints(linestring) {
linestring.getCoordinates().forEach(function(coordinates) {
gpxPointLayer.getSource().addFeature(new ol.Feature(new ol.geom.Point(coordinates)));
});
}
gpxTrackVector.on('addfeature', function(evt){
// create point features from GPX linestring coordinates
if (evt.feature.getGeometry().getType() == 'LineString') {
addPoints(evt.feature.getGeometry());
} else if (evt.feature.getGeometry().getType() == 'MultiLineString') {
evt.feature.getGeometry().getLineStrings().forEach(function(linestring){
addPoints(linestring);
});
}
});
var gpxTrackLayer = new ol.layer.Vector({
source: gpxTrackVector,
style: new ol.style.Style({
stroke: new ol.style.Stroke({
color: 'black',
width: 4
}),
image: new ol.style.Circle({
fill: new ol.style.Fill({color: 'green'}),
radius: 6
})
})
});
map.addLayer(gpxTrackLayer);
map.addLayer(gpxPointLayer);
map.on('pointermove', function(evt) {
if (evt.dragging) {
return;
}
var pixel = map.getEventPixel(evt.originalEvent);
displayFeatureInfo(pixel);
});
html, body {
width: 100%;
height: 100%;
}
.map {
width: 100%;
height: 80%;
}
<link href="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.3.0/css/ol.css" rel="stylesheet" />
<script src="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.3.0/build/ol.js"></script>
<div id="map" class="map"></div>
<div id="info"> </div>