[英]How to add marker by method, openlayers 4, angular 4
I want to add live position markers in my map. 我想在地图中添加实时位置标记。
As first step i just want to show one static point (lat, lon) or marker in my map, definded by the addMarker method in my code. 作为第一步,我只想在我的地图中显示一个静态点(lat,lon)或标记,由我的代码中的addMarker方法定义。
Here is my code: 这是我的代码:
import {Component, OnInit, AfterViewInit, ViewEncapsulation, Input, ElementRef, ViewChilds} from '@angular/core';
import { WmslayerService} from './wmslayer.service';
import { MapService} from './map.service';
import {AddwmslayerService} from '../../menue/addlayer/formlayer/addwmslayer.service';
import * as ol from 'openlayers';
@Component({
selector: 'olmap',
encapsulation: ViewEncapsulation.None,
templateUrl: './map.component.html',
styleUrls: ['./map.component.css']
})
export class MapComponent implements OnInit, AfterViewInit {
iconFeatures = [];
layername: string;
layerurl: string;
mapId2: string;
mapIndex: number;
layerName: string;
layer = [];
layers = [];
constructor(private mapService: MapService, private wmslayerService: WmslayerService,
private addLayerService: AddwmslayerService, private tempdatagiaService: TempdatagiaService,
private geomqttService: GeomqttService) {}
ngAfterViewInit() {
setTimeout (() => {
let map = new ol.Map({
target: this.mapId2,
layers: [
new ol.layer.Tile({
source: new ol.source.OSM(),
}),
//vector
],
view: new ol.View({
center: ol.proj.fromLonLat([6.661594, 50.433237]),
zoom: 3,
})
});
//// for loop, to add some layer
for (let layer of this.wmslayerService.layer) {
console.log(layer);
let examplelayer = new ol.layer.Tile({
source: new ol.source.TileWMS({
url: layer.layerurl,
params: {
'LAYERS': layer.layername,
'TILED': true
},
projection: 'EPSG:4326',
serverType: 'geoserver'
})
});
this.layers.push(examplelayer);
map.addLayer(examplelayer);
}
this.mapIndex = this.mapService.addMap(map);
this.layername = this.layerName;
console.log(this.mapIndex);
},300)}
// -- addlayer dynamicly--
addNewLayer(url: string, name: string) {
console.log(name);
let addedlayer = new ol.layer.Tile({
source: new ol.source.TileWMS({
url: url,
params: {
'LAYERS': name,
'TILED': true
},
projection: 'EPSG:4326'
})
});
this.layers.push(addedlayer);
this.mapService.getMap(this.mapIndex).addLayer(addedlayer);
}
addMarker(lon: string, lat: string) {
console.log(lat);
console.log(lon);
var iconFeatures = [];
var iconFeature = new ol.Feature({
geometry: new ol.geom.Point(ol.proj.transform([lon, lat], 'EPSG:4326',
'EPSG:3857')),
name: 'Null Island',
population: 4000,
rainfall: 500
});
iconFeatures.push(iconFeature);
var vectorSource = new ol.source.Vector({
features: iconFeatures //add an array of features
});
var iconStyle = new ol.style.Style({
image: new ol.style.Icon(/** @type {olx.style.IconOptions} */ ({
anchor: [0.5, 46],
anchorXUnits: 'fraction',
anchorYUnits: 'pixels',
opacity: 0.75,
src: 'https://openlayers.org/en/v4.6.4/examples/data/icon.png'
}))
});
var vectorLayer = new ol.layer.Vector({
source: vectorSource,
style: iconStyle
});
map.addLayer(vectorLayer);
}
}
The last line map.addLayer(vectorLayer);
最后一行map.addLayer(vectorLayer);
is not working. 不管用。
The addMarker method will be triggered by a click event. addMarker方法将由click事件触发。
How could i get the method working? 我怎么能让方法工作?
Has someone a better idea or a stable solution to show live datapoints in an openlayers 4 map? 有人有更好的想法或稳定的解决方案,以显示openlayers 4地图中的实时数据点?
You do not need to create a new layer every time you want to show an additional marker. 每次要显示其他标记时,无需创建新图层。 It's usually easier to create a single "marker layer" and just add features to it's source. 创建单个“标记图层”通常更容易,只需向其源添加功能。 All you need is keeping a reference to the layer's source and call addFeature
on it. 您所需要的只是保持对图层源的引用并在其上调用addFeature
。
Coordinates are not strings, but decimals: addMarker(lon: decimal, lat: decimal)
坐标不是字符串,而是小数: addMarker(lon: decimal, lat: decimal)
const markerSource = new ol.source.Vector(); var markerStyle = new ol.style.Style({ image: new ol.style.Icon(/** @type {olx.style.IconOptions} */ ({ anchor: [0.5, 46], anchorXUnits: 'fraction', anchorYUnits: 'pixels', opacity: 0.75, src: 'https://openlayers.org/en/v4.6.4/examples/data/icon.png' })) }); let map = new ol.Map({ target: 'map', layers: [ new ol.layer.Tile({ source: new ol.source.OSM(), }), new ol.layer.Vector({ source: markerSource, style: markerStyle, }), ], view: new ol.View({ center: ol.proj.fromLonLat([6.661594, 50.433237]), zoom: 3, }) }); function addMarker(lon, lat) { console.log('lon:', lon); console.log('lat:', lat); var iconFeatures = []; var iconFeature = new ol.Feature({ geometry: new ol.geom.Point(ol.proj.transform([lon, lat], 'EPSG:4326', 'EPSG:3857')), name: 'Null Island', population: 4000, rainfall: 500 }); markerSource.addFeature(iconFeature); } map.on('singleclick',function(event){ var lonLat = ol.proj.toLonLat(event.coordinate); addMarker(lonLat[0], lonLat[1]); });
#map { /* just for testing purposes */ width: 100%; min-width: 240px; max-width: 500px; height: 200px; }
<link href="https://openlayers.org/en/v4.6.4/css/ol.css" rel="stylesheet"/> <script src="https://openlayers.org/en/v4.6.4/build/ol-debug.js"></script> <button onclick="addMarker(8.54, 47.37)">add marker at 8.54, 47.37</button> <div id="map"></div>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.